Browse Source

Merge pull request #3109 from laanwj/2013_10_remove_walletstack

qt: merge walletstack and walletframe
0.10
Wladimir J. van der Laan 11 years ago
parent
commit
00f198c9a5
  1. 14
      doc/multiwallet-qt.md
  2. 6
      src/qt/Makefile.am
  3. 5
      src/qt/bitcoingui.cpp
  4. 8
      src/qt/bitcoingui.h
  5. 117
      src/qt/walletframe.cpp
  6. 16
      src/qt/walletframe.h
  7. 174
      src/qt/walletstack.cpp
  8. 104
      src/qt/walletstack.h
  9. 35
      src/qt/walletview.cpp
  10. 3
      src/qt/walletview.h

14
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. 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. 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. 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 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. 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 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. 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. 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 A second class called *WalletFrame* inheriting from QFrame has been written as a container for embedding all wallet-related
different loaded wallets. In its current implementation, as a QStackedWidget, only one wallet can be viewed at a time - controls into BitcoinGUI. At present it contains the WalletView instances for the wallets and does little more than passing on messages
but this can be changed later. from BitcoinGUI to the currently selected WalletView. It is a WalletFrame instance
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
that takes the place of what used to be centralWidget in BitcoinGUI. The purpose of this class is to allow future 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 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. merges while reducing the risk of breaking top-level stuff.

6
src/qt/Makefile.am

@ -51,7 +51,7 @@ QT_MOC_CPP = moc_aboutdialog.cpp moc_addressbookpage.cpp \
moc_signverifymessagedialog.cpp moc_splashscreen.cpp moc_trafficgraphwidget.cpp moc_transactiondesc.cpp \ moc_signverifymessagedialog.cpp moc_splashscreen.cpp moc_trafficgraphwidget.cpp moc_transactiondesc.cpp \
moc_transactiondescdialog.cpp moc_transactionfilterproxy.cpp \ moc_transactiondescdialog.cpp moc_transactionfilterproxy.cpp \
moc_transactiontablemodel.cpp moc_transactionview.cpp moc_walletframe.cpp \ moc_transactiontablemodel.cpp moc_transactionview.cpp moc_walletframe.cpp \
moc_walletmodel.cpp moc_walletstack.cpp moc_walletview.cpp moc_walletmodel.cpp moc_walletview.cpp
BITCOIN_MM = macdockiconhandler.mm macnotificationhandler.mm BITCOIN_MM = macdockiconhandler.mm macnotificationhandler.mm
QR_CPP = qrcodedialog.cpp QR_CPP = qrcodedialog.cpp
@ -75,7 +75,7 @@ BITCOIN_QT_H = aboutdialog.h addressbookpage.h addresstablemodel.h \
sendcoinsdialog.h sendcoinsentry.h signverifymessagedialog.h splashscreen.h \ sendcoinsdialog.h sendcoinsentry.h signverifymessagedialog.h splashscreen.h \
trafficgraphwidget.h transactiondescdialog.h transactiondesc.h transactionfilterproxy.h \ trafficgraphwidget.h transactiondescdialog.h transactiondesc.h transactionfilterproxy.h \
transactionrecord.h transactiontablemodel.h transactionview.h walletframe.h \ transactionrecord.h transactiontablemodel.h transactionview.h walletframe.h \
walletmodel.h walletmodeltransaction.h walletstack.h walletview.h walletmodel.h walletmodeltransaction.h walletview.h
RES_ICONS = res/icons/bitcoin.png res/icons/address-book.png \ RES_ICONS = res/icons/bitcoin.png res/icons/address-book.png \
res/icons/quit.png res/icons/send.png res/icons/toolbar.png \ res/icons/quit.png res/icons/send.png res/icons/toolbar.png \
@ -105,7 +105,7 @@ BITCOIN_QT_CPP = aboutdialog.cpp addressbookpage.cpp \
signverifymessagedialog.cpp splashscreen.cpp trafficgraphwidget.cpp transactiondesc.cpp \ signverifymessagedialog.cpp splashscreen.cpp trafficgraphwidget.cpp transactiondesc.cpp \
transactiondescdialog.cpp transactionfilterproxy.cpp transactionrecord.cpp \ transactiondescdialog.cpp transactionfilterproxy.cpp transactionrecord.cpp \
transactiontablemodel.cpp transactionview.cpp walletframe.cpp \ transactiontablemodel.cpp transactionview.cpp walletframe.cpp \
walletmodel.cpp walletmodeltransaction.cpp walletstack.cpp walletview.cpp walletmodel.cpp walletmodeltransaction.cpp walletview.cpp
RES_IMAGES = res/images/about.png res/images/splash.png \ RES_IMAGES = res/images/about.png res/images/splash.png \
res/images/splash_testnet.png res/images/splash_testnet.png

