mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-12-12 13:43:43 +01:00
Merge bitcoin-core/gui#598: Avoid recalculating the wallet balance - use model cache
4584d300a4GUI: remove now unneeded 'm_balances' field from overviewpage (furszy)050e8b1391GUI: 'getAvailableBalance', use cached balance if the user did not select UTXO manually (furszy)96e3264a82GUI: use cached balance in overviewpage and sendcoinsdialog (furszy)321335bf02GUI: add getter for WalletModel::m_cached_balances field (furszy)e62958dc81GUI: sendCoinsDialog, remove duplicate wallet().getBalances() call (furszy) Pull request description: As per the title says, we are recalculating the entire wallet balance on different situations calling to `wallet().getBalances()`, when should instead make use of the wallet model cached balance. This has the benefits of (1) not spending resources calculating a balance that we already have cached, and (2) avoid blocking the main thread for a long time, in case of big wallets, walking through the entire wallet's tx map more than what it's really needed. Changes: 1) Fix: `SendCoinsDialog` was calling `wallet().getBalances()` twice during `setModel`. 2) Use the cached balance if the user did not select any UTXO manually inside the wallet model `getAvailableBalance` call. ----------------------- As an extra note, this work born in [#25005](https://github.com/bitcoin/bitcoin/pull/25005) but grew out of scope of it. ACKs for top commit: jarolrod: ACK4584d300a4hebasto: re-ACK4584d300a4, only suggested changes and commit message formatting since my [recent](https://github.com/bitcoin-core/gui/pull/598#pullrequestreview-1071268192) review. Tree-SHA512: 6633ce7f9a82a3e46e75aa7295df46c80a4cd4a9f3305427af203c9bc8670573fa8a1927f14a279260c488cc975a08d238faba2e9751588086fea1dcf8ea2b28
This commit is contained in:
@@ -147,8 +147,6 @@ OverviewPage::OverviewPage(const PlatformStyle *platformStyle, QWidget *parent)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
m_balances.balance = -1;
|
||||
|
||||
// use a SingleColorIcon for the "out of sync warning" icon
|
||||
QIcon icon = m_platform_style->SingleColorIcon(QStringLiteral(":/icons/warning"));
|
||||
ui->labelTransactionsStatus->setIcon(icon);
|
||||
@@ -177,8 +175,9 @@ void OverviewPage::handleTransactionClicked(const QModelIndex &index)
|
||||
void OverviewPage::setPrivacy(bool privacy)
|
||||
{
|
||||
m_privacy = privacy;
|
||||
if (m_balances.balance != -1) {
|
||||
setBalance(m_balances);
|
||||
const auto& balances = walletModel->getCachedBalance();
|
||||
if (balances.balance != -1) {
|
||||
setBalance(balances);
|
||||
}
|
||||
|
||||
ui->listTransactions->setVisible(!m_privacy);
|
||||
@@ -197,7 +196,6 @@ OverviewPage::~OverviewPage()
|
||||
void OverviewPage::setBalance(const interfaces::WalletBalances& balances)
|
||||
{
|
||||
BitcoinUnit unit = walletModel->getOptionsModel()->getDisplayUnit();
|
||||
m_balances = balances;
|
||||
if (walletModel->wallet().isLegacy()) {
|
||||
if (walletModel->wallet().privateKeysDisabled()) {
|
||||
ui->labelBalance->setText(BitcoinUnits::formatWithPrivacy(unit, balances.watch_only_balance, BitcoinUnits::SeparatorStyle::ALWAYS, m_privacy));
|
||||
@@ -276,14 +274,13 @@ void OverviewPage::setWalletModel(WalletModel *model)
|
||||
ui->listTransactions->setModelColumn(TransactionTableModel::ToAddress);
|
||||
|
||||
// Keep up to date with wallet
|
||||
interfaces::Wallet& wallet = model->wallet();
|
||||
interfaces::WalletBalances balances = wallet.getBalances();
|
||||
setBalance(balances);
|
||||
setBalance(model->getCachedBalance());
|
||||
connect(model, &WalletModel::balanceChanged, this, &OverviewPage::setBalance);
|
||||
|
||||
connect(model->getOptionsModel(), &OptionsModel::displayUnitChanged, this, &OverviewPage::updateDisplayUnit);
|
||||
|
||||
updateWatchOnlyLabels(wallet.haveWatchOnly() && !model->wallet().privateKeysDisabled());
|
||||
interfaces::Wallet& wallet = model->wallet();
|
||||
updateWatchOnlyLabels(wallet.haveWatchOnly() && !wallet.privateKeysDisabled());
|
||||
connect(model, &WalletModel::notifyWatchonlyChanged, [this](bool showWatchOnly) {
|
||||
updateWatchOnlyLabels(showWatchOnly && !walletModel->wallet().privateKeysDisabled());
|
||||
});
|
||||
@@ -306,10 +303,10 @@ void OverviewPage::changeEvent(QEvent* e)
|
||||
|
||||
void OverviewPage::updateDisplayUnit()
|
||||
{
|
||||
if(walletModel && walletModel->getOptionsModel())
|
||||
{
|
||||
if (m_balances.balance != -1) {
|
||||
setBalance(m_balances);
|
||||
if (walletModel && walletModel->getOptionsModel()) {
|
||||
const auto& balances = walletModel->getCachedBalance();
|
||||
if (balances.balance != -1) {
|
||||
setBalance(balances);
|
||||
}
|
||||
|
||||
// Update txdelegate->unit with the current unit
|
||||
|
||||
Reference in New Issue
Block a user