/ src / qt / transactionfilterproxy.cpp
transactionfilterproxy.cpp
 1  // Copyright (c) 2011-2021 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        m_search_string(),
17        typeFilter(ALL_TYPES)
18  {
19  }
20  
21  bool TransactionFilterProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
22  {
23      QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
24  
25      int status = index.data(TransactionTableModel::StatusRole).toInt();
26      if (!showInactive && status == TransactionStatus::Conflicted)
27          return false;
28  
29      int type = index.data(TransactionTableModel::TypeRole).toInt();
30      if (!(TYPE(type) & typeFilter))
31          return false;
32  
33      bool involvesWatchAddress = index.data(TransactionTableModel::WatchonlyRole).toBool();
34      if (involvesWatchAddress && watchOnlyFilter == WatchOnlyFilter_No)
35          return false;
36      if (!involvesWatchAddress && watchOnlyFilter == WatchOnlyFilter_Yes)
37          return false;
38  
39      QDateTime datetime = index.data(TransactionTableModel::DateRole).toDateTime();
40      if (dateFrom && datetime < *dateFrom) return false;
41      if (dateTo && datetime > *dateTo) return false;
42  
43      QString address = index.data(TransactionTableModel::AddressRole).toString();
44      QString label = index.data(TransactionTableModel::LabelRole).toString();
45      QString txid = index.data(TransactionTableModel::TxHashRole).toString();
46      if (!address.contains(m_search_string, Qt::CaseInsensitive) &&
47          !  label.contains(m_search_string, Qt::CaseInsensitive) &&
48          !   txid.contains(m_search_string, Qt::CaseInsensitive)) {
49          return false;
50      }
51  
52      qint64 amount = llabs(index.data(TransactionTableModel::AmountRole).toLongLong());
53      if (amount < minAmount)
54          return false;
55  
56      return true;
57  }
58  
59  void TransactionFilterProxy::setDateRange(const std::optional<QDateTime>& from, const std::optional<QDateTime>& to)
60  {
61      dateFrom = from;
62      dateTo = to;
63      invalidateFilter();
64  }
65  
66  void TransactionFilterProxy::setSearchString(const QString &search_string)
67  {
68      if (m_search_string == search_string) return;
69      m_search_string = search_string;
70      invalidateFilter();
71  }
72  
73  void TransactionFilterProxy::setTypeFilter(quint32 modes)
74  {
75      this->typeFilter = modes;
76      invalidateFilter();
77  }
78  
79  void TransactionFilterProxy::setMinAmount(const CAmount& minimum)
80  {
81      this->minAmount = minimum;
82      invalidateFilter();
83  }
84  
85  void TransactionFilterProxy::setWatchOnlyFilter(WatchOnlyFilter filter)
86  {
87      this->watchOnlyFilter = filter;
88      invalidateFilter();
89  }
90  
91  void TransactionFilterProxy::setShowInactive(bool _showInactive)
92  {
93      this->showInactive = _showInactive;
94      invalidateFilter();
95  }