]> Nutra Git (v2) - gamesguru/feather.git/commitdiff
AddressBook: cleanup
authortobtoht <tob@featherwallet.org>
Fri, 7 Mar 2025 18:23:00 +0000 (19:23 +0100)
committertobtoht <tob@featherwallet.org>
Tue, 11 Mar 2025 14:21:09 +0000 (15:21 +0100)
src/ContactsWidget.cpp
src/libwalletqt/AddressBook.cpp
src/libwalletqt/AddressBook.h
src/libwalletqt/Wallet.cpp
src/libwalletqt/rows/ContactRow.cpp [deleted file]
src/libwalletqt/rows/ContactRow.h
src/model/AddressBookModel.cpp

index 7251766e5d84a5e146b2e379d608b941487c61df..0e74105725bfc0ebcbb6d2167bc9f37e6d92d6e0 100644 (file)
@@ -147,21 +147,18 @@ void ContactsWidget::newContact(QString address, QString name)
         std::swap(address, name);
     }
 
-    int num_addresses = m_wallet->addressBook()->count();
-    QString address_entry;
-    QString name_entry;
-    for (int i=0; i<num_addresses; i++) {
-        m_wallet->addressBook()->getRow(i, [&address_entry, &name_entry](const ContactRow &entry){
-            address_entry = entry.getAddress();
-            name_entry = entry.getLabel();
-        });
-
-        if (address == address_entry) {
+    auto& rows = m_wallet->addressBook()->getRows();
+    for (int i = 0; i < rows.size(); i++) {
+        const ContactRow& row = rows[i];
+
+        if (address == row.address) {
             Utils::showError(this, "Unable to add contact", "Address already exists in contacts", {}, "add_contact");
-            ui->contacts->setCurrentIndex(m_model->index(i,0)); // Highlight duplicate address
+            QModelIndex sourceIndex = m_model->index(i, 0);
+            ui->contacts->setCurrentIndex(m_proxyModel->mapFromSource(sourceIndex)); // Highlight duplicate address
             return;
         }
-        if (name == name_entry) {
+
+        if (name == row.label) {
             Utils::showError(this, "Unable to add contact", "Label already exists in contacts", {}, "add_contact");
             this->newContact(address, name);
             return;
index 8c2585f847a9a50c178298318a3f4d3fb399ed92..2d2ea204700846fdf15c35f5389a186b907b7000 100644 (file)
@@ -5,10 +5,10 @@
 
 #include <wallet/wallet2.h>
 
-AddressBook::AddressBook(Wallet *wallet, tools::wallet2 *wallet2, QObject *parent)
-     : QObject(parent)
-     , m_wallet(wallet)
-     , m_wallet2(wallet2)
+AddressBook::AddressBook(tools::wallet2 *wallet2, QObject *parent)
+    : QObject(parent)
+    , m_wallet2(wallet2)
+    , m_errorCode(Status_Ok)
 {
     this->refresh();
 }
@@ -29,37 +29,30 @@ void AddressBook::refresh()
 
     clearRows();
 
-    // Fetch from Wallet2 and create vector of AddressBookRow objects
-    std::vector<tools::wallet2::address_book_row> rows = m_wallet2->get_address_book();
-    for (qsizetype i = 0; i < rows.size(); ++i) {
-        tools::wallet2::address_book_row *row = &rows.at(i);
-
+    for (const auto &row : m_wallet2->get_address_book()) {
         std::string address;
-        if (row->m_has_payment_id)
-            address = cryptonote::get_account_integrated_address_as_str(m_wallet2->nettype(), row->m_address, row->m_payment_id);
+        if (row.m_has_payment_id)
+            address = cryptonote::get_account_integrated_address_as_str(m_wallet2->nettype(), row.m_address, row.m_payment_id);
         else
-            address = get_account_address_as_str(m_wallet2->nettype(), row->m_is_subaddress, row->m_address);
+            address = get_account_address_as_str(m_wallet2->nettype(), row.m_is_subaddress, row.m_address);
 
-        auto* abr = new ContactRow{this,
-                                   i,
-                                   QString::fromStdString(address),
-                                   QString::fromStdString(row->m_description)};
-        m_rows.push_back(abr);
+        m_rows.emplaceBack(QString::fromStdString(address), QString::fromStdString(row.m_description));
     }
 
-
     emit refreshFinished();
 }
 
-bool AddressBook::getRow(int index, std::function<void (ContactRow &)> callback) const
+const QList<ContactRow>& AddressBook::getRows()
 {
-    if (index < 0 || index >= m_rows.size())
-    {
-        return false;
-    }
+    return m_rows;
+}
 
-    callback(*m_rows.value(index));
-    return true;
+const ContactRow& AddressBook::getRow(const qsizetype i)
+{
+    if (i < 0 || i >= m_rows.size()) {
+        throw std::out_of_range("Index out of range");
+    }
+    return m_rows[i];
 }
 
 bool AddressBook::addRow(const QString &address, const QString &description)
@@ -73,7 +66,7 @@ bool AddressBook::addRow(const QString &address, const QString &description)
         return false;
     }
 
-    bool r =  m_wallet2->add_address_book_row(info.address, info.has_payment_id ? &info.payment_id : nullptr, description.toStdString(), info.is_subaddress);
+    bool r = m_wallet2->add_address_book_row(info.address, info.has_payment_id ? &info.payment_id : nullptr, description.toStdString(), info.is_subaddress);
     if (r)
         refresh();
     else
@@ -91,7 +84,7 @@ bool AddressBook::setDescription(int index, const QString &description) {
 
     tools::wallet2::address_book_row entry = ab[index];
     entry.m_description = description.toStdString();
-    bool r =  m_wallet2->set_address_book_row(index, entry.m_address, entry.m_has_payment_id ? &entry.m_payment_id : nullptr, entry.m_description, entry.m_is_subaddress);
+    bool r = m_wallet2->set_address_book_row(index, entry.m_address, entry.m_has_payment_id ? &entry.m_payment_id : nullptr, entry.m_description, entry.m_is_subaddress);
     if (r)
         refresh();
     else
@@ -114,6 +107,5 @@ qsizetype AddressBook::count() const
 
 void AddressBook::clearRows()
 {
-    qDeleteAll(m_rows);
     m_rows.clear();
-}
\ No newline at end of file
+}
index 0d36577175d8af17b9bbe19b20dd352a5c4648a2..25ac1e2fb99a680d7f34337c451e7e0249d79d97 100644 (file)
@@ -4,14 +4,10 @@
 #ifndef ADDRESSBOOK_H
 #define ADDRESSBOOK_H
 
-#include <QMap>
 #include <QObject>
-#include <QReadWriteLock>
 #include <QList>
-#include <QDateTime>
 
 #include "rows/ContactRow.h"
-#include "Wallet.h"
 
 namespace Monero {
 struct AddressBook;
@@ -21,6 +17,7 @@ namespace tools{
     class wallet2;
 }
 
+class Wallet;
 class AddressBook : public QObject
 {
     Q_OBJECT
@@ -34,7 +31,9 @@ public:
     };
     Q_ENUM(ErrorCode);
 
-    bool getRow(int index, std::function<void (ContactRow &)> callback) const;
+    const QList<ContactRow>& getRows();
+    const ContactRow& getRow(qsizetype i);
+
     bool addRow(const QString &address, const QString &description);
     bool deleteRow(int rowId);
     bool setDescription(int index, const QString &label);
@@ -45,19 +44,17 @@ public:
     void refresh();
     void clearRows();
 
-
 signals:
     void refreshStarted() const;
     void refreshFinished() const;
     void descriptionChanged() const;
 
 private:
-    explicit AddressBook(Wallet *wallet, tools::wallet2 *wallet2, QObject *parent);
+    explicit AddressBook(tools::wallet2 *wallet2, QObject *parent);
     friend class Wallet;
 
-    Wallet *m_wallet;
     tools::wallet2 *m_wallet2;
-    QList<ContactRow*> m_rows;
+    QList<ContactRow> m_rows;
 
     QString m_errorString;
     ErrorCode m_errorCode;
index 0ef660afda72df47ce3a3eee5d51552ad81c1b51..26b4461faff3c77ce9a5badadf62d24aa9436c2d 100644 (file)
@@ -38,7 +38,7 @@ Wallet::Wallet(Monero::Wallet *wallet, QObject *parent)
         , m_wallet2(wallet->getWallet())
         , m_history(new TransactionHistory(this, wallet->getWallet(), this))
         , m_historyModel(nullptr)
-        , m_addressBook(new AddressBook(this, wallet->getWallet(), this))
+        , m_addressBook(new AddressBook(wallet->getWallet(), this))
         , m_addressBookModel(nullptr)
         , m_daemonBlockChainHeight(0)
         , m_daemonBlockChainTargetHeight(0)
diff --git a/src/libwalletqt/rows/ContactRow.cpp b/src/libwalletqt/rows/ContactRow.cpp
deleted file mode 100644 (file)
index 4680640..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-// SPDX-License-Identifier: BSD-3-Clause
-// SPDX-FileCopyrightText: The Monero Project
-
-#include "ContactRow.h"
-
-qsizetype ContactRow::getRow() const {
-    return m_row;
-}
-
-const QString& ContactRow::getAddress() const {
-    return m_address;
-}
-
-const QString& ContactRow::getLabel() const {
-    return m_label;
-}
\ No newline at end of file
index 0224aebf49282e9e4d1103b2bca444486d5e33f2..8f749f24bb20705b91c4f3ebdbcd91cb338edf98 100644 (file)
@@ -4,28 +4,17 @@
 #ifndef FEATHER_CONTACTROW_H
 #define FEATHER_CONTACTROW_H
 
-#include <QObject>
+#include <QString>
+#include <utility>
 
-class ContactRow : public QObject
+struct ContactRow
 {
-    Q_OBJECT
+    QString address;
+    QString label;
 
-public:
-    ContactRow(QObject *parent, qsizetype row, const QString& address, const QString &label)
-            : QObject(parent)
-            , m_row(row)
-            , m_address(address)
-            , m_label(label) {}
-
-    qsizetype getRow() const;
-    const QString& getAddress() const;
-    const QString& getLabel() const;
-
-private:
-    qsizetype m_row;
-    QString m_address;
-    QString m_label;
+    ContactRow(const QString address_, const QString &label_)
+        : address(address_)
+        , label(label_) {}
 };
 
-
 #endif //FEATHER_CONTACTROW_H
index 1134a5d28cbb8ae8f4b1402508883f73940c7b8c..79bfafcb12ce986830fc27dfe5147aff64ea120a 100644 (file)
@@ -60,50 +60,47 @@ bool AddressBookModel::setData(const QModelIndex &index, const QVariant &value,
 
 QVariant AddressBookModel::data(const QModelIndex &index, int role) const
 {
-    QVariant result;
-
-    bool found = m_addressBook->getRow(index.row(), [this, &result, &role, &index](const ContactRow &row) {
-        if (role == Qt::DisplayRole || role == Qt::EditRole || role == Qt::UserRole) {
-            switch (index.column()) {
-                case Address:
-                {
-                    QString address = row.getAddress();
-                    if (!m_showFullAddresses && role != Qt::UserRole) {
-                        address = Utils::displayAddress(address);
-                    }
-                    result = address;
-                    break;
+    const QList<ContactRow>& rows = m_addressBook->getRows();
+    if (index.row() < 0 || index.row() >= rows.size()) {
+        return {};
+    }
+    const ContactRow& row = rows[index.row()];
+
+    if (role == Qt::DisplayRole || role == Qt::EditRole || role == Qt::UserRole) {
+        switch (index.column()) {
+            case Address:
+            {
+                QString address = row.address;
+                if (!m_showFullAddresses && role != Qt::UserRole) {
+                    address = Utils::displayAddress(address);
                 }
-                case Description:
-                    result = row.getLabel();
-                    break;
-                default:
-                    qCritical() << "Invalid column" << index.column();
+                return address;
             }
+            case Description:
+                return row.label;
+            default:
+                qCritical() << "Invalid column" << index.column();
         }
-        else if (role == Qt::FontRole) {
-            switch (index.column()) {
-                case Address:
-                    result = Utils::getMonospaceFont();
-            }
+    }
+    else if (role == Qt::FontRole) {
+        switch (index.column()) {
+            case Address:
+                return Utils::getMonospaceFont();
+            default:
+                return {};
         }
-        else if (role == Qt::DecorationRole) {
-            switch (index.column()) {
-                case Description: {
-                    return QVariant(m_contactIcon);  // @TODO: does not actually work
-                }
-                default: {
-                    return QVariant();
-                }
+    }
+    else if (role == Qt::DecorationRole) {
+        switch (index.column()) {
+            case Description: {
+                return QVariant(m_contactIcon);  // @TODO: does not actually work
+            }
+            default: {
+                return {};
             }
         }
-        return QVariant();
-    });
-    if (!found) {
-        qCritical("%s: internal error: invalid index %d", __FUNCTION__, index.row());
     }
-
-    return result;
+    return {};
 }
 
 Qt::ItemFlags AddressBookModel::flags(const QModelIndex &index) const
@@ -120,7 +117,7 @@ Qt::ItemFlags AddressBookModel::flags(const QModelIndex &index) const
 QVariant AddressBookModel::headerData(int section, Qt::Orientation orientation, int role) const
 {
     if (role != Qt::DisplayRole) {
-        return QVariant();
+        return {};
     }
     if (orientation == Qt::Horizontal)
     {
@@ -130,10 +127,10 @@ QVariant AddressBookModel::headerData(int section, Qt::Orientation orientation,
             case Description:
                 return QString("Name");
             default:
-                return QVariant();
+                return {};
         }
     }
-    return QVariant();
+    return {};
 }
 
 bool AddressBookModel::deleteRow(int row)