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