Skip to content

Commit

Permalink
Use WalletBalances struct in Qt
Browse files Browse the repository at this point in the history
Suggested by John Newbery <john@johnnewbery.com>
bitcoin#10244 (comment)
  • Loading branch information
ryanofsky authored and xdustinface committed Sep 27, 2020
1 parent e3acd49 commit 498e008
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 68 deletions.
67 changes: 30 additions & 37 deletions src/qt/overviewpage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <qt/clientmodel.h>
#include <qt/guiutil.h>
#include <init.h>
#include <interface/node.h>
#include <qt/optionsmodel.h>
#include <qt/transactionfilterproxy.h>
#include <qt/transactiontablemodel.h>
Expand All @@ -29,6 +30,8 @@
#define NUM_ITEMS_ENABLED_NORMAL 7
#define NUM_ITEMS_ENABLED_ADVANCED 9

Q_DECLARE_METATYPE(interface::WalletBalances)

class TxViewDelegate : public QAbstractItemDelegate
{
Q_OBJECT
Expand Down Expand Up @@ -116,12 +119,6 @@ OverviewPage::OverviewPage(QWidget* parent) :
ui(new Ui::OverviewPage),
clientModel(0),
walletModel(0),
currentBalance(-1),
currentUnconfirmedBalance(-1),
currentImmatureBalance(-1),
currentWatchOnlyBalance(-1),
currentWatchUnconfBalance(-1),
currentWatchImmatureBalance(-1),
cachedNumISLocks(-1),
txdelegate(new TxViewDelegate(this))
{
Expand All @@ -144,6 +141,8 @@ OverviewPage::OverviewPage(QWidget* parent) :
ui->labelSpendable
}, GUIUtil::FontWeight::Bold);

m_balances.balance = -1;

// Recent transactions
ui->listTransactions->setItemDelegate(txdelegate);
// Note: minimum height of listTransactions will be set later in updateAdvancedPSUI() to reflect actual settings
Expand Down Expand Up @@ -190,30 +189,25 @@ OverviewPage::~OverviewPage()
delete ui;
}

void OverviewPage::setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance, const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance)
void OverviewPage::setBalance(const interface::WalletBalances& balances)
{
currentBalance = balance;
currentUnconfirmedBalance = unconfirmedBalance;
currentImmatureBalance = immatureBalance;
currentAnonymizedBalance = anonymizedBalance;
currentWatchOnlyBalance = watchOnlyBalance;
currentWatchUnconfBalance = watchUnconfBalance;
currentWatchImmatureBalance = watchImmatureBalance;
ui->labelBalance->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, balance, false, BitcoinUnits::separatorAlways));
ui->labelUnconfirmed->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, unconfirmedBalance, false, BitcoinUnits::separatorAlways));
ui->labelImmature->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, immatureBalance, false, BitcoinUnits::separatorAlways));
ui->labelAnonymized->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, anonymizedBalance, false, BitcoinUnits::separatorAlways));
ui->labelTotal->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, balance + unconfirmedBalance + immatureBalance, false, BitcoinUnits::separatorAlways));
ui->labelWatchAvailable->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, watchOnlyBalance, false, BitcoinUnits::separatorAlways));
ui->labelWatchPending->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, watchUnconfBalance, false, BitcoinUnits::separatorAlways));
ui->labelWatchImmature->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, watchImmatureBalance, false, BitcoinUnits::separatorAlways));
ui->labelWatchTotal->setText(BitcoinUnits::floorHtmlWithUnit(nDisplayUnit, watchOnlyBalance + watchUnconfBalance + watchImmatureBalance, false, BitcoinUnits::separatorAlways));

// only show immature (newly mined) balance if it's non-zero or in UI debug mode, so as not to complicate things
int unit = walletModel->getOptionsModel()->getDisplayUnit();
m_balances = balances;
ui->labelBalance->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.balance, false, BitcoinUnits::separatorAlways));
ui->labelUnconfirmed->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.unconfirmed_balance, false, BitcoinUnits::separatorAlways));
ui->labelImmature->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.immature_balance, false, BitcoinUnits::separatorAlways));
ui->labelAnonymized->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.anonymized_balance, false, BitcoinUnits::separatorAlways));
ui->labelTotal->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.balance + balances.unconfirmed_balance + balances.immature_balance, false, BitcoinUnits::separatorAlways));
ui->labelWatchAvailable->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.watch_only_balance, false, BitcoinUnits::separatorAlways));
ui->labelWatchPending->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.unconfirmed_watch_only_balance, false, BitcoinUnits::separatorAlways));
ui->labelWatchImmature->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.immature_watch_only_balance, false, BitcoinUnits::separatorAlways));
ui->labelWatchTotal->setText(BitcoinUnits::floorHtmlWithUnit(unit, balances.watch_only_balance + balances.unconfirmed_watch_only_balance + balances.immature_watch_only_balance, false, BitcoinUnits::separatorAlways));

