From 163145938ca2ff52e633136ca49e89f880f8e89b Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Fri, 18 Oct 2013 18:43:07 +0200 Subject: [PATCH] qt: remove awkward way of setting GUI pages Selecting the button for a pages was going through bitcoingui->walletframe->walletview->bitcoingui. Because of this, the actions for the pages had to be exposed on the BitcoinGUI object. --- doc/multiwallet-qt.md | 14 +++++--------- src/qt/bitcoingui.cpp | 5 +++++ src/qt/bitcoingui.h | 8 -------- src/qt/walletframe.cpp | 13 ++++++++++++- src/qt/walletframe.h | 2 +- src/qt/walletview.cpp | 12 +++++------- 6 files changed, 28 insertions(+), 26 deletions(-) diff --git a/doc/multiwallet-qt.md b/doc/multiwallet-qt.md index 8d695552b5..3caab81807 100644 --- a/doc/multiwallet-qt.md +++ b/doc/multiwallet-qt.md @@ -4,7 +4,7 @@ Multiwallet Qt Development and Integration Strategy In order to support loading of multiple wallets in bitcoin-qt, a few changes in the UI architecture will be needed. Fortunately, only four of the files in the existing project are affected by this change. -Three new classes have been implemented in three new .h/.cpp file pairs, with much of the functionality that was previously +Two new classes have been implemented in two new .h/.cpp file pairs, with much of the functionality that was previously implemented in the BitcoinGUI class moved over to these new classes. The two existing files most affected, by far, are bitcoingui.h and bitcoingui.cpp, as the BitcoinGUI class will require @@ -12,7 +12,7 @@ some major retrofitting. Only requiring some minor changes is bitcoin.cpp. -Finally, three new headers and source files will have to be added to bitcoin-qt.pro. +Finally, two new headers and source files will have to be added to bitcoin-qt.pro. Changes to class BitcoinGUI --------------------------- @@ -23,13 +23,9 @@ A new class called *WalletView* inheriting from QStackedWidget has been written these page views. In addition to owning these five page views, a WalletView also has a pointer to a WalletModel instance. This allows the construction of multiple WalletView objects, each rendering a distinct wallet. -A second class called *WalletStack*, also inheriting from QStackedWidget, has been written to handle switching focus between -different loaded wallets. In its current implementation, as a QStackedWidget, only one wallet can be viewed at a time - -but this can be changed later. - -A third class called *WalletFrame* inheriting from QFrame has been written as a container for embedding all wallet-related -controls into BitcoinGUI. At present it just contains a WalletStack instance and does little more than passing on messages -from BitcoinGUI to the WalletStack, which in turn passes them to the individual WalletViews. It is a WalletFrame instance +A second class called *WalletFrame* inheriting from QFrame has been written as a container for embedding all wallet-related +controls into BitcoinGUI. At present it contains the WalletView instances for the wallets and does little more than passing on messages +from BitcoinGUI to the currently selected WalletView. It is a WalletFrame instance that takes the place of what used to be centralWidget in BitcoinGUI. The purpose of this class is to allow future refinements of the wallet controls with minimal need for further modifications to BitcoinGUI, thus greatly simplifying merges while reducing the risk of breaking top-level stuff. diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 23a221120f..3336a8afd3 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -447,26 +447,31 @@ void BitcoinGUI::aboutClicked() void BitcoinGUI::gotoOverviewPage() { + overviewAction->setChecked(true); if (walletFrame) walletFrame->gotoOverviewPage(); } void BitcoinGUI::gotoHistoryPage() { + historyAction->setChecked(true); if (walletFrame) walletFrame->gotoHistoryPage(); } void BitcoinGUI::gotoAddressBookPage() { + addressBookAction->setChecked(true); if (walletFrame) walletFrame->gotoAddressBookPage(); } void BitcoinGUI::gotoReceiveCoinsPage() { + receiveCoinsAction->setChecked(true); if (walletFrame) walletFrame->gotoReceiveCoinsPage(); } void BitcoinGUI::gotoSendCoinsPage(QString addr) { + sendCoinsAction->setChecked(true); if (walletFrame) walletFrame->gotoSendCoinsPage(addr); } diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index e2dd5dc6bc..e5a92fed93 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -61,14 +61,6 @@ public: void removeAllWallets(); - /** Used by WalletView to allow access to needed QActions */ - // Todo: Use Qt signals for these - QAction * getOverviewAction() { return overviewAction; } - QAction * getHistoryAction() { return historyAction; } - QAction * getAddressBookAction() { return addressBookAction; } - QAction * getReceiveCoinsAction() { return receiveCoinsAction; } - QAction * getSendCoinsAction() { return sendCoinsAction; } - protected: void changeEvent(QEvent *e); void closeEvent(QCloseEvent *event); diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp index 56b081170a..f754bd5e71 100644 --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -44,7 +44,8 @@ bool WalletFrame::addWallet(const QString& name, WalletModel *walletModel) walletView->setWalletModel(walletModel); walletView->showOutOfSyncWarning(bOutOfSync); - walletView->gotoOverviewPage(); /* XXX we should go to the currently selected page */ + /* TODO we should goto the currently selected page once dynamically adding wallets is supported */ + walletView->gotoOverviewPage(); walletStack->addWidget(walletView); mapWalletViews[name] = walletView; @@ -65,6 +66,16 @@ bool WalletFrame::setCurrentWallet(const QString& name) return true; } +bool WalletFrame::removeWallet(const QString &name) +{ + if (mapWalletViews.count(name) == 0) + return false; + + WalletView *walletView = mapWalletViews.take(name); + walletStack->removeWidget(walletView); + return true; +} + void WalletFrame::removeAllWallets() { QMap::const_iterator i; diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index 4cc6d14e41..5011987963 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -32,7 +32,7 @@ public: bool addWallet(const QString& name, WalletModel *walletModel); bool setCurrentWallet(const QString& name); - + bool removeWallet(const QString &name); void removeAllWallets(); bool handlePaymentRequest(const SendCoinsRecipient& recipient); diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index 39678690ce..d7cef971ed 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -64,7 +64,6 @@ WalletView::WalletView(QWidget *parent): addWidget(sendCoinsPage); // Clicking on a transaction on the overview page simply sends you to transaction history page - connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), this, SLOT(gotoHistoryPage())); connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), transactionView, SLOT(focusTransaction(QModelIndex))); // Double-clicking on a transaction on the transaction history page shows details @@ -87,6 +86,10 @@ WalletView::~WalletView() void WalletView::setBitcoinGUI(BitcoinGUI *gui) { this->gui = gui; + if(gui) + { + connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), gui, SLOT(gotoHistoryPage())); + } } void WalletView::setClientModel(ClientModel *clientModel) @@ -103,7 +106,7 @@ void WalletView::setClientModel(ClientModel *clientModel) void WalletView::setWalletModel(WalletModel *walletModel) { this->walletModel = walletModel; - if (walletModel) + if (walletModel && gui) { // Receive and report messages from wallet thread connect(walletModel, SIGNAL(message(QString,QString,unsigned int)), gui, SLOT(message(QString,QString,unsigned int))); @@ -145,31 +148,26 @@ void WalletView::incomingTransaction(const QModelIndex& parent, int start, int / void WalletView::gotoOverviewPage() { - gui->getOverviewAction()->setChecked(true); setCurrentWidget(overviewPage); } void WalletView::gotoHistoryPage() { - gui->getHistoryAction()->setChecked(true); setCurrentWidget(transactionsPage); } void WalletView::gotoAddressBookPage() { - gui->getAddressBookAction()->setChecked(true); setCurrentWidget(addressBookPage); } void WalletView::gotoReceiveCoinsPage() { - gui->getReceiveCoinsAction()->setChecked(true); setCurrentWidget(receiveCoinsPage); } void WalletView::gotoSendCoinsPage(QString addr) { - gui->getSendCoinsAction()->setChecked(true); setCurrentWidget(sendCoinsPage); if (!addr.isEmpty())