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); }