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 }