5
src/qt/bitcoingui.cpp

@ -447,26 +447,31 @@ void BitcoinGUI::aboutClicked()
void BitcoinGUI::gotoOverviewPage() void BitcoinGUI::gotoOverviewPage()
{ {
overviewAction->setChecked(true);
if (walletFrame) walletFrame->gotoOverviewPage(); if (walletFrame) walletFrame->gotoOverviewPage();
} }
void BitcoinGUI::gotoHistoryPage() void BitcoinGUI::gotoHistoryPage()
{ {
historyAction->setChecked(true);
if (walletFrame) walletFrame->gotoHistoryPage(); if (walletFrame) walletFrame->gotoHistoryPage();
} }
void BitcoinGUI::gotoAddressBookPage() void BitcoinGUI::gotoAddressBookPage()
{ {
addressBookAction->setChecked(true);
if (walletFrame) walletFrame->gotoAddressBookPage(); if (walletFrame) walletFrame->gotoAddressBookPage();
} }
void BitcoinGUI::gotoReceiveCoinsPage() void BitcoinGUI::gotoReceiveCoinsPage()
{ {
receiveCoinsAction->setChecked(true);
if (walletFrame) walletFrame->gotoReceiveCoinsPage(); if (walletFrame) walletFrame->gotoReceiveCoinsPage();
} }
void BitcoinGUI::gotoSendCoinsPage(QString addr) void BitcoinGUI::gotoSendCoinsPage(QString addr)
{ {
sendCoinsAction->setChecked(true);
if (walletFrame) walletFrame->gotoSendCoinsPage(addr); if (walletFrame) walletFrame->gotoSendCoinsPage(addr);
} }

8
src/qt/bitcoingui.h

@ -61,14 +61,6 @@ public:
void removeAllWallets(); 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: protected:
void changeEvent(QEvent *e); void changeEvent(QEvent *e);
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);

117
src/qt/walletframe.cpp

