diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/libwalletqt/TransactionHistory.cpp | 14 | ||||
| -rw-r--r-- | src/libwalletqt/TransactionHistory.h | 5 | ||||
| -rw-r--r-- | src/libwalletqt/TransactionInfo.cpp | 12 | ||||
| -rw-r--r-- | src/libwalletqt/TransactionInfo.h | 14 | ||||
| -rw-r--r-- | src/libwalletqt/Wallet.cpp | 18 | ||||
| -rw-r--r-- | src/libwalletqt/Wallet.h | 13 | ||||
| -rw-r--r-- | src/model/TransactionHistoryModel.cpp | 102 | ||||
| -rw-r--r-- | src/model/TransactionHistoryModel.h | 48 |
8 files changed, 207 insertions, 19 deletions
diff --git a/src/libwalletqt/TransactionHistory.cpp b/src/libwalletqt/TransactionHistory.cpp index 2c2c9f73..7466038f 100644 --- a/src/libwalletqt/TransactionHistory.cpp +++ b/src/libwalletqt/TransactionHistory.cpp @@ -3,11 +3,6 @@ #include <wallet/wallet2_api.h> -int TransactionHistory::count() const -{ - return m_pimpl->count(); -} - TransactionInfo *TransactionHistory::transaction(int index) { // box up Bitmonero::TransactionInfo @@ -39,10 +34,17 @@ QList<TransactionInfo *> TransactionHistory::getAll() const void TransactionHistory::refresh() { // XXX this invalidates previously saved history that might be used by clients + emit refreshStarted(); m_pimpl->refresh(); - emit invalidated(); + emit refreshFinished(); } +quint64 TransactionHistory::count() const +{ + return m_pimpl->count(); +} + + TransactionHistory::TransactionHistory(Bitmonero::TransactionHistory *pimpl, QObject *parent) : QObject(parent), m_pimpl(pimpl) { diff --git a/src/libwalletqt/TransactionHistory.h b/src/libwalletqt/TransactionHistory.h index a6287506..560b8df8 100644 --- a/src/libwalletqt/TransactionHistory.h +++ b/src/libwalletqt/TransactionHistory.h @@ -16,14 +16,15 @@ class TransactionHistory : public QObject Q_PROPERTY(int count READ count) public: - int count() const; Q_INVOKABLE TransactionInfo *transaction(int index); Q_INVOKABLE TransactionInfo * transaction(const QString &id); Q_INVOKABLE QList<TransactionInfo*> getAll() const; Q_INVOKABLE void refresh(); + quint64 count() const; signals: - void invalidated(); + void refreshStarted(); + void refreshFinished(); public slots: diff --git a/src/libwalletqt/TransactionInfo.cpp b/src/libwalletqt/TransactionInfo.cpp index 192e85e5..40711765 100644 --- a/src/libwalletqt/TransactionInfo.cpp +++ b/src/libwalletqt/TransactionInfo.cpp @@ -1,4 +1,6 @@ #include "TransactionInfo.h" +#include "WalletManager.h" + #include <QDateTime> TransactionInfo::Direction TransactionInfo::direction() const @@ -16,15 +18,15 @@ bool TransactionInfo::isFailed() const return m_pimpl->isFailed(); } -quint64 TransactionInfo::amount() const + +QString TransactionInfo::amount() const { - return m_pimpl->amount(); + return WalletManager::instance()->displayAmount(m_pimpl->amount()); } -quint64 TransactionInfo::fee() const +QString TransactionInfo::fee() const { - return m_pimpl->fee(); - + return WalletManager::instance()->displayAmount(m_pimpl->fee()); } quint64 TransactionInfo::blockHeight() const diff --git a/src/libwalletqt/TransactionInfo.h b/src/libwalletqt/TransactionInfo.h index 62c26e2f..4dabc5b4 100644 --- a/src/libwalletqt/TransactionInfo.h +++ b/src/libwalletqt/TransactionInfo.h @@ -10,8 +10,8 @@ class TransactionInfo : public QObject Q_PROPERTY(Direction direction READ direction) Q_PROPERTY(bool isPending READ isPending) Q_PROPERTY(bool isFailed READ isFailed) - Q_PROPERTY(quint64 amount READ amount) - Q_PROPERTY(quint64 fee READ fee) + Q_PROPERTY(QString amount READ amount) + Q_PROPERTY(QString fee READ fee) Q_PROPERTY(quint64 blockHeight READ blockHeight) Q_PROPERTY(QString hash READ hash) Q_PROPERTY(QString timestamp READ timestamp) @@ -23,6 +23,8 @@ public: Direction_Out = Bitmonero::TransactionInfo::Direction_Out }; + Q_ENUM(Direction) + // TODO: implement as separate class; // struct Transfer { @@ -30,11 +32,12 @@ public: // const uint64_t amount; // const std::string address; // }; + Direction direction() const; bool isPending() const; bool isFailed() const; - quint64 amount() const; - quint64 fee() const; + QString amount() const; + QString fee() const; quint64 blockHeight() const; //! transaction_id QString hash() const; @@ -51,4 +54,7 @@ private: Bitmonero::TransactionInfo * m_pimpl; }; +// in order to wrap it to QVariant +Q_DECLARE_METATYPE(TransactionInfo*) + #endif // TRANSACTIONINFO_H diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index 987f4640..4dcf9add 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -1,6 +1,7 @@ #include "Wallet.h" #include "PendingTransaction.h" #include "TransactionHistory.h" +#include "model/TransactionHistoryModel.h" #include "wallet/wallet2_api.h" #include <QFile> @@ -59,7 +60,10 @@ private: Wallet * m_wallet; }; - +Wallet::Wallet(QObject * parent) + : Wallet(nullptr, parent) +{ +} QString Wallet::getSeed() const { @@ -202,6 +206,16 @@ TransactionHistory *Wallet::history() return m_history; } +TransactionHistoryModel *Wallet::historyModel() +{ + if (!m_historyModel) { + m_historyModel = new TransactionHistoryModel(this); + m_historyModel->setTransactionHistory(this->history()); + } + + return m_historyModel; +} + QString Wallet::generatePaymentId() const { @@ -228,6 +242,7 @@ Wallet::Wallet(Bitmonero::Wallet *w, QObject *parent) : QObject(parent) , m_walletImpl(w) , m_history(nullptr) + , m_historyModel(nullptr) , m_daemonBlockChainHeight(0) , m_daemonBlockChainHeightTtl(DAEMON_BLOCKCHAIN_HEIGHT_CACHE_TTL_SECONDS) { @@ -236,5 +251,6 @@ Wallet::Wallet(Bitmonero::Wallet *w, QObject *parent) Wallet::~Wallet() { + Bitmonero::WalletManagerFactory::getWalletManager()->closeWallet(m_walletImpl); } diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 703bd186..1a6459d4 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -13,6 +13,7 @@ namespace Bitmonero { class TransactionHistory; +class TransactionHistoryModel; class Wallet : public QObject { @@ -27,8 +28,11 @@ class Wallet : public QObject Q_PROPERTY(quint64 unlockedBalance READ unlockedBalance) Q_PROPERTY(TransactionHistory * history READ history) Q_PROPERTY(QString paymentId READ paymentId WRITE setPaymentId) + Q_PROPERTY(TransactionHistoryModel * historyModel READ historyModel) public: + + enum Status { Status_Ok = Bitmonero::Wallet::Status_Ok, Status_Error = Bitmonero::Wallet::Status_Error @@ -111,6 +115,9 @@ public: //! returns transaction history TransactionHistory * history(); + //! returns transaction history model + TransactionHistoryModel * historyModel(); + //! generate payment id Q_INVOKABLE QString generatePaymentId() const; @@ -139,9 +146,9 @@ signals: private: + Wallet(QObject * parent = nullptr); Wallet(Bitmonero::Wallet *w, QObject * parent = 0); ~Wallet(); - private: friend class WalletManager; friend class WalletListenerImpl; @@ -149,6 +156,8 @@ private: Bitmonero::Wallet * m_walletImpl; // history lifetime managed by wallet; TransactionHistory * m_history; + // Used for UI history view + TransactionHistoryModel * m_historyModel; QString m_paymentId; mutable QTime m_daemonBlockChainHeightTime; mutable quint64 m_daemonBlockChainHeight; @@ -156,4 +165,6 @@ private: }; + + #endif // WALLET_H diff --git a/src/model/TransactionHistoryModel.cpp b/src/model/TransactionHistoryModel.cpp new file mode 100644 index 00000000..1666981c --- /dev/null +++ b/src/model/TransactionHistoryModel.cpp @@ -0,0 +1,102 @@ +#include "TransactionHistoryModel.h" +#include "TransactionHistory.h" +#include "TransactionInfo.h" + + +TransactionHistoryModel::TransactionHistoryModel(QObject *parent) + : QAbstractListModel(parent), m_transactionHistory(nullptr) +{ + +} + +void TransactionHistoryModel::setTransactionHistory(TransactionHistory *th) +{ + beginResetModel(); + m_transactionHistory = th; + endResetModel(); + emit transactionHistoryChanged(); +} + +TransactionHistory *TransactionHistoryModel::transactionHistory() const +{ + return m_transactionHistory; +} + +QVariant TransactionHistoryModel::data(const QModelIndex &index, int role) const +{ + if (!m_transactionHistory) { + return QVariant(); + } + + if (index.row() < 0 || (unsigned)index.row() >= m_transactionHistory->count()) { + return QVariant(); + } + + TransactionInfo * tInfo = m_transactionHistory->transaction(index.row()); + + + Q_ASSERT(tInfo); + if (!tInfo) { + qCritical("%s: internal error: no transaction info for index %d", __FUNCTION__, index.row()); + return QVariant(); + } + QVariant result; + switch (role) { + case TransactionRole: + result = QVariant::fromValue(tInfo); + break; + case TransactionDirectionRole: + result = QVariant::fromValue(tInfo->direction()); + break; + case TransactionPendingRole: + result = tInfo->isPending(); + break; + case TransactionFailedRole: + result = tInfo->isFailed(); + break; + case TransactionAmountRole: + result = tInfo->amount(); + break; + case TransactionFeeRole: + result = tInfo->fee(); + break; + case TransactionBlockHeightRole: + result = tInfo->blockHeight(); + break; + case TransactionHashRole: + result = tInfo->hash(); + break; + case TransactionTimeStampRole: + result = tInfo->timestamp(); + break; + case TransactionPaymentIdRole: + result = tInfo->paymentId(); + break; + } + + return result; +} + +int TransactionHistoryModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return m_transactionHistory ? m_transactionHistory->count() : 0; +} + +QHash<int, QByteArray> TransactionHistoryModel::roleNames() const +{ + QHash<int, QByteArray> roleNames = QAbstractListModel::roleNames(); + roleNames.insert(TransactionRole, "transaction"); + roleNames.insert(TransactionDirectionRole, "direction"); + roleNames.insert(TransactionPendingRole, "isPending"); + roleNames.insert(TransactionFailedRole, "isFailed"); + roleNames.insert(TransactionAmountRole, "amount"); + roleNames.insert(TransactionFeeRole, "fee"); + roleNames.insert(TransactionBlockHeightRole, "blockHeight"); + roleNames.insert(TransactionHashRole, "hash"); + roleNames.insert(TransactionTimeStampRole, "timeStamp"); + roleNames.insert(TransactionPaymentIdRole, "paymentId"); + return roleNames; +} + + diff --git a/src/model/TransactionHistoryModel.h b/src/model/TransactionHistoryModel.h new file mode 100644 index 00000000..2813a89a --- /dev/null +++ b/src/model/TransactionHistoryModel.h @@ -0,0 +1,48 @@ +#ifndef TRANSACTIONHISTORYMODEL_H +#define TRANSACTIONHISTORYMODEL_H + +#include <QAbstractListModel> + +class TransactionHistory; +class TransactionInfo; + +/** + * @brief The TransactionHistoryModel class - read-only list model for Transaction History + */ +class TransactionHistoryModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(TransactionHistory * transactionHistory READ transactionHistory WRITE setTransactionHistory NOTIFY transactionHistoryChanged) + +public: + enum TransactionInfoRole { + TransactionRole = Qt::UserRole + 1, // for the TransactionInfo object; + TransactionDirectionRole, + TransactionPendingRole, + TransactionFailedRole, + TransactionAmountRole, + TransactionFeeRole, + TransactionBlockHeightRole, + TransactionHashRole, + TransactionTimeStampRole, + TransactionPaymentIdRole + }; + + TransactionHistoryModel(QObject * parent = 0); + void setTransactionHistory(TransactionHistory * th); + TransactionHistory * transactionHistory() const; + + /// QAbstractListModel + virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override; + virtual int rowCount(const QModelIndex & parent = QModelIndex()) const override; + virtual QHash<int, QByteArray> roleNames() const override; + +signals: + void transactionHistoryChanged(); + +private: + TransactionHistory * m_transactionHistory; + +}; + +#endif // TRANSACTIONHISTORYMODEL_H |
