diff --git a/src/qt/test/providertransactiontests.cpp b/src/qt/test/providertransactiontests.cpp
index 5defac08423c..ea4a9b81eb56 100644
--- a/src/qt/test/providertransactiontests.cpp
+++ b/src/qt/test/providertransactiontests.cpp
@@ -118,16 +118,16 @@ class TransactionTypeSettingRestorer
{
public:
TransactionTypeSettingRestorer() :
- m_had_value(m_settings.contains("transactionType")),
- m_value(m_settings.value("transactionType"))
+ m_had_value(m_settings.contains("transactionTypeFilter")),
+ m_value(m_settings.value("transactionTypeFilter"))
{
}
~TransactionTypeSettingRestorer()
{
if (m_had_value) {
- m_settings.setValue("transactionType", m_value);
+ m_settings.setValue("transactionTypeFilter", m_value);
} else {
- m_settings.remove("transactionType");
+ m_settings.remove("transactionTypeFilter");
}
}
@@ -158,55 +158,38 @@ void CheckProviderRecords(const TransactionTableModel& model, const std::vector<
QVERIFY(tooltip.contains(record.label));
QVERIFY(tooltip.contains(record.tooltip_text));
QVERIFY(!tooltip.contains("Payment to yourself"));
-
- const QString plain_text{base.data(TransactionTableModel::TxPlainTextRole).toString()};
- QVERIFY(plain_text.contains(record.label));
- QVERIFY(!plain_text.contains("Payment to yourself"));
-
- const QString description{base.data(TransactionTableModel::LongDescriptionRole).toString()};
- QVERIFY(description.contains(record.label));
- QVERIFY(description.contains(QString::fromStdString(record.txid.ToString())));
- QVERIFY(description.contains("Net amount"));
- QVERIFY(description.contains("Transaction total size"));
- const QString summary{description.section("
", 0, 0)};
- QVERIFY(!summary.contains("From:"));
- QVERIFY(!summary.contains("To:"));
- QVERIFY(!summary.contains("Debit:"));
- QVERIFY(!summary.contains("Credit:"));
- QVERIFY(!summary.contains("Output index"));
}
}
} // namespace
-void ProviderTransactionTests::transactionTypeSettingCompatibility_data()
+void ProviderTransactionTests::transactionTypeSettingPersistence_data()
{
- QTest::addColumn("saved_index");
+ QTest::addColumn("saved_filter");
QTest::addColumn("expected_text");
- QTest::addColumn("expected_filter");
- QTest::newRow("data") << 12 << QString{"Data Transaction"}
- << TransactionFilterProxy::TYPE(TransactionRecord::DataTransaction);
- QTest::newRow("dust") << 13 << QString{"Dust Receive"} << TransactionFilterProxy::TYPE(TransactionRecord::DustReceive);
- QTest::newRow("other") << 14 << QString{"Other"} << TransactionFilterProxy::TYPE(TransactionRecord::Other);
+ QTest::newRow("masternode") << (TransactionFilterProxy::TYPE(TransactionRecord::MasternodeRegistration) |
+ TransactionFilterProxy::TYPE(TransactionRecord::MasternodeUpdate))
+ << QString{"Masternode"};
+ QTest::newRow("data") << TransactionFilterProxy::TYPE(TransactionRecord::DataTransaction)
+ << QString{"Data Transaction"};
+ // An unknown stored filter selects nothing instead of an arbitrary entry.
+ QTest::newRow("unknown") << quint32{0} << QString{};
}
-void ProviderTransactionTests::transactionTypeSettingCompatibility()
+void ProviderTransactionTests::transactionTypeSettingPersistence()
{
- QFETCH(int, saved_index);
+ QFETCH(quint32, saved_filter);
QFETCH(QString, expected_text);
- QFETCH(quint32, expected_filter);
TransactionTypeSettingRestorer setting_restorer;
- QSettings{}.setValue("transactionType", saved_index);
+ QSettings{}.setValue("transactionTypeFilter", saved_filter);
TransactionView transaction_view;
QComboBox* const type_widget{FindTransactionTypeWidget(transaction_view)};
QVERIFY(type_widget != nullptr);
- QCOMPARE(type_widget->currentIndex(), saved_index);
QCOMPARE(type_widget->currentText(), expected_text);
- QCOMPARE(type_widget->currentData().toUInt(), expected_filter);
- QCOMPARE(type_widget->findText("Masternode"), 15);
+ QCOMPARE(type_widget->currentData().toUInt(), saved_filter);
}
void ProviderTransactionTests::providerTransactionHistory()
@@ -301,13 +284,6 @@ void ProviderTransactionTests::providerTransactionHistory()
// Transactions loaded before the model is constructed exercise the wallet-restart path.
CheckProviderRecords(*model, expected);
- const std::vector registrar_rows{FindTransactionRows(*model, update_registrar->GetHash())};
- QCOMPARE(registrar_rows.size(), size_t{1});
- const QString registrar_description{
- model->index(registrar_rows.front(), 0).data(TransactionTableModel::LongDescriptionRole).toString()};
- const QString registrar_summary{registrar_description.section("
", 0, 0)};
- const QString external_address{QString::fromStdString(EncodeDestination(PKHash(external_key.GetPubKey())))};
- QVERIFY(!registrar_summary.contains(external_address));
const std::vector other_rows{FindTransactionRows(*model, other_special_tx->GetHash())};
QCOMPARE(other_rows.size(), size_t{1});
@@ -355,20 +331,22 @@ void ProviderTransactionTests::providerTransactionHistory()
QListView* const type_list{qobject_cast(type_widget->view())};
QVERIFY(type_list != nullptr);
- for (const quint32 coinjoin_filter :
- {TransactionFilterProxy::TYPE(TransactionRecord::CoinJoinSend),
- TransactionFilterProxy::TYPE(TransactionRecord::CoinJoinMakeCollaterals),
- TransactionFilterProxy::TYPE(TransactionRecord::CoinJoinCreateDenominations),
- TransactionFilterProxy::TYPE(TransactionRecord::CoinJoinMixing),
- TransactionFilterProxy::TYPE(TransactionRecord::CoinJoinCollateralPayment)}) {
- const int row{type_widget->findData(coinjoin_filter)};
- QVERIFY(row >= 0);
- QVERIFY(type_list->isRowHidden(row));
+ // Match CoinJoin entries by title so filters added later are covered without
+ // duplicating the implementation's filter list.
+ int hidden_coinjoin_rows{0};
+ for (int row{0}; row < type_widget->count(); ++row) {
+ const QString title{type_widget->itemText(row)};
+ if (title.contains("coinjoin", Qt::CaseInsensitive) || title.contains("coin join", Qt::CaseInsensitive)) {
+ QVERIFY(type_list->isRowHidden(row));
+ ++hidden_coinjoin_rows;
+ }
}
+ QVERIFY(hidden_coinjoin_rows > 0);
QVERIFY(!type_list->isRowHidden(masternode_row));
type_widget->setCurrentIndex(masternode_row);
transaction_view.chooseType(masternode_row);
+ QCOMPARE(QSettings{}.value("transactionTypeFilter").toUInt(), masternode_filter);
QTableView* const table{transaction_view.findChild("transactionView")};
QVERIFY(table != nullptr);
QCOMPARE(table->model()->rowCount(), static_cast(expected.size()));
diff --git a/src/qt/test/providertransactiontests.h b/src/qt/test/providertransactiontests.h
index 8551c5d34dd3..125ac695763f 100644
--- a/src/qt/test/providertransactiontests.h
+++ b/src/qt/test/providertransactiontests.h
@@ -22,8 +22,8 @@ class ProviderTransactionTests : public QObject
}
private Q_SLOTS:
- void transactionTypeSettingCompatibility_data();
- void transactionTypeSettingCompatibility();
+ void transactionTypeSettingPersistence_data();
+ void transactionTypeSettingPersistence();
void providerTransactionHistory();
private:
diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp
index bc1d7fe4a8da..a9421e3793c7 100644
--- a/src/qt/transactionview.cpp
+++ b/src/qt/transactionview.cpp
@@ -95,13 +95,13 @@ TransactionView::TransactionView(QWidget* parent) :
typeWidget->addItem(tr("%1 Collateral Payment").arg(strCoinJoinName), TransactionFilterProxy::TYPE(TransactionRecord::CoinJoinCollateralPayment));
typeWidget->addItem(tr("To yourself"), TransactionFilterProxy::TYPE(TransactionRecord::SendToSelf));
typeWidget->addItem(tr("Mined"), TransactionFilterProxy::TYPE(TransactionRecord::Generated));
+ typeWidget->addItem(tr("Masternode"), TransactionFilterProxy::TYPE(TransactionRecord::MasternodeRegistration) |
+ TransactionFilterProxy::TYPE(TransactionRecord::MasternodeUpdate));
typeWidget->addItem(tr("Platform Transfer"), TransactionFilterProxy::TYPE(TransactionRecord::PlatformTransfer));
typeWidget->addItem(tr("Data Transaction"), TransactionFilterProxy::TYPE(TransactionRecord::DataTransaction));
typeWidget->addItem(tr("Dust Receive"), TransactionFilterProxy::TYPE(TransactionRecord::DustReceive));
typeWidget->addItem(tr("Other"), TransactionFilterProxy::TYPE(TransactionRecord::Other));
- typeWidget->addItem(tr("Masternode"), TransactionFilterProxy::TYPE(TransactionRecord::MasternodeRegistration) |
- TransactionFilterProxy::TYPE(TransactionRecord::MasternodeUpdate));
- typeWidget->setCurrentIndex(settings.value("transactionType").toInt());
+ typeWidget->setCurrentIndex(typeWidget->findData(settings.value("transactionTypeFilter").toUInt()));
hlayout->addWidget(typeWidget);
@@ -261,7 +261,6 @@ void TransactionView::setModel(WalletModel *_model)
connect(_model, &WalletModel::notifyWatchonlyChanged, this, &TransactionView::updateWatchOnlyColumn);
// Update transaction list with persisted settings
- chooseType(settings.value("transactionType").toInt());
chooseDate(settings.value("transactionDate").toInt());
updateCoinJoinVisibility();
@@ -331,7 +330,7 @@ void TransactionView::chooseType(int idx)
typeWidget->itemData(idx).toUInt());
// Persist settings
QSettings settings;
- settings.setValue("transactionType", idx);
+ settings.setValue("transactionTypeFilter", typeWidget->itemData(idx).toUInt());
}
void TransactionView::chooseWatchonly(int idx)
@@ -788,10 +787,6 @@ void TransactionView::updateCoinJoinVisibility()
return;
}
bool fEnabled = model->node().coinJoinOptions().isEnabled();
- // If CoinJoin gets enabled use "All" else "Most common"
- int idx = fEnabled ? 0 : 1;
- chooseType(idx);
- typeWidget->setCurrentIndex(idx);
// Hide all CoinJoin related filters by value so this stays correct when entries are reordered.
QListView* typeList = qobject_cast(typeWidget->view());
for (const quint32 type_filter : {TransactionFilterProxy::TYPE(TransactionRecord::CoinJoinSend),
@@ -802,4 +797,11 @@ void TransactionView::updateCoinJoinVisibility()
const int row = typeWidget->findData(type_filter);
if (row >= 0) typeList->setRowHidden(row, !fEnabled);
}
+
+ int idx = typeWidget->currentIndex();
+ if (idx < 0 || typeList->isRowHidden(idx)) {
+ idx = typeWidget->findData(fEnabled ? TransactionFilterProxy::ALL_TYPES : TransactionFilterProxy::COMMON_TYPES);
+ typeWidget->setCurrentIndex(idx);
+ }
+ chooseType(idx);
}