From 146ba964e4b784171c29600e959a0fae3e2e0c03 Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Tue, 12 Nov 2013 14:54:43 +0100 Subject: [PATCH] qt: GUI support for -disablewallet mode --- src/qt/bitcoin.cpp | 19 ++++++++++++++----- src/qt/bitcoingui.cpp | 21 +++++++++++++++++++++ src/qt/bitcoingui.h | 3 +++ src/qt/walletframe.cpp | 29 ++++++++++++++++++++--------- src/qt/walletframe.h | 2 ++ 5 files changed, 60 insertions(+), 14 deletions(-) diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 54f96f442..57ce7da36 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -313,11 +313,16 @@ int main(int argc, char *argv[]) splash.finish(&window); ClientModel clientModel(&optionsModel); - WalletModel walletModel(pwalletMain, &optionsModel); + WalletModel *walletModel = 0; + if(pwalletMain) + walletModel = new WalletModel(pwalletMain, &optionsModel); window.setClientModel(&clientModel); - window.addWallet("~Default", &walletModel); - window.setCurrentWallet("~Default"); + if(walletModel) + { + window.addWallet("~Default", walletModel); + window.setCurrentWallet("~Default"); + } // If -min option passed, start window minimized. if(GetBoolArg("-min", false)) @@ -335,8 +340,11 @@ int main(int argc, char *argv[]) &window, SLOT(handlePaymentRequest(SendCoinsRecipient))); QObject::connect(&window, SIGNAL(receivedURI(QString)), paymentServer, SLOT(handleURIOrFile(QString))); - QObject::connect(&walletModel, SIGNAL(coinsSent(CWallet*,SendCoinsRecipient,QByteArray)), - paymentServer, SLOT(fetchPaymentACK(CWallet*,const SendCoinsRecipient&,QByteArray))); + if(walletModel) + { + QObject::connect(walletModel, SIGNAL(coinsSent(CWallet*,SendCoinsRecipient,QByteArray)), + paymentServer, SLOT(fetchPaymentACK(CWallet*,const SendCoinsRecipient&,QByteArray))); + } QObject::connect(paymentServer, SIGNAL(message(QString,QString,unsigned int)), guiref, SLOT(message(QString,QString,unsigned int))); QTimer::singleShot(100, paymentServer, SLOT(uiReady())); @@ -347,6 +355,7 @@ int main(int argc, char *argv[]) window.setClientModel(0); window.removeAllWallets(); guiref = 0; + delete walletModel; } // Shutdown the core and its threads, but don't exit Bitcoin-Qt here threadGroup.interrupt_all(); diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 8b0aba1b5..a1becc12e 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -163,6 +163,9 @@ BitcoinGUI::BitcoinGUI(bool fIsTestnet, QWidget *parent) : // Install event filter to be able to catch status tip events (QEvent::StatusTip) this->installEventFilter(this); + + // Initially wallet actions should be disabled + setWalletActionsEnabled(false); } BitcoinGUI::~BitcoinGUI() @@ -352,6 +355,7 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel) bool BitcoinGUI::addWallet(const QString& name, WalletModel *walletModel) { + setWalletActionsEnabled(true); return walletFrame->addWallet(name, walletModel); } @@ -362,9 +366,26 @@ bool BitcoinGUI::setCurrentWallet(const QString& name) void BitcoinGUI::removeAllWallets() { + setWalletActionsEnabled(false); walletFrame->removeAllWallets(); } +void BitcoinGUI::setWalletActionsEnabled(bool enabled) +{ + overviewAction->setEnabled(enabled); + sendCoinsAction->setEnabled(enabled); + receiveCoinsAction->setEnabled(enabled); + historyAction->setEnabled(enabled); + encryptWalletAction->setEnabled(enabled); + backupWalletAction->setEnabled(enabled); + changePassphraseAction->setEnabled(enabled); + signMessageAction->setEnabled(enabled); + verifyMessageAction->setEnabled(enabled); + usedSendingAddressesAction->setEnabled(enabled); + usedReceivingAddressesAction->setEnabled(enabled); + openAction->setEnabled(enabled); +} + void BitcoinGUI::createTrayIcon(bool fIsTestnet) { #ifndef Q_OS_MAC diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index acbc38c89..b9a8a0313 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -108,6 +108,9 @@ private: /** Create system tray menu (or setup the dock menu) */ void createTrayIconMenu(); + /** Enable or disable all wallet-related actions */ + void setWalletActionsEnabled(bool enabled); + signals: /** Signal raised when a URI was entered or dragged to the GUI */ void receivedURI(const QString &uri); diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp index 04eea5916..fead02292 100644 --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -10,6 +10,7 @@ #include #include +#include WalletFrame::WalletFrame(BitcoinGUI *_gui) : QFrame(_gui), @@ -21,6 +22,10 @@ WalletFrame::WalletFrame(BitcoinGUI *_gui) : walletStack = new QStackedWidget(this); walletFrameLayout->setContentsMargins(0,0,0,0); walletFrameLayout->addWidget(walletStack); + + QLabel *noWallet = new QLabel(tr("No wallet has been loaded.")); + noWallet->setAlignment(Qt::AlignCenter); + walletStack->addWidget(noWallet); } WalletFrame::~WalletFrame() @@ -85,7 +90,7 @@ void WalletFrame::removeAllWallets() bool WalletFrame::handlePaymentRequest(const SendCoinsRecipient &recipient) { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (!walletView) return false; @@ -130,56 +135,62 @@ void WalletFrame::gotoSendCoinsPage(QString addr) void WalletFrame::gotoSignMessageTab(QString addr) { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (walletView) walletView->gotoSignMessageTab(addr); } void WalletFrame::gotoVerifyMessageTab(QString addr) { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (walletView) walletView->gotoVerifyMessageTab(addr); } void WalletFrame::encryptWallet(bool status) { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (walletView) walletView->encryptWallet(status); } void WalletFrame::backupWallet() { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (walletView) walletView->backupWallet(); } void WalletFrame::changePassphrase() { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (walletView) walletView->changePassphrase(); } void WalletFrame::unlockWallet() { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (walletView) walletView->unlockWallet(); } void WalletFrame::usedSendingAddresses() { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (walletView) walletView->usedSendingAddresses(); } void WalletFrame::usedReceivingAddresses() { - WalletView *walletView = (WalletView*)walletStack->currentWidget(); + WalletView *walletView = currentWalletView(); if (walletView) walletView->usedReceivingAddresses(); } + +WalletView *WalletFrame::currentWalletView() +{ + return qobject_cast(walletStack->currentWidget()); +} + diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h index 8cfaa0e1d..f1830a0d6 100644 --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -45,6 +45,8 @@ private: bool bOutOfSync; + WalletView *currentWalletView(); + public slots: /** Switch to overview (home) page */ void gotoOverviewPage();