/ src / qt / transactionfilterproxy.cpp
transactionfilterproxy.cpp
  1  // Copyright (c) 2011-present The Bitcoin Core 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  #include <qt/transactionfilterproxy.h>
  6  
  7  #include <qt/transactiontablemodel.h>
  8  #include <qt/transactionrecord.h>
  9  
 10  #include <algorithm>
 11  #include <cstdlib>
 12  #include <optional>
 13  
 14  TransactionFilterProxy::TransactionFilterProxy(QObject* parent)
 15      : QSortFilterProxyModel(parent)
 16  {
 17  }
 18  
 19  bool TransactionFilterProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
 20  {
 21      QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
 22  
 23      int status = index.data(TransactionTableModel::StatusRole).toInt();
 24      if (!showInactive && status == TransactionStatus::Conflicted)
 25          return false;
 26  
 27      int type = index.data(TransactionTableModel::TypeRole).toInt();
 28      if (!(TYPE(type) & typeFilter))
 29          return false;
 30  
 31      QDateTime datetime = index.data(TransactionTableModel::DateRole).toDateTime();
 32      if (dateFrom && datetime < *dateFrom) return false;
 33      if (dateTo && datetime > *dateTo) return false;
 34  
 35      QString address = index.data(TransactionTableModel::AddressRole).toString();
 36      QString label = index.data(TransactionTableModel::LabelRole).toString();
 37      QString txid = index.data(TransactionTableModel::TxHashRole).toString();
 38      if (!address.contains(m_search_string, Qt::CaseInsensitive) &&
 39          !  label.contains(m_search_string, Qt::CaseInsensitive) &&
 40          !   txid.contains(m_search_string, Qt::CaseInsensitive)) {
 41          return false;
 42      }
 43  
 44      qint64 amount = llabs(index.data(TransactionTableModel::AmountRole).toLongLong());
 45      if (amount < minAmount)
 46          return false;
 47  
 48      return true;
 49  }
 50  
 51  void TransactionFilterProxy::setDateRange(const std::optional<QDateTime>& from, const std::optional<QDateTime>& to)
 52  {
 53  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
 54      beginFilterChange();
 55  #endif
 56  
 57      dateFrom = from;
 58      dateTo = to;
 59  
 60  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
 61      endFilterChange(QSortFilterProxyModel::Direction::Rows);
 62  #else
 63      invalidateFilter();
 64  #endif
 65  }
 66  
 67  void TransactionFilterProxy::setSearchString(const QString &search_string)
 68  {
 69      if (m_search_string == search_string) return;
 70  
 71  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
 72      beginFilterChange();
 73  #endif
 74  
 75      m_search_string = search_string;
 76  
 77  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
 78      endFilterChange(QSortFilterProxyModel::Direction::Rows);
 79  #else
 80      invalidateFilter();
 81  #endif
 82  }
 83  
 84  void TransactionFilterProxy::setTypeFilter(quint32 modes)
 85  {
 86  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
 87      beginFilterChange();
 88  #endif
 89  
 90      this->typeFilter = modes;
 91  
 92  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
 93      endFilterChange(QSortFilterProxyModel::Direction::Rows);
 94  #else
 95      invalidateFilter();
 96  #endif
 97  }
 98  
 99  void TransactionFilterProxy::setMinAmount(const CAmount& minimum)
100  {
101  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
102      beginFilterChange();
103  #endif
104  
105      this->minAmount = minimum;
106  
107  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
108      endFilterChange(QSortFilterProxyModel::Direction::Rows);
109  #else
110      invalidateFilter();
111  #endif
112  }
113  
114  void TransactionFilterProxy::setShowInactive(bool _showInactive)
115  {
116  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
117      beginFilterChange();
118  #endif
119  
120      this->showInactive = _showInactive;
121  
122  #if QT_VERSION >= QT_VERSION_CHECK(6, 10, 0)
123      endFilterChange(QSortFilterProxyModel::Direction::Rows);
124  #else
125      invalidateFilter();
126  #endif
127  }