Merge pull request #3109 from laanwj/2013_10_remove_walletstack
qt: merge walletstack and walletframe
This commit is contained in:
commit
00f198c9a5
10 changed files with 133 additions and 349 deletions
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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
|
|
|
@ -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())
|
||||||
|
|
|
@ -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…
Reference in a new issue