diff --git a/src/appcontext.cpp b/src/appcontext.cpp index 7386af6..92f7b0f 100644 --- a/src/appcontext.cpp +++ b/src/appcontext.cpp @@ -793,16 +793,14 @@ void AppContext::storeWallet() { } void AppContext::updateBalance() { - if(!this->currentWallet) + if (!this->currentWallet) return; - AppContext::balance = this->currentWallet->balance() / globals::cdiv; - auto balance_str = QString::number(balance, 'f'); - - double unlocked = this->currentWallet->unlockedBalance() / globals::cdiv; - auto unlocked_str = QString::number(unlocked, 'f'); + quint64 balance_u = this->currentWallet->balance(); + AppContext::balance = balance_u / globals::cdiv; + double spendable = this->currentWallet->unlockedBalance(); - emit balanceUpdated(balance, unlocked, balance_str, unlocked_str); + emit balanceUpdated(balance_u, spendable); } void AppContext::syncStatusUpdated(quint64 height, quint64 target) { diff --git a/src/appcontext.h b/src/appcontext.h index 79e2942..6670b5e 100644 --- a/src/appcontext.h +++ b/src/appcontext.h @@ -138,7 +138,7 @@ private slots: void onConnectionStatusChanged(int status); signals: - void balanceUpdated(double balance, double unlocked, QString balance_str, QString unlocked_str); + void balanceUpdated(quint64 balance, quint64 spendable); void blockchainSync(int height, int target); void refreshSync(int height, int target); void synchronized(); diff --git a/src/dialog/balancedialog.cpp b/src/dialog/balancedialog.cpp new file mode 100644 index 0000000..4eeda35 --- /dev/null +++ b/src/dialog/balancedialog.cpp @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#include "balancedialog.h" +#include "ui_balancedialog.h" + +#include "libwalletqt/WalletManager.h" + +BalanceDialog::BalanceDialog(QWidget *parent, Wallet *wallet) + : QDialog(parent) + , ui(new Ui::BalanceDialog) +{ + ui->setupUi(this); + + ui->label_unconfirmed_help->setHelpText("Outputs require 10 confirmations before they become spendable. " + "This will take 20 minutes on average."); + + ui->label_unconfirmed->setText(WalletManager::displayAmount(wallet->balance() - wallet->unlockedBalance())); + ui->label_spendable->setText(WalletManager::displayAmount(wallet->unlockedBalance())); + ui->label_total->setText(WalletManager::displayAmount(wallet->balance())); + + this->adjustSize(); +} + +BalanceDialog::~BalanceDialog() { + delete ui; +} diff --git a/src/dialog/balancedialog.h b/src/dialog/balancedialog.h new file mode 100644 index 0000000..d28dd1c --- /dev/null +++ b/src/dialog/balancedialog.h @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright (c) 2020, The Monero Project. + +#ifndef FEATHER_BALANCEDIALOG_H +#define FEATHER_BALANCEDIALOG_H + +#include "libwalletqt/Wallet.h" + +#include + +namespace Ui { + class BalanceDialog; +} + +class BalanceDialog : public QDialog +{ + Q_OBJECT + +public: + explicit BalanceDialog(QWidget *parent, Wallet *wallet); + ~BalanceDialog() override; + +private: + Ui::BalanceDialog *ui; +}; + +#endif //FEATHER_BALANCEDIALOG_H diff --git a/src/dialog/balancedialog.ui b/src/dialog/balancedialog.ui new file mode 100644 index 0000000..c267fea --- /dev/null +++ b/src/dialog/balancedialog.ui @@ -0,0 +1,142 @@ + + + BalanceDialog + + + + 0 + 0 + 405 + 162 + + + + Balance + + + + + + + + Unconfirmed + + + + + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Spendable + + + + + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::Horizontal + + + + + + + Total + + + + + + + 0.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + + + + + + HelpLabel + QLabel +
components.h
+
+
+ + + + buttonBox + accepted() + BalanceDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + BalanceDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9b59c76..92846d0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -21,12 +21,14 @@ #include "dialog/broadcasttxdialog.h" #include "dialog/tximportdialog.h" #include "dialog/passworddialog.h" +#include "dialog/balancedialog.h" #include "utils/utils.h" #include "utils/config.h" #include "utils/daemonrpc.h" #include "components.h" #include "calcwindow.h" #include "ui_mainwindow.h" +#include "globals.h" // libwalletqt #include "libwalletqt/WalletManager.h" @@ -212,7 +214,6 @@ MainWindow::MainWindow(AppContext *ctx, QWidget *parent) : connect(this, &MainWindow::walletClosed, ui->xmrToWidget, &XMRToWidget::onWalletClosed); connect(this, &MainWindow::walletClosed, ui->sendWidget, &SendWidget::onWalletClosed); connect(m_ctx, &AppContext::balanceUpdated, this, &MainWindow::onBalanceUpdated); - connect(m_ctx, &AppContext::balanceUpdated, ui->xmrToWidget, &XMRToWidget::onBalanceUpdated); connect(m_ctx, &AppContext::walletOpened, this, &MainWindow::onWalletOpened); connect(m_ctx, &AppContext::walletClosed, this, QOverload<>::of(&MainWindow::onWalletClosed)); connect(m_ctx, &AppContext::walletOpenedError, this, &MainWindow::onWalletOpenedError); @@ -655,18 +656,18 @@ void MainWindow::onWalletOpened() { m_updateBytes.start(100); } -void MainWindow::onBalanceUpdated(double balance, double unlocked, const QString &balance_str, const QString &unlocked_str) { +void MainWindow::onBalanceUpdated(quint64 balance, quint64 spendable) { qDebug() << Q_FUNC_INFO; bool hide = config()->get(Config::hideBalance).toBool(); - auto label_str = QString("Balance: %1 XMR").arg(unlocked_str); - if(balance > unlocked) - label_str += QString(" (+%1 XMR unconfirmed)").arg(QString::number(balance - unlocked, 'f')); + QString label_str = QString("Balance: %1 XMR").arg(QString::number(spendable / globals::cdiv, 'f')); + if (balance > spendable) + label_str += QString(" (+%1 XMR unconfirmed)").arg(QString::number((balance - spendable) / globals::cdiv, 'f')); - if (hide) { + if (hide) label_str = "Balance: HIDDEN"; - } + m_statusLabelBalance->setToolTip("Click for details"); m_statusLabelBalance->setText(label_str); m_balanceWidget->setHidden(hide); } @@ -823,9 +824,11 @@ void MainWindow::create_status_bar() { m_statusLabelNetStats->setTextInteractionFlags(Qt::TextSelectableByMouse); this->statusBar()->addWidget(m_statusLabelNetStats); - m_statusLabelBalance = new QLabel("Balance: 0.00 XMR", this); + m_statusLabelBalance = new ClickableLabel(this); + m_statusLabelBalance->setText("Balance: 0.00 XMR"); m_statusLabelBalance->setTextInteractionFlags(Qt::TextSelectableByMouse); this->statusBar()->addPermanentWidget(m_statusLabelBalance); + connect(m_statusLabelBalance, &ClickableLabel::clicked, this, &MainWindow::showBalanceDialog); m_statusBtnConnectionStatusIndicator = new StatusBarButton(QIcon(":/assets/images/status_disconnected.svg"), "Connection status"); connect(m_statusBtnConnectionStatusIndicator, &StatusBarButton::clicked, this, &MainWindow::showConnectionStatusDialog); @@ -1322,6 +1325,15 @@ void MainWindow::rescanSpent() { } } +void MainWindow::showBalanceDialog() { + if (!m_ctx->currentWallet) { + return; + } + auto *dialog = new BalanceDialog(this, m_ctx->currentWallet); + dialog->exec(); + dialog->deleteLater(); +} + QString MainWindow::statusDots() { m_statusDots++; m_statusDots = m_statusDots % 4; diff --git a/src/mainwindow.h b/src/mainwindow.h index 2a6106e..35e2d08 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -133,7 +133,7 @@ public slots: void loadSignedTxFromText(); // libwalletqt - void onBalanceUpdated(double balance, double unlocked, const QString &balance_str, const QString &unlocked_str); + void onBalanceUpdated(quint64 balance, quint64 spendable); void onSynchronized(); void onWalletOpened(); void onWalletClosed(); @@ -169,6 +169,7 @@ private: void updateNetStats(); void rescanSpent(); void setStatusText(const QString &text); + void showBalanceDialog(); QString statusDots(); WalletWizard *createWizard(WalletWizard::Page startPage); @@ -192,7 +193,7 @@ private: TickerWidget *m_balanceWidget; // lower status bar - QLabel *m_statusLabelBalance; + ClickableLabel *m_statusLabelBalance; QLabel *m_statusLabelStatus; QLabel *m_statusLabelNetStats; StatusBarButton *m_statusBtnConnectionStatusIndicator; diff --git a/src/xmrtowidget.cpp b/src/xmrtowidget.cpp index 63acb98..2b4cf76 100644 --- a/src/xmrtowidget.cpp +++ b/src/xmrtowidget.cpp @@ -6,6 +6,7 @@ #include "dialog/xmrtoinfodialog.h" #include "libwalletqt/WalletManager.h" #include "mainwindow.h" +#include "globals.h" #include #include @@ -71,8 +72,8 @@ void XMRToWidget::setHistoryModel(XmrToModel *model) { this->ui->historyTable->setModel(model); } -void XMRToWidget::onBalanceUpdated(double balance, double unlocked, const QString &balance_str, const QString &unlocked_str) { - this->m_unlockedBalance = unlocked; +void XMRToWidget::onBalanceUpdated(quint64 balance, quint64 spendable) { + this->m_unlockedBalance = spendable / globals::cdiv; } void XMRToWidget::onWalletClosed() { diff --git a/src/xmrtowidget.h b/src/xmrtowidget.h index 2989384..5592f16 100644 --- a/src/xmrtowidget.h +++ b/src/xmrtowidget.h @@ -30,7 +30,7 @@ public slots: void onRatesUpdated(XmrToRates rates); void onTorCheckBoxToggled(int state); void onCreateOrder(); - void onBalanceUpdated(double balance, double unlocked, const QString &balance_str, const QString &unlocked_str); + void onBalanceUpdated(quint64 balance, quint64 spendable); void updateConversionLabel(); void onInitiateTransaction();