diff --git a/src/qt/transactionfilterproxy.h b/src/qt/transactionfilterproxy.h --- a/src/qt/transactionfilterproxy.h +++ b/src/qt/transactionfilterproxy.h @@ -41,7 +41,7 @@ }; void setDateRange(const QDateTime &from, const QDateTime &to); - void setAddressPrefix(const QString &addrPrefix); + void setSearchString(const QString &); /** * @note Type filter takes a bit field created with TYPE() or ALL_TYPES */ @@ -68,7 +68,7 @@ private: QDateTime dateFrom; QDateTime dateTo; - QString addrPrefix; + QString m_search_string; quint32 typeFilter; WatchOnlyFilter watchOnlyFilter; Amount minAmount; diff --git a/src/qt/transactionfilterproxy.cpp b/src/qt/transactionfilterproxy.cpp --- a/src/qt/transactionfilterproxy.cpp +++ b/src/qt/transactionfilterproxy.cpp @@ -19,45 +19,54 @@ TransactionFilterProxy::TransactionFilterProxy(QObject *parent) : QSortFilterProxyModel(parent), dateFrom(MIN_DATE), dateTo(MAX_DATE), - addrPrefix(), typeFilter(ALL_TYPES), watchOnlyFilter(WatchOnlyFilter_All), - minAmount(), limitRows(-1), showInactive(true) {} + m_search_string(), typeFilter(ALL_TYPES), + watchOnlyFilter(WatchOnlyFilter_All), minAmount(), limitRows(-1), + showInactive(true) {} bool TransactionFilterProxy::filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent) const { QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); - int type = index.data(TransactionTableModel::TypeRole).toInt(); - QDateTime datetime = - index.data(TransactionTableModel::DateRole).toDateTime(); - bool involvesWatchAddress = - index.data(TransactionTableModel::WatchonlyRole).toBool(); - QString address = index.data(TransactionTableModel::AddressRole).toString(); - QString label = index.data(TransactionTableModel::LabelRole).toString(); - Amount amount( - int64_t( - llabs(index.data(TransactionTableModel::AmountRole).toLongLong())) * - SATOSHI); int status = index.data(TransactionTableModel::StatusRole).toInt(); if (!showInactive && status == TransactionStatus::Conflicted) { return false; } + + int type = index.data(TransactionTableModel::TypeRole).toInt(); if (!(TYPE(type) & typeFilter)) { return false; } + + bool involvesWatchAddress = + index.data(TransactionTableModel::WatchonlyRole).toBool(); if (involvesWatchAddress && watchOnlyFilter == WatchOnlyFilter_No) { return false; } if (!involvesWatchAddress && watchOnlyFilter == WatchOnlyFilter_Yes) { return false; } + + QDateTime datetime = + index.data(TransactionTableModel::DateRole).toDateTime(); if (datetime < dateFrom || datetime > dateTo) { return false; } - if (!address.contains(addrPrefix, Qt::CaseInsensitive) && - !label.contains(addrPrefix, Qt::CaseInsensitive)) { + + QString address = index.data(TransactionTableModel::AddressRole).toString(); + QString label = index.data(TransactionTableModel::LabelRole).toString(); + QString txid = index.data(TransactionTableModel::TxHashRole).toString(); + if (!address.contains(m_search_string, Qt::CaseInsensitive) && + !label.contains(m_search_string, Qt::CaseInsensitive) && + !txid.contains(m_search_string, Qt::CaseInsensitive)) { return false; } + + Amount amount = Amount( + int64_t( + llabs(index.data(TransactionTableModel::AmountRole).toLongLong())) * + SATOSHI); + if (amount < minAmount) { return false; } @@ -72,8 +81,11 @@ invalidateFilter(); } -void TransactionFilterProxy::setAddressPrefix(const QString &_addrPrefix) { - this->addrPrefix = _addrPrefix; +void TransactionFilterProxy::setSearchString(const QString &search_string) { + if (m_search_string == search_string) { + return; + } + m_search_string = search_string; invalidateFilter(); } diff --git a/src/qt/transactionview.h b/src/qt/transactionview.h --- a/src/qt/transactionview.h +++ b/src/qt/transactionview.h @@ -68,7 +68,7 @@ QComboBox *dateWidget; QComboBox *typeWidget; QComboBox *watchOnlyWidget; - QLineEdit *addressWidget; + QLineEdit *search_widget; QLineEdit *amountWidget; QMenu *contextMenu; @@ -116,7 +116,7 @@ void chooseType(int idx); void chooseWatchonly(int idx); void changedAmount(); - void changedPrefix(); + void changedSearch(); void exportClicked(); void focusTransaction(const QModelIndex &); void focusTransaction(const uint256 &txid); diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -103,9 +103,10 @@ hlayout->addWidget(typeWidget); - addressWidget = new QLineEdit(this); - addressWidget->setPlaceholderText(tr("Enter address or label to search")); - hlayout->addWidget(addressWidget); + search_widget = new QLineEdit(this); + search_widget->setPlaceholderText( + tr("Enter address, transaction id, or label to search")); + hlayout->addWidget(search_widget); amountWidget = new QLineEdit(this); amountWidget->setPlaceholderText(tr("Min amount")); @@ -192,10 +193,10 @@ SLOT(start())); connect(amount_typing_delay, SIGNAL(timeout()), this, SLOT(changedAmount())); - connect(addressWidget, SIGNAL(textChanged(QString)), prefix_typing_delay, + connect(search_widget, SIGNAL(textChanged(QString)), prefix_typing_delay, SLOT(start())); connect(prefix_typing_delay, SIGNAL(timeout()), this, - SLOT(changedPrefix())); + SLOT(changedSearch())); connect(view, SIGNAL(doubleClicked(QModelIndex)), this, SIGNAL(doubleClicked(QModelIndex))); @@ -348,12 +349,12 @@ watchOnlyWidget->itemData(idx).toInt())); } -void TransactionView::changedPrefix() { +void TransactionView::changedSearch() { if (!transactionProxyModel) { return; } - transactionProxyModel->setAddressPrefix(addressWidget->text()); + transactionProxyModel->setSearchString(search_widget->text()); } void TransactionView::changedAmount() {