transactionfilterproxy.cpp raw
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 }
128