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