@ -5,20 +5,21 @@
* The Bitcoin Developers 2011-2013 * The Bitcoin Developers 2011-2013
*/ */
#include "walletframe.h" #include "walletframe.h"
#include "walletview.h"
#include "bitcoingui.h" #include "bitcoingui.h"
#include "walletstack.h"
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QMessageBox> #include <QMessageBox>
#include <QStackedWidget>
WalletFrame::WalletFrame(BitcoinGUI *_gui) : WalletFrame::WalletFrame(BitcoinGUI *_gui) :
QFrame(_gui) QFrame(_gui),
gui(_gui)
{ {
// Leave HBox hook for adding a list view later // Leave HBox hook for adding a list view later
QHBoxLayout *walletFrameLayout = new QHBoxLayout(this); QHBoxLayout *walletFrameLayout = new QHBoxLayout(this);
setContentsMargins(0,0,0,0); setContentsMargins(0,0,0,0);
walletStack = new WalletStack(this); walletStack = new QStackedWidget(this);
walletStack->setBitcoinGUI(_gui);
walletFrameLayout->setContentsMargins(0,0,0,0); walletFrameLayout->setContentsMargins(0,0,0,0);
walletFrameLayout->addWidget(walletStack); walletFrameLayout->addWidget(walletStack);
} }
@ -29,95 +30,157 @@ WalletFrame::~WalletFrame()
void WalletFrame::setClientModel(ClientModel *clientModel) void WalletFrame::setClientModel(ClientModel *clientModel)
{ {
if (clientModel) this->clientModel = clientModel;
walletStack->setClientModel(clientModel);
} }
bool WalletFrame::addWallet(const QString& name, WalletModel *walletModel) bool WalletFrame::addWallet(const QString& name, WalletModel *walletModel)
{ {
return walletStack->addWallet(name, walletModel); if (!gui || !clientModel || !walletModel || mapWalletViews.count(name) > 0)
return false;
WalletView *walletView = new WalletView(this);
walletView->setBitcoinGUI(gui);
walletView->setClientModel(clientModel);
walletView->setWalletModel(walletModel);
walletView->showOutOfSyncWarning(bOutOfSync);
/* TODO we should goto the currently selected page once dynamically adding wallets is supported */
walletView->gotoOverviewPage();
walletStack->addWidget(walletView);
mapWalletViews[name] = walletView;
// Ensure a walletView is able to show the main window
connect(walletView, SIGNAL(showNormalIfMinimized()), gui, SLOT(showNormalIfMinimized()));
return true;
} }
bool WalletFrame::setCurrentWallet(const QString& name) bool WalletFrame::setCurrentWallet(const QString& name)
{ {
// TODO: Check if valid name if (mapWalletViews.count(name) == 0)
return walletStack->setCurrentWallet(name); return false;
WalletView *walletView = mapWalletViews.value(name);
walletStack->setCurrentWidget(walletView);
walletView->setEncryptionStatus();
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() void WalletFrame::removeAllWallets()
{ {
walletStack->removeAllWallets(); QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
walletStack->removeWidget(i.value());
mapWalletViews.clear();
} }
bool WalletFrame::handlePaymentRequest(const SendCoinsRecipient &recipient) bool WalletFrame::handlePaymentRequest(const SendCoinsRecipient &recipient)
{ {
return walletStack->handlePaymentRequest(recipient); WalletView *walletView = (WalletView*)walletStack->currentWidget();
if (!walletView)
return false;
return walletView->handlePaymentRequest(recipient);
} }
void WalletFrame::showOutOfSyncWarning(bool fShow) void WalletFrame::showOutOfSyncWarning(bool fShow)
{ {
if (!walletStack) bOutOfSync = fShow;
return; QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
walletStack->showOutOfSyncWarning(fShow); i.value()->showOutOfSyncWarning(fShow);
} }
void WalletFrame::gotoOverviewPage() void WalletFrame::gotoOverviewPage()
{ {
walletStack->gotoOverviewPage(); QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoOverviewPage();
} }
void WalletFrame::gotoHistoryPage() void WalletFrame::gotoHistoryPage()
{ {
walletStack->gotoHistoryPage(); QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoHistoryPage();
} }
void WalletFrame::gotoAddressBookPage() void WalletFrame::gotoAddressBookPage()
{ {
walletStack->gotoAddressBookPage(); QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoAddressBookPage();
} }
void WalletFrame::gotoReceiveCoinsPage() void WalletFrame::gotoReceiveCoinsPage()
{ {
walletStack->gotoReceiveCoinsPage(); QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoReceiveCoinsPage();
} }
void WalletFrame::gotoSendCoinsPage(QString addr) void WalletFrame::gotoSendCoinsPage(QString addr)
{ {
walletStack->gotoSendCoinsPage(addr); QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoSendCoinsPage(addr);
} }
void WalletFrame::gotoSignMessageTab(QString addr) void WalletFrame::gotoSignMessageTab(QString addr)
{ {
walletStack->gotoSignMessageTab(addr); WalletView *walletView = (WalletView*)walletStack->currentWidget();
if (walletView)
walletView->gotoSignMessageTab(addr);
} }
void WalletFrame::gotoVerifyMessageTab(QString addr) void WalletFrame::gotoVerifyMessageTab(QString addr)
{ {
walletStack->gotoSignMessageTab(addr); WalletView *walletView = (WalletView*)walletStack->currentWidget();
if (walletView)
walletView->gotoVerifyMessageTab(addr);
} }
void WalletFrame::encryptWallet(bool status) void WalletFrame::encryptWallet(bool status)
{ {
walletStack->encryptWallet(status); WalletView *walletView = (WalletView*)walletStack->currentWidget();
if (walletView)
walletView->encryptWallet(status);
} }
void WalletFrame::backupWallet() void WalletFrame::backupWallet()
{ {
walletStack->backupWallet(); WalletView *walletView = (WalletView*)walletStack->currentWidget();
if (walletView)
walletView->backupWallet();
} }
void WalletFrame::changePassphrase() void WalletFrame::changePassphrase()
{ {
walletStack->changePassphrase(); WalletView *walletView = (WalletView*)walletStack->currentWidget();
if (walletView)
walletView->changePassphrase();
} }
void WalletFrame::unlockWallet() void WalletFrame::unlockWallet()
{ {
walletStack->unlockWallet(); WalletView *walletView = (WalletView*)walletStack->currentWidget();
if (walletView)
walletView->unlockWallet();
} }
void WalletFrame::setEncryptionStatus() void WalletFrame::setEncryptionStatus()
{ {
walletStack->setEncryptionStatus(); WalletView *walletView = (WalletView*)walletStack->currentWidget();
if (walletView)
walletView->setEncryptionStatus();
} }

16
src/qt/walletframe.h

@ -8,12 +8,17 @@
#define WALLETFRAME_H #define WALLETFRAME_H
#include <QFrame> #include <QFrame>
#include <QMap>
class BitcoinGUI; class BitcoinGUI;
class ClientModel; class ClientModel;
class SendCoinsRecipient; class SendCoinsRecipient;
class WalletModel; class WalletModel;
class WalletStack; class WalletView;
QT_BEGIN_NAMESPACE
class QStackedWidget;
QT_END_NAMESPACE
class WalletFrame : public QFrame class WalletFrame : public QFrame
{ {
@ -27,7 +32,7 @@ public:
bool addWallet(const QString& name, WalletModel *walletModel); bool addWallet(const QString& name, WalletModel *walletModel);
bool setCurrentWallet(const QString& name); bool setCurrentWallet(const QString& name);
bool removeWallet(const QString &name);
void removeAllWallets(); void removeAllWallets();
bool handlePaymentRequest(const SendCoinsRecipient& recipient); bool handlePaymentRequest(const SendCoinsRecipient& recipient);
@ -35,7 +40,12 @@ public:
void showOutOfSyncWarning(bool fShow); void showOutOfSyncWarning(bool fShow);
private: private:
WalletStack *walletStack; QStackedWidget *walletStack;
BitcoinGUI *gui;
ClientModel *clientModel;
QMap<QString, WalletView*> mapWalletViews;
bool bOutOfSync;
public slots: public slots:
/** Switch to overview (home) page */ /** Switch to overview (home) page */

174
src/qt/walletstack.cpp

@ -1,174 +0,0 @@
/*
* Qt4 bitcoin GUI.
*
* W.J. van der Laan 2011-2012
* The Bitcoin Developers 2011-2013
*/
#include "walletstack.h"
#include "walletview.h"
#include "bitcoingui.h"
#include <QMap>
#include <QMessageBox>
WalletStack::WalletStack(QWidget *parent) :
QStackedWidget(parent),
gui(0),
clientModel(0),
bOutOfSync(true)
{
setContentsMargins(0,0,0,0);
}
WalletStack::~WalletStack()
{
}
bool WalletStack::addWallet(const QString& name, WalletModel *walletModel)
{
if (!gui || !clientModel || !walletModel || mapWalletViews.count(name) > 0)
return false;
WalletView *walletView = new WalletView(this, gui);
walletView->setBitcoinGUI(gui);
walletView->setClientModel(clientModel);
walletView->setWalletModel(walletModel);
walletView->showOutOfSyncWarning(bOutOfSync);
addWidget(walletView);
mapWalletViews[name] = walletView;
// Ensure a walletView is able to show the main window
connect(walletView, SIGNAL(showNormalIfMinimized()), gui, SLOT(showNormalIfMinimized()));
return true;
}
bool WalletStack::removeWallet(const QString& name)
{
if (mapWalletViews.count(name) == 0)
return false;
WalletView *walletView = mapWalletViews.take(name);
removeWidget(walletView);
return true;
}
void WalletStack::removeAllWallets()
{
QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
removeWidget(i.value());
mapWalletViews.clear();
}
bool WalletStack::handlePaymentRequest(const SendCoinsRecipient &recipient)
{
WalletView *walletView = (WalletView*)currentWidget();
if (!walletView)
return false;
return walletView->handlePaymentRequest(recipient);
}
void WalletStack::showOutOfSyncWarning(bool fShow)
{
bOutOfSync = fShow;
QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->showOutOfSyncWarning(fShow);
}
void WalletStack::gotoOverviewPage()
{
QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoOverviewPage();
}
void WalletStack::gotoHistoryPage()
{
QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoHistoryPage();
}
void WalletStack::gotoAddressBookPage()
{
QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoAddressBookPage();
}
void WalletStack::gotoReceiveCoinsPage()
{
QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoReceiveCoinsPage();
}
void WalletStack::gotoSendCoinsPage(QString addr)
{
QMap<QString, WalletView*>::const_iterator i;
for (i = mapWalletViews.constBegin(); i != mapWalletViews.constEnd(); ++i)
i.value()->gotoSendCoinsPage(addr);
}
void WalletStack::gotoSignMessageTab(QString addr)
{
WalletView *walletView = (WalletView*)currentWidget();
if (walletView)
walletView->gotoSignMessageTab(addr);
}
void WalletStack::gotoVerifyMessageTab(QString addr)
{
WalletView *walletView = (WalletView*)currentWidget();
if (walletView)
walletView->gotoVerifyMessageTab(addr);
}
void WalletStack::encryptWallet(bool status)
{
WalletView *walletView = (WalletView*)currentWidget();
if (walletView)
walletView->encryptWallet(status);
}
void WalletStack::backupWallet()
{
WalletView *walletView = (WalletView*)currentWidget();
if (walletView)
walletView->backupWallet();
}
void WalletStack::changePassphrase()
{
WalletView *walletView = (WalletView*)currentWidget();
if (walletView)
walletView->changePassphrase();
}
void WalletStack::unlockWallet()
{
WalletView *walletView = (WalletView*)currentWidget();
if (walletView)
walletView->unlockWallet();
}
void WalletStack::setEncryptionStatus()
{
WalletView *walletView = (WalletView*)currentWidget();
if (walletView)
walletView->setEncryptionStatus();
}
bool WalletStack::setCurrentWallet(const QString& name)
{
if (mapWalletViews.count(name) == 0)
return false;
WalletView *walletView = mapWalletViews.value(name);
setCurrentWidget(walletView);
walletView->setEncryptionStatus();
return true;
}

104
src/qt/walletstack.h

@ -1,104 +0,0 @@
/*
* Qt4 bitcoin GUI.
*
* W.J. van der Laan 2011-2012
* The Bitcoin Developers 2011-2013
*/
#ifndef WALLETSTACK_H
#define WALLETSTACK_H
#include <QStackedWidget>
#include <QMap>
#include <boost/shared_ptr.hpp>
class BitcoinGUI;
class TransactionTableModel;
class ClientModel;
class WalletModel;
class WalletView;
class TransactionView;
class OverviewPage;
class AddressBookPage;
class SendCoinsDialog;
class SendCoinsRecipient;
class SignVerifyMessageDialog;
class Notificator;
class RPCConsole;
class CWalletManager;
QT_BEGIN_NAMESPACE
class QLabel;
class QModelIndex;
QT_END_NAMESPACE
/*
WalletStack class. This class is a container for WalletView instances. It takes the place of centralWidget.
It was added to support multiple wallet functionality. It communicates with both the client and the
wallet models to give the user an up-to-date view of the current core state. It manages all the wallet views
it contains and updates them accordingly.
*/
class WalletStack : public QStackedWidget
{
Q_OBJECT
public:
explicit WalletStack(QWidget *parent = 0);
~WalletStack();
void setBitcoinGUI(BitcoinGUI *gui) { this->gui = gui; }
void setClientModel(ClientModel *clientModel) { this->clientModel = clientModel; }
bool addWallet(const QString& name, WalletModel *walletModel);
bool removeWallet(const QString& name);
void removeAllWallets();
bool handlePaymentRequest(const SendCoinsRecipient &recipient);
void showOutOfSyncWarning(bool fShow);
private:
BitcoinGUI *gui;
ClientModel *clientModel;
QMap<QString, WalletView*> mapWalletViews;
bool bOutOfSync;
public slots:
bool setCurrentWallet(const QString& name);
/** Switch to overview (home) page */
void gotoOverviewPage();
/** Switch to history (transactions) page */
void gotoHistoryPage();
/** Switch to address book page */
void gotoAddressBookPage();
/** Switch to receive coins page */
void gotoReceiveCoinsPage();
/** Switch to send coins page */
void gotoSendCoinsPage(QString addr = "");
/** Show Sign/Verify Message dialog and switch to sign message tab */
void gotoSignMessageTab(QString addr = "");
/** Show Sign/Verify Message dialog and switch to verify message tab */
void gotoVerifyMessageTab(QString addr = "");
/** Encrypt the wallet */
void encryptWallet(bool status);
/** Backup the wallet */
void backupWallet();
/** Change encrypted wallet passphrase */
void changePassphrase();
/** Ask for passphrase to unlock wallet temporarily */
void unlockWallet();
/** Set the encryption status as shown in the UI.
@param[in] status current encryption status
@see WalletModel::EncryptionStatus
*/
void setEncryptionStatus();
};
#endif // WALLETSTACK_H

35
src/qt/walletview.cpp

@ -29,9 +29,9 @@
#include <QFileDialog> #include <QFileDialog>
#include <QPushButton> #include <QPushButton>
WalletView::WalletView(QWidget *parent, BitcoinGUI *_gui): WalletView::WalletView(QWidget *parent):
QStackedWidget(parent), QStackedWidget(parent),
gui(_gui), gui(0),
clientModel(0), clientModel(0),
walletModel(0) walletModel(0)
{ {
@ -54,12 +54,8 @@ WalletView::WalletView(QWidget *parent, BitcoinGUI *_gui):
transactionsPage->setLayout(vbox); transactionsPage->setLayout(vbox);
addressBookPage = new AddressBookPage(AddressBookPage::ForEditing, AddressBookPage::SendingTab); addressBookPage = new AddressBookPage(AddressBookPage::ForEditing, AddressBookPage::SendingTab);
receiveCoinsPage = new AddressBookPage(AddressBookPage::ForEditing, AddressBookPage::ReceivingTab); receiveCoinsPage = new AddressBookPage(AddressBookPage::ForEditing, AddressBookPage::ReceivingTab);
sendCoinsPage = new SendCoinsDialog();
sendCoinsPage = new SendCoinsDialog(gui);
signVerifyMessageDialog = new SignVerifyMessageDialog(gui);
addWidget(overviewPage); addWidget(overviewPage);
addWidget(transactionsPage); addWidget(transactionsPage);
@ -68,7 +64,6 @@ WalletView::WalletView(QWidget *parent, BitcoinGUI *_gui):
addWidget(sendCoinsPage); addWidget(sendCoinsPage);
// Clicking on a transaction on the overview page simply sends you to transaction history page // 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))); connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), transactionView, SLOT(focusTransaction(QModelIndex)));
// Double-clicking on a transaction on the transaction history page shows details // Double-clicking on a transaction on the transaction history page shows details
@ -82,8 +77,6 @@ WalletView::WalletView(QWidget *parent, BitcoinGUI *_gui):
connect(receiveCoinsPage, SIGNAL(signMessage(QString)), this, SLOT(gotoSignMessageTab(QString))); connect(receiveCoinsPage, SIGNAL(signMessage(QString)), this, SLOT(gotoSignMessageTab(QString)));
// Clicking on "Export" allows to export the transaction list // Clicking on "Export" allows to export the transaction list
connect(exportButton, SIGNAL(clicked()), transactionView, SLOT(exportClicked())); connect(exportButton, SIGNAL(clicked()), transactionView, SLOT(exportClicked()));
gotoOverviewPage();
} }
WalletView::~WalletView() WalletView::~WalletView()
@ -93,6 +86,10 @@ WalletView::~WalletView()
void WalletView::setBitcoinGUI(BitcoinGUI *gui) void WalletView::setBitcoinGUI(BitcoinGUI *gui)
{ {
this->gui = gui; this->gui = gui;
if(gui)
{
connect(overviewPage, SIGNAL(transactionClicked(QModelIndex)), gui, SLOT(gotoHistoryPage()));
}
} }
void WalletView::setClientModel(ClientModel *clientModel) void WalletView::setClientModel(ClientModel *clientModel)
@ -109,7 +106,7 @@ void WalletView::setClientModel(ClientModel *clientModel)
void WalletView::setWalletModel(WalletModel *walletModel) void WalletView::setWalletModel(WalletModel *walletModel)
{ {
this->walletModel = walletModel; this->walletModel = walletModel;
if (walletModel) if (walletModel && gui)
{ {
// Receive and report messages from wallet thread // 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)), gui, SLOT(message(QString,QString,unsigned int)));
@ -120,7 +117,6 @@ void WalletView::setWalletModel(WalletModel *walletModel)
addressBookPage->setModel(walletModel->getAddressTableModel()); addressBookPage->setModel(walletModel->getAddressTableModel());
receiveCoinsPage->setModel(walletModel->getAddressTableModel()); receiveCoinsPage->setModel(walletModel->getAddressTableModel());
sendCoinsPage->setModel(walletModel); sendCoinsPage->setModel(walletModel);
signVerifyMessageDialog->setModel(walletModel);
setEncryptionStatus(); setEncryptionStatus();
connect(walletModel, SIGNAL(encryptionStatusChanged(int)), gui, SLOT(setEncryptionStatus(int))); connect(walletModel, SIGNAL(encryptionStatusChanged(int)), gui, SLOT(setEncryptionStatus(int)));
@ -152,31 +148,26 @@ void WalletView::incomingTransaction(const QModelIndex& parent, int start, int /
void WalletView::gotoOverviewPage() void WalletView::gotoOverviewPage()
{ {
gui->getOverviewAction()->setChecked(true);
setCurrentWidget(overviewPage); setCurrentWidget(overviewPage);
} }
void WalletView::gotoHistoryPage() void WalletView::gotoHistoryPage()
{ {
gui->getHistoryAction()->setChecked(true);
setCurrentWidget(transactionsPage); setCurrentWidget(transactionsPage);
} }
void WalletView::gotoAddressBookPage() void WalletView::gotoAddressBookPage()
{ {
gui->getAddressBookAction()->setChecked(true);
setCurrentWidget(addressBookPage); setCurrentWidget(addressBookPage);
} }
void WalletView::gotoReceiveCoinsPage() void WalletView::gotoReceiveCoinsPage()
{ {
gui->getReceiveCoinsAction()->setChecked(true);
setCurrentWidget(receiveCoinsPage); setCurrentWidget(receiveCoinsPage);
} }
void WalletView::gotoSendCoinsPage(QString addr) void WalletView::gotoSendCoinsPage(QString addr)
{ {
gui->getSendCoinsAction()->setChecked(true);
setCurrentWidget(sendCoinsPage); setCurrentWidget(sendCoinsPage);
if (!addr.isEmpty()) if (!addr.isEmpty())
@ -185,7 +176,10 @@ void WalletView::gotoSendCoinsPage(QString addr)
void WalletView::gotoSignMessageTab(QString addr) void WalletView::gotoSignMessageTab(QString addr)
{ {
// call show() in showTab_SM() // calls show() in showTab_SM()
SignVerifyMessageDialog *signVerifyMessageDialog = new SignVerifyMessageDialog(this);
signVerifyMessageDialog->setAttribute(Qt::WA_DeleteOnClose);
signVerifyMessageDialog->setModel(walletModel);
signVerifyMessageDialog->showTab_SM(true); signVerifyMessageDialog->showTab_SM(true);
if (!addr.isEmpty()) if (!addr.isEmpty())
@ -194,7 +188,10 @@ void WalletView::gotoSignMessageTab(QString addr)
void WalletView::gotoVerifyMessageTab(QString addr) void WalletView::gotoVerifyMessageTab(QString addr)
{ {
// call show() in showTab_VM() // calls show() in showTab_VM()
SignVerifyMessageDialog *signVerifyMessageDialog = new SignVerifyMessageDialog(this);
signVerifyMessageDialog->setAttribute(Qt::WA_DeleteOnClose);
signVerifyMessageDialog->setModel(walletModel);
signVerifyMessageDialog->showTab_VM(true); signVerifyMessageDialog->showTab_VM(true);
if (!addr.isEmpty()) if (!addr.isEmpty())

3
src/qt/walletview.h

@ -36,7 +36,7 @@ class WalletView : public QStackedWidget
Q_OBJECT Q_OBJECT
public: public:
explicit WalletView(QWidget *parent, BitcoinGUI *_gui); explicit WalletView(QWidget *parent);
~WalletView(); ~WalletView();
void setBitcoinGUI(BitcoinGUI *gui); void setBitcoinGUI(BitcoinGUI *gui);
@ -64,7 +64,6 @@ private:
AddressBookPage *addressBookPage; AddressBookPage *addressBookPage;
AddressBookPage *receiveCoinsPage; AddressBookPage *receiveCoinsPage;
SendCoinsDialog *sendCoinsPage; SendCoinsDialog *sendCoinsPage;
SignVerifyMessageDialog *signVerifyMessageDialog;
TransactionView *transactionView; TransactionView *transactionView;

Loading…
Cancel
Save