From 026088b76728d61c6d979d8b712174aa6292323f Mon Sep 17 00:00:00 2001 From: Anthony Towns Date: Tue, 18 Nov 2025 21:07:50 +1000 Subject: [PATCH] gui: Add non-mempool balance to wallet overview --- src/qt/bitcoinunits.cpp | 1 - src/qt/forms/overviewpage.ui | 32 +++++++++++++++++++++++++++++--- src/qt/overviewpage.cpp | 10 +++++++++- src/qt/test/wallettests.cpp | 2 +- src/wallet/interfaces.cpp | 2 +- 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/qt/bitcoinunits.cpp b/src/qt/bitcoinunits.cpp index 767c618ff4c..401e87b5a0e 100644 --- a/src/qt/bitcoinunits.cpp +++ b/src/qt/bitcoinunits.cpp @@ -142,7 +142,6 @@ QString BitcoinUnits::formatHtmlWithUnit(Unit unit, const CAmount& amount, bool QString BitcoinUnits::formatWithPrivacy(Unit unit, const CAmount& amount, SeparatorStyle separators, bool privacy) { - assert(amount >= 0); QString value; if (privacy) { value = format(unit, 0, false, separators, true).replace('0', '#'); diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui index f44c26ef32f..9459de017d3 100644 --- a/src/qt/forms/overviewpage.ui +++ b/src/qt/forms/overviewpage.ui @@ -130,14 +130,14 @@ - + Qt::Horizontal - + Total: @@ -183,7 +183,33 @@ - + + + + IBeamCursor + + + Balance for wallet transactions not in the mempool + + + 0.00000000 BTC + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse + + + + + + + Non-mempool: + + + + IBeamCursor diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index f2efbe9222c..daf88bca365 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -190,13 +190,20 @@ void OverviewPage::setBalance(const interfaces::WalletBalances& balances) ui->labelBalance->setText(BitcoinUnits::formatWithPrivacy(unit, balances.balance, BitcoinUnits::SeparatorStyle::ALWAYS, m_privacy)); ui->labelUnconfirmed->setText(BitcoinUnits::formatWithPrivacy(unit, balances.unconfirmed_balance, BitcoinUnits::SeparatorStyle::ALWAYS, m_privacy)); ui->labelImmature->setText(BitcoinUnits::formatWithPrivacy(unit, balances.immature_balance, BitcoinUnits::SeparatorStyle::ALWAYS, m_privacy)); - ui->labelTotal->setText(BitcoinUnits::formatWithPrivacy(unit, balances.balance + balances.unconfirmed_balance + balances.immature_balance, BitcoinUnits::SeparatorStyle::ALWAYS, m_privacy)); + ui->labelNonMempool->setText(BitcoinUnits::formatWithPrivacy(unit, balances.nonmempool_balance, BitcoinUnits::SeparatorStyle::ALWAYS, m_privacy)); + ui->labelTotal->setText(BitcoinUnits::formatWithPrivacy(unit, balances.balance + balances.unconfirmed_balance + balances.immature_balance + balances.nonmempool_balance, BitcoinUnits::SeparatorStyle::ALWAYS, m_privacy)); // only show immature (newly mined) balance if it's non-zero, so as not to complicate things // for the non-mining users bool showImmature = balances.immature_balance != 0; ui->labelImmature->setVisible(showImmature); ui->labelImmatureText->setVisible(showImmature); + + // likewise for non-mempool balances + bool showNonMempool = balances.nonmempool_balance != 0; + + ui->labelNonMempool->setVisible(showNonMempool); + ui->labelNonMempoolText->setVisible(showNonMempool); } void OverviewPage::setClientModel(ClientModel *model) @@ -296,5 +303,6 @@ void OverviewPage::setMonospacedFont(const QFont& f) ui->labelBalance->setFont(f); ui->labelUnconfirmed->setFont(f); ui->labelImmature->setFont(f); + ui->labelNonMempool->setFont(f); ui->labelTotal->setFont(f); } diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp index bb9e061851b..07a5eeda42c 100644 --- a/src/qt/test/wallettests.cpp +++ b/src/qt/test/wallettests.cpp @@ -301,7 +301,7 @@ void TestGUI(interfaces::Node& node, const std::shared_ptr& wallet) OverviewPage overviewPage(platformStyle.get()); overviewPage.setWalletModel(&walletModel); walletModel.pollBalanceChanged(); // Manual balance polling update - CompareBalance(walletModel, walletModel.wallet().getBalance(), overviewPage.findChild("labelBalance")); + CompareBalance(walletModel, walletModel.wallet().getBalances().balance, overviewPage.findChild("labelBalance")); // Check Request Payment button ReceiveCoinsDialog receiveCoinsDialog(platformStyle.get()); diff --git a/src/wallet/interfaces.cpp b/src/wallet/interfaces.cpp index ae6b9ff1911..031eae40205 100644 --- a/src/wallet/interfaces.cpp +++ b/src/wallet/interfaces.cpp @@ -375,7 +375,7 @@ class WalletImpl : public Wallet } WalletBalances getBalances() override { - const auto bal = GetBalance(*m_wallet); + const auto bal = GetBalance(*m_wallet, /*min_depth=*/0, /*avoid_reuse=*/true, /*include_nonmempool=*/true); WalletBalances result; result.balance = bal.m_mine_trusted; result.unconfirmed_balance = bal.m_mine_untrusted_pending;