1 // Copyright (c) 2011-2018 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 <cstdlib>
11
12 // Earliest date that can be represented (far in the past)
13 const QDateTime TransactionFilterProxy::MIN_DATE = QDateTime::fromTime_t(0);
14 // Last date that can be represented (far in the future)
15 const QDateTime TransactionFilterProxy::MAX_DATE = QDateTime::fromTime_t(0xFFFFFFFF);
16
TransactionFilterProxy(QObject * parent)17 TransactionFilterProxy::TransactionFilterProxy(QObject *parent) :
18 QSortFilterProxyModel(parent),
19 dateFrom(MIN_DATE),
20 dateTo(MAX_DATE),
21 m_search_string(),
22 typeFilter(ALL_TYPES),
23 watchOnlyFilter(WatchOnlyFilter_All),
24 minAmount(0),
25 limitRows(-1),
26 showInactive(true)
27 {
28 }
29
filterAcceptsRow(int sourceRow,const QModelIndex & sourceParent) const30 bool TransactionFilterProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
31 {
32 QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent);
33
34 int status = index.data(TransactionTableModel::StatusRole).toInt();
35 if (!showInactive && status == TransactionStatus::Conflicted)
36 return false;
37
38 int type = index.data(TransactionTableModel::TypeRole).toInt();
39 if (!(TYPE(type) & typeFilter))
40 return false;
41
42 bool involvesWatchAddress = index.data(TransactionTableModel::WatchonlyRole).toBool();
43 if (involvesWatchAddress && watchOnlyFilter == WatchOnlyFilter_No)
44 return false;
45 if (!involvesWatchAddress && watchOnlyFilter == WatchOnlyFilter_Yes)
46 return false;
47
48 QDateTime datetime = index.data(TransactionTableModel::DateRole).toDateTime();
49 if (datetime < dateFrom || datetime > dateTo)
50 return false;
51
52 QString address = index.data(TransactionTableModel::AddressRole).toString();
53 QString label = index.data(TransactionTableModel::LabelRole).toString();
54 QString txid = index.data(TransactionTableModel::TxHashRole).toString();
55 if (!address.contains(m_search_string, Qt::CaseInsensitive) &&
56 ! label.contains(m_search_string, Qt::CaseInsensitive) &&
57 ! txid.contains(m_search_string, Qt::CaseInsensitive)) {
58 return false;
59 }
60
61 qint64 amount = llabs(index.data(TransactionTableModel::AmountRole).toLongLong());
62 if (amount < minAmount)
63 return false;
64
65 return true;
66 }
67
setDateRange(const QDateTime & from,const QDateTime & to)68 void TransactionFilterProxy::setDateRange(const QDateTime &from, const QDateTime &to)
69 {
70 this->dateFrom = from;
71 this->dateTo = to;
72 invalidateFilter();
73 }
74
setSearchString(const QString & search_string)75 void TransactionFilterProxy::setSearchString(const QString &search_string)
76 {
77 if (m_search_string == search_string) return;
78 m_search_string = search_string;
79 invalidateFilter();
80 }
81
setTypeFilter(quint32 modes)82 void TransactionFilterProxy::setTypeFilter(quint32 modes)
83 {
84 this->typeFilter = modes;
85 invalidateFilter();
86 }
87
setMinAmount(const CAmount & minimum)88 void TransactionFilterProxy::setMinAmount(const CAmount& minimum)
89 {
90 this->minAmount = minimum;
91 invalidateFilter();
92 }
93
setWatchOnlyFilter(WatchOnlyFilter filter)94 void TransactionFilterProxy::setWatchOnlyFilter(WatchOnlyFilter filter)
95 {
96 this->watchOnlyFilter = filter;
97 invalidateFilter();
98 }
99
setLimit(int limit)100 void TransactionFilterProxy::setLimit(int limit)
101 {
102 this->limitRows = limit;
103 }
104
setShowInactive(bool _showInactive)105 void TransactionFilterProxy::setShowInactive(bool _showInactive)
106 {
107 this->showInactive = _showInactive;
108 invalidateFilter();
109 }
110
rowCount(const QModelIndex & parent) const111 int TransactionFilterProxy::rowCount(const QModelIndex &parent) const
112 {
113 if(limitRows != -1)
114 {
115 return std::min(QSortFilterProxyModel::rowCount(parent), limitRows);
116 }
117 else
118 {
119 return QSortFilterProxyModel::rowCount(parent);
120 }
121 }
122