Skip to content

Commit

Permalink
Use WalletBalances struct in Qt
Browse files Browse the repository at this point in the history
Summary:
Suggested by John Newbery <john@johnnewbery.com>
bitcoin/bitcoin#10244 (comment)

Partial backport of Core PR 10244
bitcoin/bitcoin@9a61eed
Progress towards T417
Depends on D2889

Test Plan:
make check
ninja check
bitcoin-qt # sanity checks

Reviewers: deadalnix, Fabien, #bitcoin_abc

Reviewed By: Fabien, #bitcoin_abc

Differential Revision: https://reviews.bitcoinabc.org/D2899
  • Loading branch information
ryanofsky authored and jonspock committed Jun 13, 2019
1 parent 2694f48 commit 0cee177
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 112 deletions.
1 change: 1 addition & 0 deletions src/interfaces/wallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ namespace {
WalletBalances getBalances() override {
WalletBalances result;
result.balance = m_wallet.GetBalance();
result.currentBalanceOptional = result.balance; // copy balance
result.unconfirmed_balance = m_wallet.GetUnconfirmedBalance();
result.immature_balance = m_wallet.GetImmatureBalance();
result.have_watch_only = m_wallet.HaveWatchOnly();
Expand Down
11 changes: 11 additions & 0 deletions src/interfaces/wallet.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@
#include <support/allocators/secure.h> // For SecureString
#include <ui_interface.h> // For ChangeType

#ifdef HAVE_VARIANT
#include <optional>
#else
#include <boost/optional.hpp>
#endif

#include <cstdint>
#include <functional>
#include <map>
Expand Down Expand Up @@ -266,6 +272,11 @@ struct WalletAddress {

//! Collection of wallet balances.
struct WalletBalances {
#ifdef HAVE_VARIANT
std::optional<Amount> currentBalanceOptional;
#else
boost::optional<Amount> currentBalanceOptional;
#endif
Amount balance = Amount::zero();
Amount unconfirmed_balance = Amount::zero();
Amount immature_balance = Amount::zero();
Expand Down
86 changes: 35 additions & 51 deletions src/qt/overviewpage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
#define DECORATION_SIZE 54
#define NUM_ITEMS 5

Q_DECLARE_METATYPE(interfaces::WalletBalances)

class TxViewDelegate : public QAbstractItemDelegate {
Q_OBJECT
public:
Expand Down Expand Up @@ -113,15 +115,10 @@ class TxViewDelegate : public QAbstractItemDelegate {
int unit;
const PlatformStyle *platformStyle;
};

#include "overviewpage.moc"
#include <qt/overviewpage.moc>

OverviewPage::OverviewPage(const PlatformStyle *platformStyle, QWidget *parent)
: QWidget(parent), ui(new Ui::OverviewPage), clientModel(nullptr), walletModel(nullptr),
currentBalance(0), currentUnconfirmedBalance(0),
currentImmatureBalance(0), currentWatchOnlyBalance(0),
currentWatchUnconfBalance(0),
currentWatchImmatureBalance(0),
txdelegate(new TxViewDelegate(platformStyle, this)) {
ui->setupUi(this);

Expand Down Expand Up @@ -177,44 +174,41 @@ OverviewPage::~OverviewPage() {
delete ui;
}

void OverviewPage::setBalance(const Amount balance,
const Amount unconfirmedBalance,
const Amount immatureBalance,
const Amount watchOnlyBalance,
const Amount watchUnconfBalance,
const Amount watchImmatureBalance) {
void OverviewPage::setBalance(const interfaces::WalletBalances &balances) {
int unit = walletModel->getOptionsModel()->getDisplayUnit();
currentBalanceOptional = balance;
currentBalance = balance;
currentUnconfirmedBalance = unconfirmedBalance;
currentImmatureBalance = immatureBalance;
currentWatchOnlyBalance = watchOnlyBalance;
currentWatchUnconfBalance = watchUnconfBalance;
currentWatchImmatureBalance = watchImmatureBalance;
m_balances = balances;
ui->labelBalance->setText(BitcoinUnits::formatWithUnit(
unit, balance, false, BitcoinUnits::separatorAlways));
ui->labelUnconfirmed->setText(BitcoinUnits::formatWithUnit(
unit, unconfirmedBalance, false, BitcoinUnits::separatorAlways));
unit, balances.balance, false, BitcoinUnits::separatorAlways));
ui->labelUnconfirmed->setText(
BitcoinUnits::formatWithUnit(unit, balances.unconfirmed_balance, false,
BitcoinUnits::separatorAlways));
ui->labelImmature->setText(BitcoinUnits::formatWithUnit(
unit, immatureBalance, false, BitcoinUnits::separatorAlways));
unit, balances.immature_balance, false, BitcoinUnits::separatorAlways));
ui->labelTotal->setText(BitcoinUnits::formatWithUnit(
unit, balance + unconfirmedBalance + immatureBalance, false,
BitcoinUnits::separatorAlways));
ui->labelWatchAvailable->setText(BitcoinUnits::formatWithUnit(
unit, watchOnlyBalance, false, BitcoinUnits::separatorAlways));
unit,
balances.balance + balances.unconfirmed_balance +
balances.immature_balance,
false, BitcoinUnits::separatorAlways));
ui->labelWatchAvailable->setText(
BitcoinUnits::formatWithUnit(unit, balances.watch_only_balance, false,
BitcoinUnits::separatorAlways));
ui->labelWatchPending->setText(BitcoinUnits::formatWithUnit(
unit, watchUnconfBalance, false, BitcoinUnits::separatorAlways));
ui->labelWatchImmature->setText(BitcoinUnits::formatWithUnit(
unit, watchImmatureBalance, false, BitcoinUnits::separatorAlways));
unit, balances.unconfirmed_watch_only_balance, false,
BitcoinUnits::separatorAlways));
ui->labelWatchImmature->setText(
BitcoinUnits::formatWithUnit(unit, balances.immature_watch_only_balance,
false, BitcoinUnits::separatorAlways));
ui->labelWatchTotal->setText(BitcoinUnits::formatWithUnit(
unit, watchOnlyBalance + watchUnconfBalance + watchImmatureBalance,
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 showImmature = immatureBalance != Amount::zero();
bool showWatchOnlyImmature = watchImmatureBalance != Amount::zero();
// complicate things for the non-mining users
bool showImmature = balances.immature_balance != Amount::zero();
bool showWatchOnlyImmature =
balances.immature_watch_only_balance != Amount::zero();

// for symmetry reasons also show immature label when the watch-only one is
// shown
Expand Down Expand Up @@ -256,16 +250,9 @@ void OverviewPage::setWalletModel(WalletModel *model) {
// Keep up to date with wallet
interfaces::Wallet &wallet = model->wallet();
interfaces::WalletBalances balances = wallet.getBalances();
setBalance(balances.balance, balances.unconfirmed_balance,
balances.immature_balance, balances.watch_only_balance,
balances.unconfirmed_watch_only_balance,
balances.immature_watch_only_balance);
connect(
model,
SIGNAL(
balanceChanged(Amount, Amount, Amount, Amount, Amount, Amount)),
this,
SLOT(setBalance(Amount, Amount, Amount, Amount, Amount, Amount)));
setBalance(balances);
connect(model, SIGNAL(balanceChanged(interfaces::WalletBalances)), this,
SLOT(setBalance(interfaces::WalletBalances)));

connect(model->getOptionsModel(), SIGNAL(displayUnitChanged(int)), this,
SLOT(updateDisplayUnit()));
Expand All @@ -282,15 +269,12 @@ void OverviewPage::setWalletModel(WalletModel *model) {
void OverviewPage::updateDisplayUnit() {
if (walletModel && walletModel->getOptionsModel()) {
#ifdef HAVE_VARIANT
if (currentBalanceOptional != std::nullopt) {
if (m_balances.currentBalanceOptional != std::nullopt) {
#else
if (currentBalanceOptional.is_initialized()) {
if (m_balances.currentBalanceOptional.is_initialized()) {
#endif
setBalance(currentBalance, currentUnconfirmedBalance,
currentImmatureBalance, currentWatchOnlyBalance,
currentWatchUnconfBalance, currentWatchImmatureBalance);
setBalance(m_balances);
}

// Update txdelegate->unit with the current unit
txdelegate->unit = walletModel->getOptionsModel()->getDisplayUnit();

Expand Down
24 changes: 3 additions & 21 deletions src/qt/overviewpage.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,7 @@
#include "transactionview.h"


#ifdef HAVE_VARIANT
#include <optional>
#else
#include <boost/optional.hpp>
#endif

#include <interfaces/wallet.h>

#include <QWidget>
#include <memory>
Expand Down Expand Up @@ -49,10 +44,7 @@ class OverviewPage : public QWidget {
TransactionView *transactionView;

public Q_SLOTS:
void setBalance(const Amount balance, const Amount unconfirmedBalance,
const Amount immatureBalance, const Amount watchOnlyBalance,
const Amount watchUnconfBalance,
const Amount watchImmatureBalance);
void setBalance(const interfaces::WalletBalances &balances);

Q_SIGNALS:
// void transactionClicked(const QModelIndex &index);
Expand All @@ -62,17 +54,7 @@ public Q_SLOTS:
Ui::OverviewPage *ui;
ClientModel *clientModel;
WalletModel *walletModel;
#ifdef HAVE_VARIANT
std::optional<Amount> currentBalanceOptional;
#else
boost::optional<Amount> currentBalanceOptional;
#endif
Amount currentBalance;
Amount currentUnconfirmedBalance;
Amount currentImmatureBalance;
Amount currentWatchOnlyBalance;
Amount currentWatchUnconfBalance;
Amount currentWatchImmatureBalance;
interfaces::WalletBalances m_balances;

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

interfaces::WalletBalances balances = _model->wallet().getBalances();
setBalance(balances.balance, balances.unconfirmed_balance,
balances.immature_balance, balances.watch_only_balance,
balances.unconfirmed_watch_only_balance,
balances.immature_watch_only_balance);
connect(
_model,
SIGNAL(
balanceChanged(Amount, Amount, Amount, Amount, Amount, Amount)),
this,
SLOT(setBalance(Amount, Amount, Amount, Amount, Amount, Amount)));
setBalance(balances);
connect(_model, SIGNAL(balanceChanged(interfaces::WalletBalances)),
this, SLOT(setBalance(interfaces::WalletBalances)));
connect(_model->getOptionsModel(), SIGNAL(displayUnitChanged(int)),
this, SLOT(updateDisplayUnit()));
updateDisplayUnit();
Expand Down Expand Up @@ -530,27 +523,15 @@ bool SendCoinsDialog::handlePaymentRequest(const SendCoinsRecipient &rv) {
return true;
}

void SendCoinsDialog::setBalance(const Amount balance,
const Amount unconfirmedBalance,
const Amount immatureBalance,
const Amount watchBalance,
const Amount watchUnconfirmedBalance,
const Amount watchImmatureBalance) {
Q_UNUSED(unconfirmedBalance);
Q_UNUSED(immatureBalance);
Q_UNUSED(watchBalance);
Q_UNUSED(watchUnconfirmedBalance);
Q_UNUSED(watchImmatureBalance);

void SendCoinsDialog::setBalance(const interfaces::WalletBalances &balances) {
if (model && model->getOptionsModel()) {
ui->labelBalance->setText(BitcoinUnits::formatWithUnit(
model->getOptionsModel()->getDisplayUnit(), balance));
model->getOptionsModel()->getDisplayUnit(), balances.balance));
}
}

void SendCoinsDialog::updateDisplayUnit() {
setBalance(model->wallet().getBalance(), Amount::zero(), Amount::zero(),
Amount::zero(), Amount::zero(), Amount::zero());
setBalance(model->wallet().getBalances());
ui->customFee->setDisplayUnit(model->getOptionsModel()->getDisplayUnit());
updateMinFeeLabel();
updateSmartFeeLabel();
Expand Down
7 changes: 2 additions & 5 deletions src/qt/sendcoinsdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#ifndef BITCOIN_QT_SENDCOINSDIALOG_H
#define BITCOIN_QT_SENDCOINSDIALOG_H

#include "walletmodel.h"
#include <qt/walletmodel.h>

#include <QDialog>
#include <QMessageBox>
Expand Down Expand Up @@ -55,10 +55,7 @@ public Q_SLOTS:
void accept() override;
SendCoinsEntry *addEntry();
void updateTabsAndLabels();
void setBalance(const Amount balance, const Amount unconfirmedBalance,
const Amount immatureBalance, const Amount watchOnlyBalance,
const Amount watchUnconfBalance,
const Amount watchImmatureBalance);
void setBalance(const interfaces::WalletBalances &balances);

Q_SIGNALS:
void coinsSent(const uint256 &txid);
Expand Down
6 changes: 1 addition & 5 deletions src/qt/walletmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,7 @@ void WalletModel::checkBalanceChanged(
const interfaces::WalletBalances &new_balances) {
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.watch_only_balance,
new_balances.unconfirmed_watch_only_balance,
new_balances.immature_watch_only_balance);
Q_EMIT balanceChanged(new_balances);
}
}

Expand Down
6 changes: 1 addition & 5 deletions src/qt/walletmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,11 +226,7 @@ class WalletModel : public QObject {

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

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

0 comments on commit 0cee177

Please sign in to comment.