From 7d16bb387459de0fbf0cda3a5b97d6032cab1799 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Fri, 25 Oct 2013 16:10:43 +0200 Subject: [PATCH] qt: clean up signal handling in walletframe/walletview Use proper signals everywhere. Removes the need to store a pointer to the BitcoinGUI object in the walletview. Also removes the interdependence between setWalletModel / setBitcoinGUI. --- src/qt/walletframe.cpp | 9 +------ src/qt/walletframe.h | 6 ----- src/qt/walletview.cpp | 53 +++++++++++++++++++++++------------------- src/qt/walletview.h | 12 ++++++---- 4 files changed, 37 insertions(+), 43 deletions(-) diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp index dd1d69ec3..d2807f465 100644 --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -62,7 +62,7 @@ bool WalletFrame::setCurrentWallet(const QString& name) WalletView *walletView = mapWalletViews.value(name); walletStack->setCurrentWidget(walletView); - walletView->setEncryptionStatus(); + walletView->updateEncryptionStatus(); return true; } @@ -171,13 +171,6 @@ void WalletFrame::unlockWallet() walletView->unlockWallet(); } -void WalletFrame::setEncryptionStatus() -{ - WalletView *walletView = (WalletView*)walletStack->currentWidget(); - if (walletView) - walletView->setEncryptionStatus(); -} - void WalletFrame::usedSendingAddresses() { WalletView *walletView = (WalletView*)walletStack->currentWidget(); diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index 89983b4ae..edf2390db 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -75,12 +75,6 @@ public slots: void usedSendingAddresses(); /** Show used receiving addresses */ void usedReceivingAddresses(); - - /** Set the encryption status as shown in the UI. - @param[in] status current encryption status - @see WalletModel::EncryptionStatus - */ - void setEncryptionStatus(); }; #endif // WALLETFRAME_H diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index 57e64b082..982041c64 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -32,7 +32,6 @@ WalletView::WalletView(QWidget *parent): QStackedWidget(parent), - gui(0), clientModel(0), walletModel(0) { @@ -70,6 +69,9 @@ WalletView::WalletView(QWidget *parent): // Clicking on "Export" allows to export the transaction list connect(exportButton, SIGNAL(clicked()), transactionView, SLOT(exportClicked())); + + // Pass through messages from sendCoinsPage + connect(sendCoinsPage, SIGNAL(message(QString,QString,unsigned int)), this, SIGNAL(message(QString,QString,unsigned int))); } WalletView::~WalletView() @@ -78,8 +80,6 @@ WalletView::~WalletView() void WalletView::setBitcoinGUI(BitcoinGUI *gui) { - this->gui = gui; - if (gui) { // Clicking on a transaction on the overview page sends you to the transactions tab @@ -87,46 +87,51 @@ void WalletView::setBitcoinGUI(BitcoinGUI *gui) // Receive and report messages connect(this, SIGNAL(message(QString,QString,unsigned int)), gui, SLOT(message(QString,QString,unsigned int))); - connect(sendCoinsPage, SIGNAL(message(QString,QString,unsigned int)), gui, SLOT(message(QString,QString,unsigned int))); + + // Pass through encryption status changed signals + connect(this, SIGNAL(encryptionStatusChanged(int)), gui, SLOT(setEncryptionStatus(int))); + + // Pass through transaction notifications + connect(this, SIGNAL(incomingTransaction(QString,int,qint64,QString,QString)), gui, SLOT(incomingTransaction(QString,int,qint64,QString,QString))); } } void WalletView::setClientModel(ClientModel *clientModel) { this->clientModel = clientModel; - if (clientModel) - { - overviewPage->setClientModel(clientModel); - } + + overviewPage->setClientModel(clientModel); } void WalletView::setWalletModel(WalletModel *walletModel) { this->walletModel = walletModel; - if (walletModel && gui) + + // Put transaction list in tabs + transactionView->setModel(walletModel); + overviewPage->setWalletModel(walletModel); + receiveCoinsPage->setModel(walletModel); + sendCoinsPage->setModel(walletModel); + + if (walletModel) { // Receive and report messages from wallet thread - connect(walletModel, SIGNAL(message(QString,QString,unsigned int)), gui, SLOT(message(QString,QString,unsigned int))); + connect(walletModel, SIGNAL(message(QString,QString,unsigned int)), this, SIGNAL(message(QString,QString,unsigned int))); - // Put transaction list in tabs - transactionView->setModel(walletModel); - overviewPage->setWalletModel(walletModel); - receiveCoinsPage->setModel(walletModel); - sendCoinsPage->setModel(walletModel); - - setEncryptionStatus(); - connect(walletModel, SIGNAL(encryptionStatusChanged(int)), gui, SLOT(setEncryptionStatus(int))); + // Handle changes in encryption status + connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SIGNAL(encryptionStatusChanged(int))); + updateEncryptionStatus(); // Balloon pop-up for new transaction connect(walletModel->getTransactionTableModel(), SIGNAL(rowsInserted(QModelIndex,int,int)), - this, SLOT(incomingTransaction(QModelIndex,int,int))); + this, SLOT(processNewTransaction(QModelIndex,int,int))); // Ask for passphrase if needed connect(walletModel, SIGNAL(requireUnlock()), this, SLOT(unlockWallet())); } } -void WalletView::incomingTransaction(const QModelIndex& parent, int start, int /*end*/) +void WalletView::processNewTransaction(const QModelIndex& parent, int start, int /*end*/) { // Prevent balloon-spam when initial block download is in progress if (!walletModel || !clientModel || clientModel->inInitialBlockDownload()) @@ -139,7 +144,7 @@ void WalletView::incomingTransaction(const QModelIndex& parent, int start, int / QString type = ttm->index(start, TransactionTableModel::Type, parent).data().toString(); QString address = ttm->index(start, TransactionTableModel::ToAddress, parent).data().toString(); - gui->incomingTransaction(date, walletModel->getOptionsModel()->getDisplayUnit(), amount, type, address); + emit incomingTransaction(date, walletModel->getOptionsModel()->getDisplayUnit(), amount, type, address); } void WalletView::gotoOverviewPage() @@ -199,9 +204,9 @@ void WalletView::showOutOfSyncWarning(bool fShow) overviewPage->showOutOfSyncWarning(fShow); } -void WalletView::setEncryptionStatus() +void WalletView::updateEncryptionStatus() { - gui->setEncryptionStatus(walletModel->getEncryptionStatus()); + emit encryptionStatusChanged(walletModel->getEncryptionStatus()); } void WalletView::encryptWallet(bool status) @@ -212,7 +217,7 @@ void WalletView::encryptWallet(bool status) dlg.setModel(walletModel); dlg.exec(); - setEncryptionStatus(); + updateEncryptionStatus(); } void WalletView::backupWallet() diff --git a/src/qt/walletview.h b/src/qt/walletview.h index 60544cbf8..61515047c 100644 --- a/src/qt/walletview.h +++ b/src/qt/walletview.h @@ -55,7 +55,6 @@ public: void showOutOfSyncWarning(bool fShow); private: - BitcoinGUI *gui; ClientModel *clientModel; WalletModel *walletModel; @@ -85,7 +84,7 @@ public slots: The new items are those between start and end inclusive, under the given parent item. */ - void incomingTransaction(const QModelIndex& parent, int start, int /*end*/); + void processNewTransaction(const QModelIndex& parent, int start, int /*end*/); /** Encrypt the wallet */ void encryptWallet(bool status); /** Backup the wallet */ @@ -100,14 +99,17 @@ public slots: /** Show used receiving addresses */ void usedReceivingAddresses(); - void setEncryptionStatus(); - + /** Re-emit encryption status signal */ + void updateEncryptionStatus(); signals: /** Signal that we want to show the main window */ void showNormalIfMinimized(); - /** Fired when a message should be reported to the user */ void message(const QString &title, const QString &message, unsigned int style); + /** Encryption status of wallet changed */ + void encryptionStatusChanged(int status); + /** Notify that a new transaction appeared */ + void incomingTransaction(const QString& date, int unit, qint64 amount, const QString& type, const QString& address); }; #endif // WALLETVIEW_H