Skip to content

Commit

Permalink
Merge bitcoin-core/gui#29: refactor: Optimize signal-slot connections…
Browse files Browse the repository at this point in the history
… logic

62cb8d9 qt: Drop BitcoinGUI* WalletFrame data member (Hennadii Stepanov)
f73e5c9 qt: Move CreateWalletActivity connection from WalletFrame to BitcoinGUI (Hennadii Stepanov)
20e2e24 qt: Move WalletView connections from WalletFrame to BitcoinGUI (Hennadii Stepanov)

Pull request description:

  This PR:
  - implements an idea from bitcoin#17937 (comment)
  - simplifies `WalletFrame` class interface
  - as a side effect, removes `bitcoingui` -> `walletframe` -> `bitcoingui` circular dependency
  - is an alternative to bitcoin#17500

ACKs for top commit:
  promag:
    Tested ACK 62cb8d9 on macos 11.2.3 with depends build.
  jarolrod:
    ACK 62cb8d9

Tree-SHA512: 633b526a8499ba9ab4b16928daf4de4f6d610284bb9fa51891cad35300a03bde740df3466a71b46e87a62121330fcc9e606eac7666ea5e45fa6d5785b60dcbbd
  • Loading branch information
hebasto authored and knst committed Sep 26, 2024
1 parent 3be79a9 commit 7d9ce32
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 32 deletions.
22 changes: 21 additions & 1 deletion src/qt/bitcoingui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,11 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const NetworkStyle* networkStyle,
connect(walletFrame, &WalletFrame::message, [this](const QString& title, const QString& message, unsigned int style) {
this->message(title, message, style);
});
connect(walletFrame, &WalletFrame::createWalletButtonClicked, [this] {
auto activity = new CreateWalletActivity(getWalletController(), this);
connect(activity, &CreateWalletActivity::finished, activity, &QObject::deleteLater);
activity->create();
});
} else
#endif // ENABLE_WALLET
{
Expand Down Expand Up @@ -913,7 +918,10 @@ WalletController* BitcoinGUI::getWalletController()
void BitcoinGUI::addWallet(WalletModel* walletModel)
{
if (!walletFrame) return;
if (!walletFrame->addWallet(walletModel)) return;

WalletView* wallet_view = new WalletView(walletFrame);
if (!walletFrame->addWallet(walletModel, wallet_view)) return;

rpcConsole->addWallet(walletModel);
if (m_wallet_selector->count() == 0) {
setWalletActionsEnabled(true);
Expand All @@ -922,6 +930,18 @@ void BitcoinGUI::addWallet(WalletModel* walletModel)
}
const QString display_name = walletModel->getDisplayName();
m_wallet_selector->addItem(display_name, QVariant::fromValue(walletModel));

connect(wallet_view, &WalletView::outOfSyncWarningClicked, walletFrame, &WalletFrame::outOfSyncWarningClicked);
connect(wallet_view, &WalletView::transactionClicked, this, &BitcoinGUI::gotoHistoryPage);
connect(wallet_view, &WalletView::coinsSent, this, &BitcoinGUI::gotoHistoryPage);
connect(wallet_view, &WalletView::message, [this](const QString& title, const QString& message, unsigned int style) {
this->message(title, message, style);
});
connect(wallet_view, &WalletView::encryptionStatusChanged, this, &BitcoinGUI::updateWalletStatus);
connect(wallet_view, &WalletView::incomingTransaction, this, &BitcoinGUI::incomingTransaction);
connect(wallet_view, &WalletView::hdEnabledStatusChanged, this, &BitcoinGUI::updateWalletStatus);
connect(this, &BitcoinGUI::setPrivacy, wallet_view, &WalletView::setPrivacy);
wallet_view->setPrivacy(isPrivacyModeActivated());
}

void BitcoinGUI::removeWallet(WalletModel* walletModel)
Expand Down
31 changes: 5 additions & 26 deletions src/qt/walletframe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,11 @@
#include <fs.h>
#include <node/ui_interface.h>
#include <psbt.h>
#include <qt/bitcoingui.h>
#include <qt/createwalletdialog.h>
#include <qt/governancelist.h>
#include <qt/guiutil.h>
#include <qt/masternodelist.h>
#include <qt/overviewpage.h>
#include <qt/psbtoperationsdialog.h>
#include <qt/walletcontroller.h>
#include <qt/walletmodel.h>
#include <qt/walletview.h>
#include <util/system.h>
Expand All @@ -30,9 +27,8 @@
#include <QPushButton>
#include <QVBoxLayout>

WalletFrame::WalletFrame(BitcoinGUI* _gui)
: QFrame(_gui),
gui(_gui),
WalletFrame::WalletFrame(QWidget* parent)
: QFrame(parent),
m_size_hint(OverviewPage{nullptr}.sizeHint())
{
// Leave HBox hook for adding a list view later
Expand All @@ -53,11 +49,7 @@ WalletFrame::WalletFrame(BitcoinGUI* _gui)

// A button for create wallet dialog
QPushButton* create_wallet_button = new QPushButton(tr("Create a new wallet"), walletStack);
connect(create_wallet_button, &QPushButton::clicked, [this] {
auto activity = new CreateWalletActivity(gui->getWalletController(), this);
connect(activity, &CreateWalletActivity::finished, activity, &QObject::deleteLater);
activity->create();
});
connect(create_wallet_button, &QPushButton::clicked, this, &WalletFrame::createWalletButtonClicked);
no_wallet_layout->addWidget(create_wallet_button, 0, Qt::AlignHCenter | Qt::AlignTop);
no_wallet_group->setLayout(no_wallet_layout);

Expand Down Expand Up @@ -86,17 +78,15 @@ void WalletFrame::setClientModel(ClientModel *_clientModel)
}
}

