From bd809abc52cc8d312c0023cfc9ae2d14e191d0b5 Mon Sep 17 00:00:00 2001 From: selsta Date: Mon, 14 Jan 2019 13:25:59 +0100 Subject: add account support Co-authored-by: kenshi84 --- src/libwalletqt/SubaddressAccount.cpp | 56 +++++++++++++++++++++++++++++ src/libwalletqt/SubaddressAccount.h | 33 ++++++++++++++++++ src/libwalletqt/Wallet.cpp | 22 ++++++++++++ src/libwalletqt/Wallet.h | 12 +++++++ src/model/SubaddressAccountModel.cpp | 66 +++++++++++++++++++++++++++++++++++ src/model/SubaddressAccountModel.h | 36 +++++++++++++++++++ 6 files changed, 225 insertions(+) create mode 100644 src/libwalletqt/SubaddressAccount.cpp create mode 100644 src/libwalletqt/SubaddressAccount.h create mode 100644 src/model/SubaddressAccountModel.cpp create mode 100644 src/model/SubaddressAccountModel.h (limited to 'src') diff --git a/src/libwalletqt/SubaddressAccount.cpp b/src/libwalletqt/SubaddressAccount.cpp new file mode 100644 index 00000000..83557141 --- /dev/null +++ b/src/libwalletqt/SubaddressAccount.cpp @@ -0,0 +1,56 @@ +#include "SubaddressAccount.h" +#include + +SubaddressAccount::SubaddressAccount(Monero::SubaddressAccount *subaddressAccountImpl, QObject *parent) + : QObject(parent), m_subaddressAccountImpl(subaddressAccountImpl) +{ + qDebug(__FUNCTION__); + getAll(); +} + +QList SubaddressAccount::getAll(bool update) const +{ + qDebug(__FUNCTION__); + + emit refreshStarted(); + + if(update) + m_rows.clear(); + + if (m_rows.empty()){ + for (auto &row: m_subaddressAccountImpl->getAll()) { + m_rows.append(row); + } + } + + emit refreshFinished(); + return m_rows; +} + +Monero::SubaddressAccountRow * SubaddressAccount::getRow(int index) const +{ + return m_rows.at(index); +} + +void SubaddressAccount::addRow(const QString &label) const +{ + m_subaddressAccountImpl->addRow(label.toStdString()); + getAll(true); +} + +void SubaddressAccount::setLabel(quint32 accountIndex, const QString &label) const +{ + m_subaddressAccountImpl->setLabel(accountIndex, label.toStdString()); + getAll(true); +} + +void SubaddressAccount::refresh() const +{ + m_subaddressAccountImpl->refresh(); + getAll(true); +} + +quint64 SubaddressAccount::count() const +{ + return m_rows.size(); +} diff --git a/src/libwalletqt/SubaddressAccount.h b/src/libwalletqt/SubaddressAccount.h new file mode 100644 index 00000000..ee40c22e --- /dev/null +++ b/src/libwalletqt/SubaddressAccount.h @@ -0,0 +1,33 @@ +#ifndef SUBADDRESSACCOUNT_H +#define SUBADDRESSACCOUNT_H + +#include +#include +#include +#include + +class SubaddressAccount : public QObject +{ + Q_OBJECT +public: + Q_INVOKABLE QList getAll(bool update = false) const; + Q_INVOKABLE Monero::SubaddressAccountRow * getRow(int index) const; + Q_INVOKABLE void addRow(const QString &label) const; + Q_INVOKABLE void setLabel(quint32 accountIndex, const QString &label) const; + Q_INVOKABLE void refresh() const; + quint64 count() const; + +signals: + void refreshStarted() const; + void refreshFinished() const; + +public slots: + +private: + explicit SubaddressAccount(Monero::SubaddressAccount * subaddressAccountImpl, QObject *parent); + friend class Wallet; + Monero::SubaddressAccount * m_subaddressAccountImpl; + mutable QList m_rows; +}; + +#endif // SUBADDRESSACCOUNT_H diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index 85761e0b..e488b635 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -4,10 +4,12 @@ #include "TransactionHistory.h" #include "AddressBook.h" #include "Subaddress.h" +#include "SubaddressAccount.h" #include "model/TransactionHistoryModel.h" #include "model/TransactionHistorySortFilterModel.h" #include "model/AddressBookModel.h" #include "model/SubaddressModel.h" +#include "model/SubaddressAccountModel.h" #include "wallet/api/wallet2_api.h" #include @@ -357,6 +359,7 @@ bool Wallet::refresh() bool result = m_walletImpl->refresh(); m_history->refresh(currentSubaddressAccount()); m_subaddress->refresh(currentSubaddressAccount()); + m_subaddressAccount->getAll(true); if (result) emit updated(); return result; @@ -543,6 +546,20 @@ SubaddressModel *Wallet::subaddressModel() return m_subaddressModel; } +SubaddressAccount *Wallet::subaddressAccount() const +{ + return m_subaddressAccount; +} + +SubaddressAccountModel *Wallet::subaddressAccountModel() const +{ + if (!m_subaddressAccountModel) { + Wallet * w = const_cast(this); + m_subaddressAccountModel = new SubaddressAccountModel(w,m_subaddressAccount); + } + return m_subaddressAccountModel; +} + QString Wallet::generatePaymentId() const { return QString::fromStdString(Monero::Wallet::genPaymentId()); @@ -858,6 +875,8 @@ Wallet::Wallet(Monero::Wallet *w, QObject *parent) , m_addressBookModel(nullptr) , m_subaddress(nullptr) , m_subaddressModel(nullptr) + , m_subaddressAccount(nullptr) + , m_subaddressAccountModel(nullptr) , m_daemonBlockChainHeight(0) , m_daemonBlockChainHeightTtl(DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS) , m_daemonBlockChainTargetHeight(0) @@ -868,6 +887,7 @@ Wallet::Wallet(Monero::Wallet *w, QObject *parent) m_history = new TransactionHistory(m_walletImpl->history(), this); m_addressBook = new AddressBook(m_walletImpl->addressBook(), this); m_subaddress = new Subaddress(m_walletImpl->subaddress(), this); + m_subaddressAccount = new SubaddressAccount(m_walletImpl->subaddressAccount(), this); m_walletListener = new WalletListenerImpl(this); m_walletImpl->setListener(m_walletListener); m_connectionStatus = Wallet::ConnectionStatus_Disconnected; @@ -893,6 +913,8 @@ Wallet::~Wallet() m_addressBook = NULL; delete m_subaddress; m_subaddress = NULL; + delete m_subaddressAccount; + m_subaddressAccount = NULL; //Monero::WalletManagerFactory::getWalletManager()->closeWallet(m_walletImpl); if(status() == Status_Critical) qDebug("Not storing wallet cache"); diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 8197e567..e3357528 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -24,6 +24,8 @@ class AddressBook; class AddressBookModel; class Subaddress; class SubaddressModel; +class SubaddressAccount; +class SubaddressAccountModel; class Wallet : public QObject { @@ -44,6 +46,8 @@ class Wallet : public QObject Q_PROPERTY(AddressBook * addressBook READ addressBook) Q_PROPERTY(SubaddressModel * subaddressModel READ subaddressModel) Q_PROPERTY(Subaddress * subaddress READ subaddress) + Q_PROPERTY(SubaddressAccountModel * subaddressAccountModel READ subaddressAccountModel) + Q_PROPERTY(SubaddressAccount * subaddressAccount READ subaddressAccount) Q_PROPERTY(bool viewOnly READ viewOnly) Q_PROPERTY(QString secretViewKey READ getSecretViewKey) Q_PROPERTY(QString publicViewKey READ getPublicViewKey) @@ -234,6 +238,12 @@ public: //! returns subadress model SubaddressModel *subaddressModel(); + //! returns subaddress account + SubaddressAccount *subaddressAccount() const; + + //! returns subadress account model + SubaddressAccountModel *subaddressAccountModel() const; + //! generate payment id Q_INVOKABLE QString generatePaymentId() const; @@ -348,6 +358,8 @@ private: mutable AddressBookModel * m_addressBookModel; Subaddress * m_subaddress; mutable SubaddressModel * m_subaddressModel; + SubaddressAccount * m_subaddressAccount; + mutable SubaddressAccountModel * m_subaddressAccountModel; QMutex m_connectionStatusMutex; bool m_connectionStatusRunning; QString m_daemonUsername; diff --git a/src/model/SubaddressAccountModel.cpp b/src/model/SubaddressAccountModel.cpp new file mode 100644 index 00000000..fa2ce0b2 --- /dev/null +++ b/src/model/SubaddressAccountModel.cpp @@ -0,0 +1,66 @@ +#include "SubaddressAccountModel.h" +#include "SubaddressAccount.h" +#include +#include +#include + +SubaddressAccountModel::SubaddressAccountModel(QObject *parent, SubaddressAccount *subaddressAccount) + : QAbstractListModel(parent), m_subaddressAccount(subaddressAccount) +{ + qDebug(__FUNCTION__); + connect(m_subaddressAccount,SIGNAL(refreshStarted()),this,SLOT(startReset())); + connect(m_subaddressAccount,SIGNAL(refreshFinished()),this,SLOT(endReset())); +} + +void SubaddressAccountModel::startReset(){ + qDebug("SubaddressAccountModel::startReset"); + beginResetModel(); +} +void SubaddressAccountModel::endReset(){ + qDebug("SubaddressAccountModel::endReset"); + endResetModel(); +} + +int SubaddressAccountModel::rowCount(const QModelIndex &parent) const +{ + return m_subaddressAccount->count(); +} + +QVariant SubaddressAccountModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || (unsigned)index.row() >= m_subaddressAccount->count()) + return {}; + + Monero::SubaddressAccountRow * sr = m_subaddressAccount->getRow(index.row()); + + QVariant result = ""; + switch (role) { + case SubaddressAccountAddressRole: + result = QString::fromStdString(sr->getAddress()); + break; + case SubaddressAccountLabelRole: + result = QString::fromStdString(sr->getLabel()); + break; + case SubaddressAccountBalanceRole: + result = QString::fromStdString(sr->getBalance()); + break; + case SubaddressAccountUnlockedBalanceRole: + result = QString::fromStdString(sr->getUnlockedBalance()); + break; + } + + return result; +} + +QHash SubaddressAccountModel::roleNames() const +{ + static QHash roleNames; + if (roleNames.empty()) + { + roleNames.insert(SubaddressAccountAddressRole, "address"); + roleNames.insert(SubaddressAccountLabelRole, "label"); + roleNames.insert(SubaddressAccountBalanceRole, "balance"); + roleNames.insert(SubaddressAccountUnlockedBalanceRole, "unlockedBalance"); + } + return roleNames; +} diff --git a/src/model/SubaddressAccountModel.h b/src/model/SubaddressAccountModel.h new file mode 100644 index 00000000..e78a3f84 --- /dev/null +++ b/src/model/SubaddressAccountModel.h @@ -0,0 +1,36 @@ +#ifndef SUBADDRESSACCOUNTMODEL_H +#define SUBADDRESSACCOUNTMODEL_H + +#include + +class SubaddressAccount; + +class SubaddressAccountModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum SubaddressAccountRowRole { + SubaddressAccountRole = Qt::UserRole + 1, // for the SubaddressAccountRow object; + SubaddressAccountAddressRole, + SubaddressAccountLabelRole, + SubaddressAccountBalanceRole, + SubaddressAccountUnlockedBalanceRole, + }; + Q_ENUM(SubaddressAccountRowRole) + + SubaddressAccountModel(QObject *parent, SubaddressAccount *subaddressAccount); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QHash roleNames() const override; + +public slots: + void startReset(); + void endReset(); + +private: + SubaddressAccount *m_subaddressAccount; +}; + +#endif // SUBADDRESSACCOUNTMODEL_H -- cgit v1.2.3