transactiontablemodel.h raw
1 // Copyright (c) 2011-2020 The Limenka developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #ifndef LIMENKA_QT_TRANSACTIONTABLEMODEL_H
6 #define LIMENKA_QT_TRANSACTIONTABLEMODEL_H
7
8 #include <qt/limenkaunits.h>
9
10 #include <QAbstractTableModel>
11 #include <QStringList>
12
13 #include <memory>
14
15 namespace interfaces {
16 class Handler;
17 }
18
19 class PlatformStyle;
20 class TransactionRecord;
21 class TransactionTablePriv;
22 class WalletModel;
23
24 /** UI model for the transaction table of a wallet.
25 */
26 class TransactionTableModel : public QAbstractTableModel
27 {
28 Q_OBJECT
29
30 public:
31 explicit TransactionTableModel(const PlatformStyle *platformStyle, WalletModel *parent = nullptr);
32 ~TransactionTableModel();
33
34 enum ColumnIndex {
35 Status = 0,
36 Watchonly = 1,
37 Date = 2,
38 Type = 3,
39 ToAddress = 4,
40 Amount = 5
41 };
42
43 /** Roles to get specific information from a transaction row.
44 These are independent of column.
45 */
46 enum RoleIndex {
47 /** Type of transaction */
48 TypeRole = Qt::UserRole,
49 /** Date and time this transaction was created */
50 DateRole,
51 /** Watch-only boolean */
52 WatchonlyRole,
53 /** Watch-only icon */
54 WatchonlyDecorationRole,
55 /** Long description (HTML format) */
56 LongDescriptionRole,
57 /** Address of transaction */
58 AddressRole,
59 /** Label of address related to transaction */
60 LabelRole,
61 /** Net amount of transaction */
62 AmountRole,
63 /** Transaction hash */
64 TxHashRole,
65 /** Transaction data, hex-encoded */
66 TxHexRole,
67 /** Whole transaction as plain text */
68 TxPlainTextRole,
69 /** Is transaction confirmed? */
70 ConfirmedRole,
71 /** Formatted amount, without brackets when unconfirmed */
72 FormattedAmountRole,
73 /** Transaction status (TransactionRecord::Status) */
74 StatusRole,
75 /** Unprocessed icon */
76 RawDecorationRole,
77 };
78
79 int rowCount(const QModelIndex &parent) const override;
80 int columnCount(const QModelIndex &parent) const override;
81 QVariant data(const QModelIndex &index, int role) const override;
82 QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
83 QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const override;
84 bool processingQueuedTransactions() const { return fProcessingQueuedTransactions; }
85
86 private:
87 WalletModel *walletModel;
88 std::unique_ptr<interfaces::Handler> m_handler_transaction_changed;
89 std::unique_ptr<interfaces::Handler> m_handler_show_progress;
90 QStringList columns;
91 TransactionTablePriv *priv;
92 bool fProcessingQueuedTransactions{false};
93 const PlatformStyle *platformStyle;
94
95 void subscribeToCoreSignals();
96 void unsubscribeFromCoreSignals();
97
98 QString lookupAddress(const std::string &address, bool tooltip) const;
99 QVariant addressColor(const TransactionRecord *wtx) const;
100 QString formatTxStatus(const TransactionRecord *wtx) const;
101 QString formatTxDate(const TransactionRecord *wtx) const;
102 QString formatTxType(const TransactionRecord *wtx) const;
103 QString formatTxToAddress(const TransactionRecord *wtx, bool tooltip) const;
104 QString formatTxAmount(const TransactionRecord *wtx, bool showUnconfirmed=true, LimenkaUnits::SeparatorStyle separators=LimenkaUnits::SeparatorStyle::STANDARD) const;
105 QString formatTooltip(const TransactionRecord *rec) const;
106 QVariant txStatusDecoration(const TransactionRecord *wtx) const;
107 QVariant txWatchonlyDecoration(const TransactionRecord *wtx) const;
108 QVariant txAddressDecoration(const TransactionRecord *wtx) const;
109
110 public Q_SLOTS:
111 /* New transaction, or transaction changed status */
112 void updateTransaction(const QString &hash, int status, bool showTransaction);
113 void updateConfirmations();
114 void updateDisplayUnit();
115 /** Updates the column title to "Amount (DisplayUnit)" and emits headerDataChanged() signal for table headers to react. */
116 void updateAmountColumnTitle();
117 /* Needed to update fProcessingQueuedTransactions through a QueuedConnection */
118 void setProcessingQueuedTransactions(bool value) { fProcessingQueuedTransactions = value; }
119
120 friend class TransactionTablePriv;
121 };
122
123 #endif // LIMENKA_QT_TRANSACTIONTABLEMODEL_H
124