bool WalletFrame::addWallet(WalletModel *walletModel)
bool WalletFrame::addWallet(WalletModel* walletModel, WalletView* walletView)
{
if (!gui || !clientModel || !walletModel) return false;
if (!clientModel || !walletModel) return false;

if (mapWalletViews.count(walletModel) > 0) return false;

WalletView* walletView = new WalletView(this);
walletView->setClientModel(clientModel);
walletView->setWalletModel(walletModel);
walletView->showOutOfSyncWarning(bOutOfSync);
walletView->setPrivacy(gui->isPrivacyModeActivated());

WalletView* current_wallet_view = currentWalletView();
if (current_wallet_view) {
Expand All @@ -108,17 +98,6 @@ bool WalletFrame::addWallet(WalletModel *walletModel)
walletStack->addWidget(walletView);
mapWalletViews[walletModel] = walletView;

connect(walletView, &WalletView::outOfSyncWarningClicked, this, &WalletFrame::outOfSyncWarningClicked);
connect(walletView, &WalletView::transactionClicked, gui, &BitcoinGUI::gotoHistoryPage);
connect(walletView, &WalletView::coinsSent, gui, &BitcoinGUI::gotoHistoryPage);
connect(walletView, &WalletView::message, [this](const QString& title, const QString& message, unsigned int style) {
gui->message(title, message, style);
});
connect(walletView, &WalletView::encryptionStatusChanged, gui, &BitcoinGUI::updateWalletStatus);
connect(walletView, &WalletView::incomingTransaction, gui, &BitcoinGUI::incomingTransaction);
connect(walletView, &WalletView::hdEnabledStatusChanged, gui, &BitcoinGUI::updateWalletStatus);
connect(gui, &BitcoinGUI::setPrivacy, walletView, &WalletView::setPrivacy);

return true;
}

Expand Down
8 changes: 4 additions & 4 deletions src/qt/walletframe.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#include <QGroupBox>
#include <QMap>

class BitcoinGUI;
class ClientModel;
class SendCoinsRecipient;
class WalletModel;
Expand All @@ -33,12 +32,12 @@ class WalletFrame : public QFrame
Q_OBJECT

public:
explicit WalletFrame(BitcoinGUI* _gui = nullptr);
explicit WalletFrame(QWidget* parent);
~WalletFrame();

void setClientModel(ClientModel *clientModel);

bool addWallet(WalletModel *walletModel);
bool addWallet(WalletModel* walletModel, WalletView* walletView);
void setCurrentWallet(WalletModel* wallet_model);
void removeWallet(WalletModel* wallet_model);
void removeAllWallets();
Expand All @@ -54,9 +53,10 @@ class WalletFrame : public QFrame
/** Notify that the user has requested more information about the out-of-sync warning */
void requestedSyncWarningInfo();

void createWalletButtonClicked();

private:
QStackedWidget *walletStack;
BitcoinGUI *gui;
ClientModel *clientModel;
QMap<WalletModel*, WalletView*> mapWalletViews;
QGroupBox* no_wallet_group;
Expand Down
1 change: 0 additions & 1 deletion test/lint/lint-circular-dependencies.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ EXPECTED_CIRCULAR_DEPENDENCIES=(
"index/coinstatsindex -> node/coinstats -> index/coinstatsindex"
"policy/fees -> txmempool -> policy/fees"
"qt/addresstablemodel -> qt/walletmodel -> qt/addresstablemodel"
"qt/bitcoingui -> qt/walletframe -> qt/bitcoingui"
"qt/recentrequeststablemodel -> qt/walletmodel -> qt/recentrequeststablemodel"
"qt/transactiontablemodel -> qt/walletmodel -> qt/transactiontablemodel"
"txmempool -> validation -> txmempool"
Expand Down

0 comments on commit 7d9ce32

Please sign in to comment.