// only show immature (newly mined) balance if it's non-zero, so as not to complicate things
// for the non-mining users
bool fDebugUI = gArgs.GetBoolArg("-debug-ui", false);
bool showImmature = fDebugUI || immatureBalance != 0;
bool showWatchOnlyImmature = fDebugUI || watchImmatureBalance != 0;
bool showImmature = fDebugUI || balances.immature_balance != 0;
bool showWatchOnlyImmature = fDebugUI || balances.immature_watch_only_balance != 0;

// for symmetry reasons also show immature label when the watch-only one is shown
ui->labelImmature->setVisible(showImmature || showWatchOnlyImmature);
Expand Down Expand Up @@ -273,9 +267,8 @@ void OverviewPage::setWalletModel(WalletModel *model)
// Keep up to date with wallet
interface::Wallet& wallet = model->wallet();
interface::WalletBalances balances = wallet.getBalances();
setBalance(balances.balance, balances.unconfirmed_balance, balances.immature_balance, balances.anonymized_balance,
balances.watch_only_balance, balances.unconfirmed_watch_only_balance, balances.immature_watch_only_balance);
connect(model, SIGNAL(balanceChanged(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)), this, SLOT(setBalance(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)));
setBalance(balances);
connect(model, SIGNAL(balanceChanged(interface::WalletBalances)), this, SLOT(setBalance(interface::WalletBalances)));

connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
updateWatchOnlyLabels(wallet.haveWatchOnly() || gArgs.GetBoolArg("-debug-ui", false));
Expand Down Expand Up @@ -303,9 +296,9 @@ void OverviewPage::updateDisplayUnit()
if(walletModel && walletModel->getOptionsModel())
{
nDisplayUnit = walletModel->getOptionsModel()->getDisplayUnit();
if(currentBalance != -1)
setBalance(currentBalance, currentUnconfirmedBalance, currentImmatureBalance, currentAnonymizedBalance,
currentWatchOnlyBalance, currentWatchUnconfBalance, currentWatchImmatureBalance);
if (m_balances.balance != -1) {
setBalance(m_balances);
}

// Update txdelegate->unit with the current unit
txdelegate->unit = nDisplayUnit;
Expand Down Expand Up @@ -336,7 +329,7 @@ void OverviewPage::updatePrivateSendProgress()
QString strAmountAndRounds;
QString strPrivateSendAmount = BitcoinUnits::formatHtmlWithUnit(nDisplayUnit, CPrivateSendClientOptions::GetAmount() * COIN, false, BitcoinUnits::separatorAlways);

if(currentBalance == 0)
if(m_balances.balance == 0)
{
ui->privateSendProgress->setValue(0);
ui->privateSendProgress->setToolTip(tr("No inputs detected"));
Expand All @@ -352,7 +345,7 @@ void OverviewPage::updatePrivateSendProgress()

CAmount nAnonymizableBalance = walletModel->wallet().getAnonymizableBalance(false, false);

CAmount nMaxToAnonymize = nAnonymizableBalance + currentAnonymizedBalance;
CAmount nMaxToAnonymize = nAnonymizableBalance + m_balances.anonymized_balance;

// If it's more than the anon threshold, limit to that.
if (nMaxToAnonymize > CPrivateSendClientOptions::GetAmount() * COIN) nMaxToAnonymize = CPrivateSendClientOptions::GetAmount() * COIN;
Expand Down Expand Up @@ -407,7 +400,7 @@ void OverviewPage::updatePrivateSendProgress()
anonNormPart = anonNormPart > 1 ? 1 : anonNormPart;
anonNormPart *= 100;

anonFullPart = (float)currentAnonymizedBalance / nMaxToAnonymize;
anonFullPart = (float)m_balances.anonymized_balance / nMaxToAnonymize;
anonFullPart = anonFullPart > 1 ? 1 : anonFullPart;
anonFullPart *= 100;

Expand Down Expand Up @@ -637,7 +630,7 @@ void OverviewPage::togglePrivateSend(){

if (!privateSendClientManager->IsMixing()) {
const CAmount nMinAmount = CPrivateSend::GetSmallestDenomination() + CPrivateSend::GetMaxCollateralAmount();
if(currentBalance < nMinAmount){
if(m_balances.balance < nMinAmount) {
QString strMinAmount(BitcoinUnits::formatWithUnit(nDisplayUnit, nMinAmount));
QMessageBox::warning(this, "PrivateSend",
tr("PrivateSend requires at least %1 to use.").arg(strMinAmount),
Expand Down
13 changes: 3 additions & 10 deletions src/qt/overviewpage.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#ifndef BITCOIN_QT_OVERVIEWPAGE_H
#define BITCOIN_QT_OVERVIEWPAGE_H

#include <amount.h>
#include <interface/wallet.h>

#include <QWidget>
#include <memory>
Expand Down Expand Up @@ -38,8 +38,7 @@ class OverviewPage : public QWidget

public Q_SLOTS:
void privateSendStatus(bool fForce = false);
void setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance,
const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance);
void setBalance(const interface::WalletBalances& balances);

Q_SIGNALS:
void transactionClicked(const QModelIndex &index);
Expand All @@ -50,16 +49,10 @@ public Q_SLOTS:
Ui::OverviewPage *ui;
ClientModel *clientModel;
WalletModel *walletModel;
CAmount currentBalance;
CAmount currentUnconfirmedBalance;
CAmount currentImmatureBalance;
CAmount currentAnonymizedBalance;
CAmount currentWatchOnlyBalance;
CAmount currentWatchUnconfBalance;
CAmount currentWatchImmatureBalance;
int nDisplayUnit;
bool fShowAdvancedPSUI;
int cachedNumISLocks;
interface::WalletBalances m_balances;

TxViewDelegate *txdelegate;
std::unique_ptr<TransactionFilterProxy> filter;
Expand Down
23 changes: 7 additions & 16 deletions src/qt/sendcoinsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,9 +190,8 @@ void SendCoinsDialog::setModel(WalletModel *_model)
}

interface::WalletBalances balances = _model->wallet().getBalances();
setBalance(balances.balance, balances.unconfirmed_balance, balances.immature_balance, balances.anonymized_balance,
balances.watch_only_balance, balances.unconfirmed_watch_only_balance, balances.immature_watch_only_balance);
connect(_model, SIGNAL(balanceChanged(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)), this, SLOT(setBalance(CAmount,CAmount,CAmount,CAmount,CAmount,CAmount,CAmount)));
setBalance(balances);
connect(_model, SIGNAL(balanceChanged(interface::WalletBalances)), this, SLOT(setBalance(interface::WalletBalances)));
connect(_model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this, SLOT(updateDisplayUnit()));
updateDisplayUnit();

Expand Down Expand Up @@ -614,23 +613,15 @@ bool SendCoinsDialog::handlePaymentRequest(const SendCoinsRecipient &rv)
return true;
}

void SendCoinsDialog::setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance,
const CAmount& watchBalance, const CAmount& watchUnconfirmedBalance, const CAmount& watchImmatureBalance)
void SendCoinsDialog::setBalance(const interface::WalletBalances& balances)
{
Q_UNUSED(unconfirmedBalance);
Q_UNUSED(immatureBalance);
Q_UNUSED(anonymizedBalance);
Q_UNUSED(watchBalance);
Q_UNUSED(watchUnconfirmedBalance);
Q_UNUSED(watchImmatureBalance);

if(model && model->getOptionsModel())
{
uint64_t bal = 0;
CAmount bal = 0;
if (fPrivateSend) {
bal = anonymizedBalance;
bal = balances.anonymized_balance;
} else {
bal = balance;
bal = balances.balance;
}

ui->labelBalance->setText(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), bal));
Expand All @@ -639,7 +630,7 @@ void SendCoinsDialog::setBalance(const CAmount& balance, const CAmount& unconfir

void SendCoinsDialog::updateDisplayUnit()
{
setBalance(model->wallet().getBalance(), 0, 0, model->wallet().getAnonymizedBalance(), 0, 0, 0);
setBalance(model->wallet().getBalances());
coinControlUpdateLabels();
ui->customFee->setDisplayUnit(model->getOptionsModel()->getDisplayUnit());
updateMinFeeLabel();
Expand Down
3 changes: 1 addition & 2 deletions src/qt/sendcoinsdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ public Q_SLOTS:
void accept();
SendCoinsEntry *addEntry();
void updateTabsAndLabels();
void setBalance(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance,
const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance);
void setBalance(const interface::WalletBalances& balances);

Q_SIGNALS:
void coinsSent(const uint256& txid);
Expand Down
2 changes: 1 addition & 1 deletion src/qt/walletmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ void WalletModel::checkBalanceChanged(const interface::WalletBalances& new_balan
{
if(new_balances.balanceChanged(m_cached_balances)) {
m_cached_balances = new_balances;
Q_EMIT balanceChanged(new_balances.balance, new_balances.unconfirmed_balance, new_balances.immature_balance, new_balances.anonymized_balance, new_balances.watch_only_balance, new_balances.unconfirmed_watch_only_balance, new_balances.immature_watch_only_balance);
Q_EMIT balanceChanged(new_balances);
}
}

Expand Down
3 changes: 1 addition & 2 deletions src/qt/walletmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,7 @@ class WalletModel : public QObject

Q_SIGNALS:
// Signal that balance in wallet changed
void balanceChanged(const CAmount& balance, const CAmount& unconfirmedBalance, const CAmount& immatureBalance, const CAmount& anonymizedBalance,
const CAmount& watchOnlyBalance, const CAmount& watchUnconfBalance, const CAmount& watchImmatureBalance);
void balanceChanged(const interface::WalletBalances& balances);

// Encryption status of wallet changed
void encryptionStatusChanged();
Expand Down

0 comments on commit 498e008

Please sign in to comment.