2011-05-07 17:13:39 -03:00
/*
2011-05-10 13:03:10 -04:00
* Qt4 bitcoin GUI .
*
2012-05-11 23:36:37 -04:00
* W . J . van der Laan 2011 - 2012
2012-05-11 23:32:03 -04:00
* The Bitcoin Developers 2011 - 2012
2011-05-07 17:13:39 -03:00
*/
2011-05-12 08:49:42 -04:00
# include "bitcoingui.h"
# include "transactiontablemodel.h"
2011-07-07 11:33:15 -04:00
# include "addressbookpage.h"
2011-05-12 08:49:42 -04:00
# include "sendcoinsdialog.h"
2012-06-15 03:48:26 -04:00
# include "signverifymessagedialog.h"
2011-05-12 08:49:42 -04:00
# include "optionsdialog.h"
# include "aboutdialog.h"
2011-05-22 11:19:43 -04:00
# include "clientmodel.h"
2011-06-30 12:05:29 -04:00
# include "walletmodel.h"
2011-06-03 15:03:20 -04:00
# include "editaddressdialog.h"
2011-06-05 08:19:57 -04:00
# include "optionsmodel.h"
2011-06-10 09:05:51 -04:00
# include "transactiondescdialog.h"
2011-06-21 14:34:43 -04:00
# include "addresstablemodel.h"
2011-06-28 15:41:56 -04:00
# include "transactionview.h"
2011-07-05 16:09:39 -04:00
# include "overviewpage.h"
2011-07-25 15:35:45 -04:00
# include "bitcoinunits.h"
2011-08-23 15:08:42 -03:00
# include "guiconstants.h"
2011-08-24 17:07:26 -03:00
# include "askpassphrasedialog.h"
2011-09-03 15:52:54 -03:00
# include "notificator.h"
2012-02-17 11:34:53 -03:00
# include "guiutil.h"
2012-04-09 16:07:25 -03:00
# include "rpcconsole.h"
2011-05-07 17:13:39 -03:00
2012-09-21 14:06:53 -03:00
# ifdef Q_OS_MAC
2011-10-07 08:21:45 -03:00
# include "macdockiconhandler.h"
# endif
2011-05-07 17:13:39 -03:00
# include <QApplication>
# include <QMainWindow>
# include <QMenuBar>
# include <QMenu>
# include <QIcon>
2011-05-10 13:03:10 -04:00
# include <QTabWidget>
2011-05-07 17:13:39 -03:00
# include <QVBoxLayout>
# include <QToolBar>
# include <QStatusBar>
# include <QLabel>
# include <QLineEdit>
# include <QPushButton>
2011-05-09 14:44:46 -04:00
# include <QLocale>
2011-05-30 14:20:12 -04:00
# include <QMessageBox>
2011-06-18 15:25:38 -04:00
# include <QProgressBar>
2011-07-05 16:09:39 -04:00
# include <QStackedWidget>
2011-07-08 12:05:10 -04:00
# include <QDateTime>
2011-07-17 11:30:58 -04:00
# include <QMovie>
2012-02-14 09:14:43 -03:00
# include <QFileDialog>
# include <QDesktopServices>
2012-03-15 18:30:08 -03:00
# include <QTimer>
2011-08-07 10:04:48 -04:00
# include <QDragEnterEvent>
# include <QUrl>
2012-08-24 08:47:54 -04:00
# include <QStyle>
2011-08-07 10:04:48 -04:00
2011-05-07 17:13:39 -03:00
# include <iostream>
BitcoinGUI : : BitcoinGUI ( QWidget * parent ) :
2011-06-30 12:05:29 -04:00
QMainWindow ( parent ) ,
clientModel ( 0 ) ,
walletModel ( 0 ) ,
2011-08-24 17:07:26 -03:00
encryptWalletAction ( 0 ) ,
changePassphraseAction ( 0 ) ,
2011-12-13 13:30:13 -03:00
aboutQtAction ( 0 ) ,
2011-09-03 15:52:54 -03:00
trayIcon ( 0 ) ,
2012-04-09 16:07:25 -03:00
notificator ( 0 ) ,
rpcConsole ( 0 )
2011-05-07 17:13:39 -03:00
{
resize ( 850 , 550 ) ;
2012-07-13 02:29:36 -04:00
setWindowTitle ( tr ( " Bitcoin " ) + " - " + tr ( " Wallet " ) ) ;
2012-09-21 14:06:53 -03:00
# ifndef Q_OS_MAC
2012-05-11 06:35:17 -04:00
qApp - > setWindowIcon ( QIcon ( " :icons/bitcoin " ) ) ;
2011-05-09 14:44:46 -04:00
setWindowIcon ( QIcon ( " :icons/bitcoin " ) ) ;
2011-10-07 08:21:45 -03:00
# else
setUnifiedTitleAndToolBarOnMac ( true ) ;
QApplication : : setAttribute ( Qt : : AA_DontShowIconsInMenus ) ;
# endif
2011-08-08 11:38:17 -04:00
// Accept D&D of URIs
setAcceptDrops ( true ) ;
2011-05-12 14:16:42 -04:00
2011-10-07 08:21:45 -03:00
// Create actions for the toolbar, menu bar and tray/dock icon
2011-05-12 14:16:42 -04:00
createActions ( ) ;
2011-05-10 13:03:10 -04:00
2011-10-07 08:21:45 -03:00
// Create application menu bar
createMenuBar ( ) ;
2011-07-16 13:28:15 -04:00
2011-10-07 08:21:45 -03:00
// Create the toolbars
createToolBars ( ) ;
2011-05-07 17:13:39 -03:00
2011-10-07 08:21:45 -03:00
// Create the tray icon (or setup the dock icon)
createTrayIcon ( ) ;
2011-07-05 16:09:39 -04:00
2011-08-08 11:38:17 -04:00
// Create tabs
2011-07-07 08:27:16 -04:00
overviewPage = new OverviewPage ( ) ;
2011-05-12 14:16:42 -04:00
2011-08-08 11:38:17 -04:00
transactionsPage = new QWidget ( this ) ;
QVBoxLayout * vbox = new QVBoxLayout ( ) ;
2011-06-28 15:41:56 -04:00
transactionView = new TransactionView ( this ) ;
vbox - > addWidget ( transactionView ) ;
2011-07-05 16:09:39 -04:00
transactionsPage - > setLayout ( vbox ) ;
2011-07-07 11:33:15 -04:00
addressBookPage = new AddressBookPage ( AddressBookPage : : ForEditing , AddressBookPage : : SendingTab ) ;
receiveCoinsPage = new AddressBookPage ( AddressBookPage : : ForEditing , AddressBookPage : : ReceivingTab ) ;
sendCoinsPage = new SendCoinsDialog ( this ) ;
2012-06-15 03:48:26 -04:00
signVerifyMessageDialog = new SignVerifyMessageDialog ( this ) ;
2011-12-23 12:14:57 -03:00
2011-07-05 16:09:39 -04:00
centralWidget = new QStackedWidget ( this ) ;
centralWidget - > addWidget ( overviewPage ) ;
centralWidget - > addWidget ( transactionsPage ) ;
2011-07-07 11:33:15 -04:00
centralWidget - > addWidget ( addressBookPage ) ;
centralWidget - > addWidget ( receiveCoinsPage ) ;
centralWidget - > addWidget ( sendCoinsPage ) ;
2011-07-05 16:09:39 -04:00
setCentralWidget ( centralWidget ) ;
2011-08-28 09:12:26 -03:00
2011-06-05 08:19:57 -04:00
// Create status bar
2011-05-12 14:16:42 -04:00
statusBar ( ) ;
2011-06-14 15:34:51 -04:00
2011-08-08 11:38:17 -04:00
// Status bar notification icons
2011-07-17 11:30:58 -04:00
QFrame * frameBlocks = new QFrame ( ) ;
2011-08-04 13:04:42 -04:00
frameBlocks - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
frameBlocks - > setMinimumWidth ( 56 ) ;
frameBlocks - > setMaximumWidth ( 56 ) ;
2011-07-17 11:30:58 -04:00
QHBoxLayout * frameBlocksLayout = new QHBoxLayout ( frameBlocks ) ;
frameBlocksLayout - > setContentsMargins ( 3 , 0 , 3 , 0 ) ;
frameBlocksLayout - > setSpacing ( 3 ) ;
2011-08-23 15:08:42 -03:00
labelEncryptionIcon = new QLabel ( ) ;
2011-08-04 13:04:42 -04:00
labelConnectionsIcon = new QLabel ( ) ;
2011-07-17 11:30:58 -04:00
labelBlocksIcon = new QLabel ( ) ;
2011-08-04 13:04:42 -04:00
frameBlocksLayout - > addStretch ( ) ;
2011-08-23 15:08:42 -03:00
frameBlocksLayout - > addWidget ( labelEncryptionIcon ) ;
frameBlocksLayout - > addStretch ( ) ;
2011-08-04 13:04:42 -04:00
frameBlocksLayout - > addWidget ( labelConnectionsIcon ) ;
frameBlocksLayout - > addStretch ( ) ;
2011-07-17 11:30:58 -04:00
frameBlocksLayout - > addWidget ( labelBlocksIcon ) ;
frameBlocksLayout - > addStretch ( ) ;
2011-06-11 06:46:09 -04:00
2012-04-02 14:07:03 -03:00
// Progress bar and label for blocks download
progressBarLabel = new QLabel ( ) ;
2011-06-18 15:25:38 -04:00
progressBarLabel - > setVisible ( false ) ;
progressBar = new QProgressBar ( ) ;
2012-04-13 13:25:56 -03:00
progressBar - > setAlignment ( Qt : : AlignCenter ) ;
2011-06-18 15:25:38 -04:00
progressBar - > setVisible ( false ) ;
2012-08-24 08:47:54 -04:00
// Override style sheet for progress bar for styles that have a segmented progress bar,
// as they make the text unreadable (workaround for issue #1071)
// See https://qt-project.org/doc/qt-4.8/gallery.html
QString curStyle = qApp - > style ( ) - > metaObject ( ) - > className ( ) ;
if ( curStyle = = " QWindowsStyle " | | curStyle = = " QWindowsXPStyle " )
{
progressBar - > setStyleSheet ( " QProgressBar { background-color: #e8e8e8; border: 1px solid grey; border-radius: 7px; padding: 1px; text-align: center; } QProgressBar::chunk { background: QLinearGradient(x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #FF8000, stop: 1 orange); border-radius: 7px; margin: 0px; } " ) ;
}
2011-06-18 15:25:38 -04:00
statusBar ( ) - > addWidget ( progressBarLabel ) ;
statusBar ( ) - > addWidget ( progressBar ) ;
2011-07-17 11:30:58 -04:00
statusBar ( ) - > addPermanentWidget ( frameBlocks ) ;
2011-06-18 15:25:38 -04:00
2011-07-17 11:30:58 -04:00
syncIconMovie = new QMovie ( " :/movies/update_spinner " , " mng " , this ) ;
2011-08-08 11:38:17 -04:00
// Clicking on a transaction on the overview page simply sends you to transaction history page
2011-08-03 22:41:01 -04:00
connect ( overviewPage , SIGNAL ( transactionClicked ( QModelIndex ) ) , this , SLOT ( gotoHistoryPage ( ) ) ) ;
2012-05-12 07:19:44 -04:00
connect ( overviewPage , SIGNAL ( transactionClicked ( QModelIndex ) ) , transactionView , SLOT ( focusTransaction ( QModelIndex ) ) ) ;
2011-08-03 22:41:01 -04:00
2012-07-25 20:48:39 -04:00
// Double-clicking on a transaction on the transaction history page shows details
2011-08-08 11:38:17 -04:00
connect ( transactionView , SIGNAL ( doubleClicked ( QModelIndex ) ) , transactionView , SLOT ( showDetails ( ) ) ) ;
2011-08-07 10:04:48 -04:00
2012-04-09 16:07:25 -03:00
rpcConsole = new RPCConsole ( this ) ;
connect ( openRPCConsoleAction , SIGNAL ( triggered ( ) ) , rpcConsole , SLOT ( show ( ) ) ) ;
2012-07-08 12:48:56 -04:00
// Clicking on "Verify Message" in the address book sends you to the verify message tab
connect ( addressBookPage , SIGNAL ( verifyMessage ( QString ) ) , this , SLOT ( gotoVerifyMessageTab ( QString ) ) ) ;
// Clicking on "Sign Message" in the receive coins page sends you to the sign message tab
connect ( receiveCoinsPage , SIGNAL ( signMessage ( QString ) ) , this , SLOT ( gotoSignMessageTab ( QString ) ) ) ;
2011-08-07 10:04:48 -04:00
gotoOverviewPage ( ) ;
2011-05-12 14:16:42 -04:00
}
2011-10-07 08:21:45 -03:00
BitcoinGUI : : ~ BitcoinGUI ( )
{
2012-02-19 08:07:07 -03:00
if ( trayIcon ) // Hide tray icon, as deleting will let it linger until quit (on Ubuntu)
trayIcon - > hide ( ) ;
2012-09-21 14:06:53 -03:00
# ifdef Q_OS_MAC
2011-10-07 08:21:45 -03:00
delete appMenuBar ;
# endif
}
2011-05-12 14:16:42 -04:00
void BitcoinGUI : : createActions ( )
{
2011-07-05 16:09:39 -04:00
QActionGroup * tabGroup = new QActionGroup ( this ) ;
2011-07-07 11:33:15 -04:00
2011-07-05 16:09:39 -04:00
overviewAction = new QAction ( QIcon ( " :/icons/overview " ) , tr ( " &Overview " ) , this ) ;
2011-07-24 12:06:07 -04:00
overviewAction - > setToolTip ( tr ( " Show general overview of wallet " ) ) ;
2011-07-05 16:09:39 -04:00
overviewAction - > setCheckable ( true ) ;
2011-10-09 16:40:03 -03:00
overviewAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_1 ) ) ;
2011-07-05 16:09:39 -04:00
tabGroup - > addAction ( overviewAction ) ;
2011-07-07 11:33:15 -04:00
2012-08-29 04:12:34 -04:00
sendCoinsAction = new QAction ( QIcon ( " :/icons/send " ) , tr ( " &Send coins " ) , this ) ;
sendCoinsAction - > setToolTip ( tr ( " Send coins to a Bitcoin address " ) ) ;
sendCoinsAction - > setCheckable ( true ) ;
sendCoinsAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_2 ) ) ;
tabGroup - > addAction ( sendCoinsAction ) ;
receiveCoinsAction = new QAction ( QIcon ( " :/icons/receiving_addresses " ) , tr ( " &Receive coins " ) , this ) ;
receiveCoinsAction - > setToolTip ( tr ( " Show the list of addresses for receiving payments " ) ) ;
receiveCoinsAction - > setCheckable ( true ) ;
receiveCoinsAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_3 ) ) ;
tabGroup - > addAction ( receiveCoinsAction ) ;
2011-07-07 04:59:00 -04:00
historyAction = new QAction ( QIcon ( " :/icons/history " ) , tr ( " &Transactions " ) , this ) ;
2011-07-24 12:06:07 -04:00
historyAction - > setToolTip ( tr ( " Browse transaction history " ) ) ;
2011-07-05 16:09:39 -04:00
historyAction - > setCheckable ( true ) ;
2011-10-09 16:40:03 -03:00
historyAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_4 ) ) ;
2011-07-05 16:09:39 -04:00
tabGroup - > addAction ( historyAction ) ;
2011-07-07 11:33:15 -04:00
addressBookAction = new QAction ( QIcon ( " :/icons/address-book " ) , tr ( " &Address Book " ) , this ) ;
addressBookAction - > setToolTip ( tr ( " Edit the list of stored addresses and labels " ) ) ;
addressBookAction - > setCheckable ( true ) ;
2011-10-09 16:40:03 -03:00
addressBookAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_5 ) ) ;
2011-07-07 11:33:15 -04:00
tabGroup - > addAction ( addressBookAction ) ;
2012-02-17 19:19:52 -03:00
connect ( overviewAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
2011-07-07 11:33:15 -04:00
connect ( overviewAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoOverviewPage ( ) ) ) ;
2012-08-29 04:12:34 -04:00
connect ( sendCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
connect ( sendCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoSendCoinsPage ( ) ) ) ;
connect ( receiveCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
connect ( receiveCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoReceiveCoinsPage ( ) ) ) ;
2012-02-17 19:19:52 -03:00
connect ( historyAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
2011-07-07 11:33:15 -04:00
connect ( historyAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoHistoryPage ( ) ) ) ;
2012-02-17 19:19:52 -03:00
connect ( addressBookAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
2011-07-07 11:33:15 -04:00
connect ( addressBookAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoAddressBookPage ( ) ) ) ;
2011-10-09 16:06:28 -03:00
quitAction = new QAction ( QIcon ( " :/icons/quit " ) , tr ( " E&xit " ) , this ) ;
2011-07-07 11:33:15 -04:00
quitAction - > setToolTip ( tr ( " Quit application " ) ) ;
2011-10-09 16:06:28 -03:00
quitAction - > setShortcut ( QKeySequence ( Qt : : CTRL + Qt : : Key_Q ) ) ;
2011-10-07 08:21:45 -03:00
quitAction - > setMenuRole ( QAction : : QuitRole ) ;
2012-07-13 02:29:36 -04:00
aboutAction = new QAction ( QIcon ( " :/icons/bitcoin " ) , tr ( " &About Bitcoin " ) , this ) ;
2011-07-07 11:33:15 -04:00
aboutAction - > setToolTip ( tr ( " Show information about Bitcoin " ) ) ;
2011-12-13 13:30:13 -03:00
aboutAction - > setMenuRole ( QAction : : AboutRole ) ;
2012-08-23 15:55:03 -04:00
aboutQtAction = new QAction ( QIcon ( " :/trolltech/qmessagebox/images/qtlogo-64.png " ) , tr ( " About &Qt " ) , this ) ;
2011-12-13 13:30:13 -03:00
aboutQtAction - > setToolTip ( tr ( " Show information about Qt " ) ) ;
aboutQtAction - > setMenuRole ( QAction : : AboutQtRole ) ;
2011-07-07 11:33:15 -04:00
optionsAction = new QAction ( QIcon ( " :/icons/options " ) , tr ( " &Options... " ) , this ) ;
2012-05-13 10:09:14 -04:00
optionsAction - > setToolTip ( tr ( " Modify configuration options for Bitcoin " ) ) ;
2011-10-07 08:21:45 -03:00
optionsAction - > setMenuRole ( QAction : : PreferencesRole ) ;
2012-07-21 07:01:02 -04:00
toggleHideAction = new QAction ( QIcon ( " :/icons/bitcoin " ) , tr ( " &Show / Hide " ) , this ) ;
2012-05-06 10:24:15 -04:00
encryptWalletAction = new QAction ( QIcon ( " :/icons/lock_closed " ) , tr ( " &Encrypt Wallet... " ) , this ) ;
2011-08-24 17:07:26 -03:00
encryptWalletAction - > setToolTip ( tr ( " Encrypt or decrypt wallet " ) ) ;
encryptWalletAction - > setCheckable ( true ) ;
2012-05-06 10:24:15 -04:00
backupWalletAction = new QAction ( QIcon ( " :/icons/filesave " ) , tr ( " &Backup Wallet... " ) , this ) ;
2012-02-14 09:14:43 -03:00
backupWalletAction - > setToolTip ( tr ( " Backup wallet to another location " ) ) ;
2012-05-06 10:24:15 -04:00
changePassphraseAction = new QAction ( QIcon ( " :/icons/key " ) , tr ( " &Change Passphrase... " ) , this ) ;
2011-08-24 17:07:26 -03:00
changePassphraseAction - > setToolTip ( tr ( " Change the passphrase used for wallet encryption " ) ) ;
2012-08-29 04:12:34 -04:00
signMessageAction = new QAction ( QIcon ( " :/icons/edit " ) , tr ( " Sign &message... " ) , this ) ;
verifyMessageAction = new QAction ( QIcon ( " :/icons/transaction_0 " ) , tr ( " &Verify message... " ) , this ) ;
exportAction = new QAction ( QIcon ( " :/icons/export " ) , tr ( " &Export... " ) , this ) ;
exportAction - > setToolTip ( tr ( " Export the data in the current tab to a file " ) ) ;
2012-05-17 14:05:49 -04:00
openRPCConsoleAction = new QAction ( QIcon ( " :/icons/debugwindow " ) , tr ( " &Debug window " ) , this ) ;
2012-04-09 16:07:25 -03:00
openRPCConsoleAction - > setToolTip ( tr ( " Open debugging and diagnostic console " ) ) ;
2011-05-12 14:16:42 -04:00
2011-07-07 11:33:15 -04:00
connect ( quitAction , SIGNAL ( triggered ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
connect ( aboutAction , SIGNAL ( triggered ( ) ) , this , SLOT ( aboutClicked ( ) ) ) ;
2011-12-13 13:30:13 -03:00
connect ( aboutQtAction , SIGNAL ( triggered ( ) ) , qApp , SLOT ( aboutQt ( ) ) ) ;
2012-08-29 04:12:34 -04:00
connect ( optionsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( optionsClicked ( ) ) ) ;
2012-02-17 11:34:53 -03:00
connect ( toggleHideAction , SIGNAL ( triggered ( ) ) , this , SLOT ( toggleHidden ( ) ) ) ;
2011-08-24 17:07:26 -03:00
connect ( encryptWalletAction , SIGNAL ( triggered ( bool ) ) , this , SLOT ( encryptWallet ( bool ) ) ) ;
2012-02-14 09:14:43 -03:00
connect ( backupWalletAction , SIGNAL ( triggered ( ) ) , this , SLOT ( backupWallet ( ) ) ) ;
2011-08-24 17:07:26 -03:00
connect ( changePassphraseAction , SIGNAL ( triggered ( ) ) , this , SLOT ( changePassphrase ( ) ) ) ;
2012-08-29 04:12:34 -04:00
connect ( signMessageAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoSignMessageTab ( ) ) ) ;
connect ( verifyMessageAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoVerifyMessageTab ( ) ) ) ;
2011-05-12 14:16:42 -04:00
}
2011-10-07 08:21:45 -03:00
void BitcoinGUI : : createMenuBar ( )
{
2012-09-21 14:06:53 -03:00
# ifdef Q_OS_MAC
2011-10-07 08:21:45 -03:00
// Create a decoupled menu bar on Mac which stays even if the window is closed
appMenuBar = new QMenuBar ( ) ;
# else
// Get the main window's menu bar on other platforms
appMenuBar = menuBar ( ) ;
# endif
// Configure the menus
QMenu * file = appMenuBar - > addMenu ( tr ( " &File " ) ) ;
2012-02-25 23:04:25 -03:00
file - > addAction ( backupWalletAction ) ;
2012-02-12 08:53:20 -03:00
file - > addAction ( exportAction ) ;
2012-06-15 03:48:26 -04:00
file - > addAction ( signMessageAction ) ;
2012-02-27 08:55:04 -03:00
file - > addAction ( verifyMessageAction ) ;
2012-02-25 23:04:25 -03:00
file - > addSeparator ( ) ;
2011-10-07 08:21:45 -03:00
file - > addAction ( quitAction ) ;
QMenu * settings = appMenuBar - > addMenu ( tr ( " &Settings " ) ) ;
settings - > addAction ( encryptWalletAction ) ;
settings - > addAction ( changePassphraseAction ) ;
settings - > addSeparator ( ) ;
settings - > addAction ( optionsAction ) ;
QMenu * help = appMenuBar - > addMenu ( tr ( " &Help " ) ) ;
2012-04-09 16:07:25 -03:00
help - > addAction ( openRPCConsoleAction ) ;
help - > addSeparator ( ) ;
2011-10-07 08:21:45 -03:00
help - > addAction ( aboutAction ) ;
2011-12-13 13:30:13 -03:00
help - > addAction ( aboutQtAction ) ;
2011-10-07 08:21:45 -03:00
}
void BitcoinGUI : : createToolBars ( )
{
QToolBar * toolbar = addToolBar ( tr ( " Tabs toolbar " ) ) ;
toolbar - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
toolbar - > addAction ( overviewAction ) ;
toolbar - > addAction ( sendCoinsAction ) ;
toolbar - > addAction ( receiveCoinsAction ) ;
toolbar - > addAction ( historyAction ) ;
toolbar - > addAction ( addressBookAction ) ;
QToolBar * toolbar2 = addToolBar ( tr ( " Actions toolbar " ) ) ;
toolbar2 - > setToolButtonStyle ( Qt : : ToolButtonTextBesideIcon ) ;
toolbar2 - > addAction ( exportAction ) ;
}
2011-06-30 12:05:29 -04:00
void BitcoinGUI : : setClientModel ( ClientModel * clientModel )
2011-05-22 11:19:43 -04:00
{
2011-06-30 12:05:29 -04:00
this - > clientModel = clientModel ;
2011-11-08 17:18:36 -03:00
if ( clientModel )
2011-06-30 13:14:42 -04:00
{
2012-07-13 02:46:09 -04:00
// Replace some strings and icons, when using the testnet
2011-11-08 17:18:36 -03:00
if ( clientModel - > isTestNet ( ) )
{
2012-05-09 09:11:47 -04:00
setWindowTitle ( windowTitle ( ) + QString ( " " ) + tr ( " [testnet] " ) ) ;
2012-09-21 14:06:53 -03:00
# ifndef Q_OS_MAC
2012-05-11 06:35:17 -04:00
qApp - > setWindowIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
2011-11-08 17:18:36 -03:00
setWindowIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
2011-10-07 08:21:45 -03:00
# else
2011-11-08 17:18:36 -03:00
MacDockIconHandler : : instance ( ) - > setIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
2011-10-07 08:21:45 -03:00
# endif
2011-11-08 17:18:36 -03:00
if ( trayIcon )
{
2012-05-09 09:11:47 -04:00
trayIcon - > setToolTip ( tr ( " Bitcoin client " ) + QString ( " " ) + tr ( " [testnet] " ) ) ;
2011-11-08 17:18:36 -03:00
trayIcon - > setIcon ( QIcon ( " :/icons/toolbar_testnet " ) ) ;
2012-05-09 09:11:47 -04:00
toggleHideAction - > setIcon ( QIcon ( " :/icons/toolbar_testnet " ) ) ;
2011-11-08 17:18:36 -03:00
}
2012-07-13 02:46:09 -04:00
aboutAction - > setIcon ( QIcon ( " :/icons/toolbar_testnet " ) ) ;
2011-06-30 13:14:42 -04:00
}
2011-11-08 17:18:36 -03:00
// Keep up to date with client
setNumConnections ( clientModel - > getNumConnections ( ) ) ;
connect ( clientModel , SIGNAL ( numConnectionsChanged ( int ) ) , this , SLOT ( setNumConnections ( int ) ) ) ;
2011-05-22 11:19:43 -04:00
2012-05-05 10:07:14 -04:00
setNumBlocks ( clientModel - > getNumBlocks ( ) , clientModel - > getNumBlocksOfPeers ( ) ) ;
connect ( clientModel , SIGNAL ( numBlocksChanged ( int , int ) ) , this , SLOT ( setNumBlocks ( int , int ) ) ) ;
2011-05-22 11:19:43 -04:00
2011-11-08 17:18:36 -03:00
// Report errors from network/worker thread
2012-05-05 10:07:14 -04:00
connect ( clientModel , SIGNAL ( error ( QString , QString , bool ) ) , this , SLOT ( error ( QString , QString , bool ) ) ) ;
2012-04-09 16:07:25 -03:00
2012-10-24 16:47:07 -03:00
overviewPage - > setClientModel ( clientModel ) ;
2012-04-09 16:07:25 -03:00
rpcConsole - > setClientModel ( clientModel ) ;
2012-06-24 12:28:05 -04:00
addressBookPage - > setOptionsModel ( clientModel - > getOptionsModel ( ) ) ;
receiveCoinsPage - > setOptionsModel ( clientModel - > getOptionsModel ( ) ) ;
2011-11-08 17:18:36 -03:00
}
2011-06-30 12:05:29 -04:00
}
void BitcoinGUI : : setWalletModel ( WalletModel * walletModel )
{
this - > walletModel = walletModel ;
2011-11-08 17:18:36 -03:00
if ( walletModel )
{
// Report errors from wallet thread
2012-03-25 15:47:33 -03:00
connect ( walletModel , SIGNAL ( error ( QString , QString , bool ) ) , this , SLOT ( error ( QString , QString , bool ) ) ) ;
2011-05-22 11:19:43 -04:00
2011-11-08 17:18:36 -03:00
// Put transaction list in tabs
transactionView - > setModel ( walletModel ) ;
2012-10-24 16:47:07 -03:00
overviewPage - > setWalletModel ( walletModel ) ;
2011-11-08 17:18:36 -03:00
addressBookPage - > setModel ( walletModel - > getAddressTableModel ( ) ) ;
receiveCoinsPage - > setModel ( walletModel - > getAddressTableModel ( ) ) ;
sendCoinsPage - > setModel ( walletModel ) ;
2012-06-15 03:48:26 -04:00
signVerifyMessageDialog - > setModel ( walletModel ) ;
2011-07-07 11:33:15 -04:00
2011-11-08 17:18:36 -03:00
setEncryptionStatus ( walletModel - > getEncryptionStatus ( ) ) ;
connect ( walletModel , SIGNAL ( encryptionStatusChanged ( int ) ) , this , SLOT ( setEncryptionStatus ( int ) ) ) ;
2011-08-23 15:08:42 -03:00
2012-07-25 20:48:39 -04:00
// Balloon pop-up for new transaction
2011-11-08 17:18:36 -03:00
connect ( walletModel - > getTransactionTableModel ( ) , SIGNAL ( rowsInserted ( QModelIndex , int , int ) ) ,
this , SLOT ( incomingTransaction ( QModelIndex , int , int ) ) ) ;
2011-08-24 17:07:26 -03:00
2011-11-08 17:18:36 -03:00
// Ask for passphrase if needed
connect ( walletModel , SIGNAL ( requireUnlock ( ) ) , this , SLOT ( unlockWallet ( ) ) ) ;
}
2011-05-22 11:19:43 -04:00
}
2011-05-12 14:16:42 -04:00
void BitcoinGUI : : createTrayIcon ( )
{
2011-10-07 08:21:45 -03:00
QMenu * trayIconMenu ;
2012-09-21 14:06:53 -03:00
# ifndef Q_OS_MAC
2011-05-12 14:16:42 -04:00
trayIcon = new QSystemTrayIcon ( this ) ;
2011-10-07 08:21:45 -03:00
trayIconMenu = new QMenu ( this ) ;
2011-05-12 14:16:42 -04:00
trayIcon - > setContextMenu ( trayIconMenu ) ;
2012-03-29 02:58:49 -03:00
trayIcon - > setToolTip ( tr ( " Bitcoin client " ) ) ;
2011-05-13 09:58:27 -04:00
trayIcon - > setIcon ( QIcon ( " :/icons/toolbar " ) ) ;
2011-06-05 08:19:57 -04:00
connect ( trayIcon , SIGNAL ( activated ( QSystemTrayIcon : : ActivationReason ) ) ,
this , SLOT ( trayIconActivated ( QSystemTrayIcon : : ActivationReason ) ) ) ;
2011-05-12 14:16:42 -04:00
trayIcon - > show ( ) ;
2011-10-07 08:21:45 -03:00
# else
// Note: On Mac, the dock icon is used to provide the tray's functionality.
MacDockIconHandler * dockIconHandler = MacDockIconHandler : : instance ( ) ;
trayIconMenu = dockIconHandler - > dockMenu ( ) ;
# endif
// Configuration of the tray icon (or dock icon) icon menu
2012-02-17 11:34:53 -03:00
trayIconMenu - > addAction ( toggleHideAction ) ;
2011-10-07 08:21:45 -03:00
trayIconMenu - > addSeparator ( ) ;
2012-06-14 01:57:10 -04:00
trayIconMenu - > addAction ( sendCoinsAction ) ;
trayIconMenu - > addAction ( receiveCoinsAction ) ;
2011-12-23 12:14:57 -03:00
trayIconMenu - > addSeparator ( ) ;
2012-06-15 03:48:26 -04:00
trayIconMenu - > addAction ( signMessageAction ) ;
2012-06-14 01:57:10 -04:00
trayIconMenu - > addAction ( verifyMessageAction ) ;
2011-10-07 08:21:45 -03:00
trayIconMenu - > addSeparator ( ) ;
trayIconMenu - > addAction ( optionsAction ) ;
2012-06-14 01:57:10 -04:00
trayIconMenu - > addAction ( openRPCConsoleAction ) ;
2012-09-21 14:06:53 -03:00
# ifndef Q_OS_MAC // This is built-in on Mac
2011-10-07 08:21:45 -03:00
trayIconMenu - > addSeparator ( ) ;
trayIconMenu - > addAction ( quitAction ) ;
# endif
2011-09-03 15:52:54 -03:00
2012-05-13 10:09:14 -04:00
notificator = new Notificator ( qApp - > applicationName ( ) , trayIcon ) ;
2011-05-12 14:16:42 -04:00
}
2012-09-21 14:06:53 -03:00
# ifndef Q_OS_MAC
2011-06-05 08:19:57 -04:00
void BitcoinGUI : : trayIconActivated ( QSystemTrayIcon : : ActivationReason reason )
{
2011-08-08 11:38:17 -04:00
if ( reason = = QSystemTrayIcon : : Trigger )
2011-06-05 08:19:57 -04:00
{
2012-07-21 07:01:02 -04:00
// Click on system tray icon triggers show/hide of the main window
2012-02-17 11:34:53 -03:00
toggleHideAction - > trigger ( ) ;
2011-06-05 08:19:57 -04:00
}
}
2011-10-07 08:21:45 -03:00
# endif
2011-06-05 08:19:57 -04:00
2011-05-10 13:03:10 -04:00
void BitcoinGUI : : optionsClicked ( )
{
2011-11-08 17:18:36 -03:00
if ( ! clientModel | | ! clientModel - > getOptionsModel ( ) )
return ;
2011-05-12 03:40:40 -04:00
OptionsDialog dlg ;
2011-06-30 12:05:29 -04:00
dlg . setModel ( clientModel - > getOptionsModel ( ) ) ;
2011-05-12 03:40:40 -04:00
dlg . exec ( ) ;
2011-05-10 13:03:10 -04:00
}
2011-05-12 03:40:40 -04:00
void BitcoinGUI : : aboutClicked ( )
2011-05-10 13:03:10 -04:00
{
2011-05-12 03:40:40 -04:00
AboutDialog dlg ;
2011-07-01 11:06:36 -04:00
dlg . setModel ( clientModel ) ;
2011-05-12 03:40:40 -04:00
dlg . exec ( ) ;
2011-05-10 13:03:10 -04:00
}
2011-05-12 14:28:07 -04:00
void BitcoinGUI : : setNumConnections ( int count )
{
2011-06-14 15:34:51 -04:00
QString icon ;
switch ( count )
{
2011-06-17 11:47:40 -04:00
case 0 : icon = " :/icons/connect_0 " ; break ;
case 1 : case 2 : case 3 : icon = " :/icons/connect_1 " ; break ;
case 4 : case 5 : case 6 : icon = " :/icons/connect_2 " ; break ;
case 7 : case 8 : case 9 : icon = " :/icons/connect_3 " ; break ;
default : icon = " :/icons/connect_4 " ; break ;
2011-06-14 15:34:51 -04:00
}
2011-08-23 15:08:42 -03:00
labelConnectionsIcon - > setPixmap ( QIcon ( icon ) . pixmap ( STATUSBAR_ICONSIZE , STATUSBAR_ICONSIZE ) ) ;
2011-08-05 09:37:49 -04:00
labelConnectionsIcon - > setToolTip ( tr ( " %n active connection(s) to Bitcoin network " , " " , count ) ) ;
2011-05-12 14:28:07 -04:00
}
2012-05-05 10:07:14 -04:00
void BitcoinGUI : : setNumBlocks ( int count , int nTotalBlocks )
2011-05-12 14:28:07 -04:00
{
2012-09-21 09:15:26 -03:00
// don't show / hide progress bar and its label if we have no connection to the network
2012-09-13 09:33:52 -03:00
if ( ! clientModel | | ( clientModel - > getNumConnections ( ) = = 0 & & ! clientModel - > isImporting ( ) ) )
2012-04-02 05:18:51 -03:00
{
progressBarLabel - > setVisible ( false ) ;
progressBar - > setVisible ( false ) ;
2011-11-08 17:18:36 -03:00
return ;
2012-04-02 05:18:51 -03:00
}
2011-07-17 08:06:43 -04:00
QString tooltip ;
2012-04-02 18:51:40 -03:00
if ( count < nTotalBlocks )
2011-06-18 15:25:38 -04:00
{
2012-04-02 18:51:40 -03:00
int nRemainingBlocks = nTotalBlocks - count ;
2012-04-03 03:30:13 -03:00
float nPercentageDone = count / ( nTotalBlocks * 0.01f ) ;
2012-04-02 10:28:53 -03:00
2012-10-24 16:47:07 -03:00
progressBarLabel - > setText ( tr ( clientModel - > isImporting ( ) ? " Importing blocks... " : " Synchronizing with network... " ) ) ;
progressBarLabel - > setVisible ( true ) ;
progressBar - > setFormat ( tr ( " ~%n block(s) remaining " , " " , nRemainingBlocks ) ) ;
progressBar - > setMaximum ( nTotalBlocks ) ;
progressBar - > setValue ( count ) ;
progressBar - > setVisible ( true ) ;
2012-07-13 03:01:27 -04:00
2012-04-03 03:30:13 -03:00
tooltip = tr ( " Downloaded %1 of %2 blocks of transaction history (%3% done). " ) . arg ( count ) . arg ( nTotalBlocks ) . arg ( nPercentageDone , 0 , ' f ' , 2 ) ;
2011-06-18 15:25:38 -04:00
}
else
{
2012-10-24 16:47:07 -03:00
progressBarLabel - > setVisible ( false ) ;
2012-07-13 03:01:27 -04:00
2011-06-18 15:25:38 -04:00
progressBar - > setVisible ( false ) ;
2011-07-17 08:06:43 -04:00
tooltip = tr ( " Downloaded %1 blocks of transaction history. " ) . arg ( count ) ;
2011-06-18 15:25:38 -04:00
}
2011-07-08 12:05:10 -04:00
QDateTime lastBlockDate = clientModel - > getLastBlockDate ( ) ;
2012-07-13 03:01:27 -04:00
int secs = lastBlockDate . secsTo ( QDateTime : : currentDateTime ( ) ) ;
2011-07-08 12:05:10 -04:00
QString text ;
2011-07-18 00:55:05 -04:00
// Represent time from last generated block in human readable text
2012-02-25 15:07:53 -03:00
if ( secs < = 0 )
{
// Fully up to date. Leave text empty.
}
else if ( secs < 60 )
2011-07-08 12:05:10 -04:00
{
2011-07-18 00:55:05 -04:00
text = tr ( " %n second(s) ago " , " " , secs ) ;
2011-07-08 12:05:10 -04:00
}
else if ( secs < 60 * 60 )
{
text = tr ( " %n minute(s) ago " , " " , secs / 60 ) ;
}
else if ( secs < 24 * 60 * 60 )
{
text = tr ( " %n hour(s) ago " , " " , secs / ( 60 * 60 ) ) ;
}
else
{
text = tr ( " %n day(s) ago " , " " , secs / ( 60 * 60 * 24 ) ) ;
}
2011-07-18 00:55:05 -04:00
2011-08-08 11:38:17 -04:00
// Set icon state: spinning if catching up, tick otherwise
2012-04-14 03:21:22 -03:00
if ( secs < 90 * 60 & & count > = nTotalBlocks )
2011-07-18 00:55:05 -04:00
{
2012-04-13 12:10:50 -03:00
tooltip = tr ( " Up to date " ) + QString ( " .<br> " ) + tooltip ;
2012-04-13 13:25:56 -03:00
labelBlocksIcon - > setPixmap ( QIcon ( " :/icons/synced " ) . pixmap ( STATUSBAR_ICONSIZE , STATUSBAR_ICONSIZE ) ) ;
2012-05-15 10:57:59 -04:00
overviewPage - > showOutOfSyncWarning ( false ) ;
2011-07-18 00:55:05 -04:00
}
2011-08-04 13:04:42 -04:00
else
{
2012-04-13 12:10:50 -03:00
tooltip = tr ( " Catching up... " ) + QString ( " <br> " ) + tooltip ;
2011-08-08 11:38:17 -04:00
labelBlocksIcon - > setMovie ( syncIconMovie ) ;
syncIconMovie - > start ( ) ;
2012-05-15 10:57:59 -04:00
overviewPage - > showOutOfSyncWarning ( true ) ;
2011-08-04 13:04:42 -04:00
}
2011-07-18 00:55:05 -04:00
2012-02-25 15:07:53 -03:00
if ( ! text . isEmpty ( ) )
{
2012-04-13 12:10:50 -03:00
tooltip + = QString ( " <br> " ) ;
2012-02-25 15:07:53 -03:00
tooltip + = tr ( " Last received block was generated %1. " ) . arg ( text ) ;
}
2011-07-17 11:30:58 -04:00
2012-04-13 12:10:50 -03:00
// Don't word-wrap this (fixed-width) tooltip
tooltip = QString ( " <nobr> " ) + tooltip + QString ( " </nobr> " ) ;
2011-07-17 11:30:58 -04:00
labelBlocksIcon - > setToolTip ( tooltip ) ;
2011-07-17 08:06:43 -04:00
progressBarLabel - > setToolTip ( tooltip ) ;
progressBar - > setToolTip ( tooltip ) ;
2011-05-12 14:28:07 -04:00
}
2012-03-25 15:47:33 -03:00
void BitcoinGUI : : error ( const QString & title , const QString & message , bool modal )
2011-05-30 14:20:12 -04:00
{
2011-06-05 08:19:57 -04:00
// Report errors from network/worker thread
2012-03-25 15:47:33 -03:00
if ( modal )
{
QMessageBox : : critical ( this , title , message , QMessageBox : : Ok , QMessageBox : : Ok ) ;
} else {
notificator - > notify ( Notificator : : Critical , title , message ) ;
}
2011-05-30 14:20:12 -04:00
}
2011-06-05 08:19:57 -04:00
void BitcoinGUI : : changeEvent ( QEvent * e )
{
2012-03-15 18:30:08 -03:00
QMainWindow : : changeEvent ( e ) ;
2012-09-21 14:06:53 -03:00
# ifndef Q_OS_MAC // Ignored on Mac
2011-11-13 04:45:29 -03:00
if ( e - > type ( ) = = QEvent : : WindowStateChange )
2011-06-05 08:19:57 -04:00
{
2011-11-13 04:45:29 -03:00
if ( clientModel & & clientModel - > getOptionsModel ( ) - > getMinimizeToTray ( ) )
2011-06-05 08:19:57 -04:00
{
2012-02-17 09:50:32 -03:00
QWindowStateChangeEvent * wsevt = static_cast < QWindowStateChangeEvent * > ( e ) ;
2012-03-15 18:30:08 -03:00
if ( ! ( wsevt - > oldState ( ) & Qt : : WindowMinimized ) & & isMinimized ( ) )
2011-06-07 12:59:01 -04:00
{
2012-03-15 18:30:08 -03:00
QTimer : : singleShot ( 0 , this , SLOT ( hide ( ) ) ) ;
e - > ignore ( ) ;
2011-06-05 08:19:57 -04:00
}
}
}
2011-10-07 08:21:45 -03:00
# endif
2011-06-05 08:19:57 -04:00
}
void BitcoinGUI : : closeEvent ( QCloseEvent * event )
{
2011-11-08 17:18:36 -03:00
if ( clientModel )
2011-06-05 08:19:57 -04:00
{
2012-09-21 14:06:53 -03:00
# ifndef Q_OS_MAC // Ignored on Mac
2011-11-08 17:18:36 -03:00
if ( ! clientModel - > getOptionsModel ( ) - > getMinimizeToTray ( ) & &
! clientModel - > getOptionsModel ( ) - > getMinimizeOnClose ( ) )
{
qApp - > quit ( ) ;
}
2011-10-07 08:21:45 -03:00
# endif
2011-11-08 17:18:36 -03:00
}
2011-06-05 08:19:57 -04:00
QMainWindow : : closeEvent ( event ) ;
}
2011-06-05 11:36:52 -04:00
void BitcoinGUI : : askFee ( qint64 nFeeRequired , bool * payFee )
{
QString strMessage =
tr ( " This transaction is over the size limit. You can still send it for a fee of %1, "
" which goes to the nodes that process your transaction and helps to support the network. "
2011-07-25 15:35:45 -04:00
" Do you want to pay the fee? " ) . arg (
BitcoinUnits : : formatWithUnit ( BitcoinUnits : : BTC , nFeeRequired ) ) ;
2011-06-05 11:36:52 -04:00
QMessageBox : : StandardButton retval = QMessageBox : : question (
2012-05-06 10:24:15 -04:00
this , tr ( " Confirm transaction fee " ) , strMessage ,
2011-06-05 11:36:52 -04:00
QMessageBox : : Yes | QMessageBox : : Cancel , QMessageBox : : Yes ) ;
* payFee = ( retval = = QMessageBox : : Yes ) ;
}
2011-06-10 09:05:51 -04:00
2011-06-10 15:59:29 -04:00
void BitcoinGUI : : incomingTransaction ( const QModelIndex & parent , int start , int end )
{
2011-11-08 17:18:36 -03:00
if ( ! walletModel | | ! clientModel )
return ;
2011-06-30 12:05:29 -04:00
TransactionTableModel * ttm = walletModel - > getTransactionTableModel ( ) ;
2011-06-26 16:47:02 -04:00
qint64 amount = ttm - > index ( start , TransactionTableModel : : Amount , parent )
2011-06-10 15:59:29 -04:00
. data ( Qt : : EditRole ) . toULongLong ( ) ;
2011-07-11 15:01:53 -04:00
if ( ! clientModel - > inInitialBlockDownload ( ) )
2011-06-10 15:59:29 -04:00
{
2011-08-08 11:38:17 -04:00
// On new transaction, make an info balloon
2011-06-18 07:13:48 -04:00
// Unless the initial block download is in progress, to prevent balloon-spam
2011-06-10 15:59:29 -04:00
QString date = ttm - > index ( start , TransactionTableModel : : Date , parent )
. data ( ) . toString ( ) ;
2011-06-26 16:47:02 -04:00
QString type = ttm - > index ( start , TransactionTableModel : : Type , parent )
. data ( ) . toString ( ) ;
QString address = ttm - > index ( start , TransactionTableModel : : ToAddress , parent )
2011-06-10 15:59:29 -04:00
. data ( ) . toString ( ) ;
2011-09-03 15:52:54 -03:00
QIcon icon = qvariant_cast < QIcon > ( ttm - > index ( start ,
TransactionTableModel : : ToAddress , parent )
. data ( Qt : : DecorationRole ) ) ;
notificator - > notify ( Notificator : : Information ,
( amount ) < 0 ? tr ( " Sent transaction " ) :
tr ( " Incoming transaction " ) ,
tr ( " Date: %1 \n "
" Amount: %2 \n "
" Type: %3 \n "
" Address: %4 \n " )
. arg ( date )
. arg ( BitcoinUnits : : formatWithUnit ( walletModel - > getOptionsModel ( ) - > getDisplayUnit ( ) , amount , true ) )
. arg ( type )
. arg ( address ) , icon ) ;
2011-06-10 15:59:29 -04:00
}
}
2011-07-05 16:09:39 -04:00
2011-07-07 11:33:15 -04:00
void BitcoinGUI : : gotoOverviewPage ( )
2011-07-05 16:09:39 -04:00
{
overviewAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( overviewPage ) ;
2011-07-09 04:53:55 -04:00
2011-07-07 08:27:16 -04:00
exportAction - > setEnabled ( false ) ;
2011-07-09 04:53:55 -04:00
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
2011-07-05 16:09:39 -04:00
}
2011-07-07 11:33:15 -04:00
void BitcoinGUI : : gotoHistoryPage ( )
2011-07-05 16:09:39 -04:00
{
historyAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( transactionsPage ) ;
2011-07-09 04:53:55 -04:00
2011-07-07 08:27:16 -04:00
exportAction - > setEnabled ( true ) ;
2011-07-09 04:53:55 -04:00
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
connect ( exportAction , SIGNAL ( triggered ( ) ) , transactionView , SLOT ( exportClicked ( ) ) ) ;
2011-07-07 08:27:16 -04:00
}
2011-07-07 11:33:15 -04:00
void BitcoinGUI : : gotoAddressBookPage ( )
{
addressBookAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( addressBookPage ) ;
2011-07-09 04:53:55 -04:00
exportAction - > setEnabled ( true ) ;
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
connect ( exportAction , SIGNAL ( triggered ( ) ) , addressBookPage , SLOT ( exportClicked ( ) ) ) ;
2011-07-07 11:33:15 -04:00
}
void BitcoinGUI : : gotoReceiveCoinsPage ( )
{
receiveCoinsAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( receiveCoinsPage ) ;
2011-07-09 04:53:55 -04:00
exportAction - > setEnabled ( true ) ;
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
connect ( exportAction , SIGNAL ( triggered ( ) ) , receiveCoinsPage , SLOT ( exportClicked ( ) ) ) ;
2011-07-07 11:33:15 -04:00
}
void BitcoinGUI : : gotoSendCoinsPage ( )
{
sendCoinsAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( sendCoinsPage ) ;
2011-07-09 04:53:55 -04:00
exportAction - > setEnabled ( false ) ;
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
2011-07-05 16:09:39 -04:00
}
2011-07-07 08:27:16 -04:00
2012-06-15 03:48:26 -04:00
void BitcoinGUI : : gotoSignMessageTab ( QString addr )
2011-12-23 12:14:57 -03:00
{
2012-06-15 03:48:26 -04:00
// call show() in showTab_SM()
signVerifyMessageDialog - > showTab_SM ( true ) ;
2012-05-05 09:24:06 -04:00
if ( ! addr . isEmpty ( ) )
2012-06-15 03:48:26 -04:00
signVerifyMessageDialog - > setAddress_SM ( addr ) ;
}
2012-05-05 09:24:06 -04:00
2012-06-15 03:48:26 -04:00
void BitcoinGUI : : gotoVerifyMessageTab ( QString addr )
{
// call show() in showTab_VM()
signVerifyMessageDialog - > showTab_VM ( true ) ;
if ( ! addr . isEmpty ( ) )
signVerifyMessageDialog - > setAddress_VM ( addr ) ;
2011-12-23 12:14:57 -03:00
}
2011-08-07 10:04:48 -04:00
void BitcoinGUI : : dragEnterEvent ( QDragEnterEvent * event )
{
2012-03-25 18:25:10 -03:00
// Accept only URIs
2011-08-07 10:04:48 -04:00
if ( event - > mimeData ( ) - > hasUrls ( ) )
event - > acceptProposedAction ( ) ;
}
void BitcoinGUI : : dropEvent ( QDropEvent * event )
{
if ( event - > mimeData ( ) - > hasUrls ( ) )
{
2012-03-28 09:55:29 -03:00
int nValidUrisFound = 0 ;
2012-03-25 18:25:10 -03:00
QList < QUrl > uris = event - > mimeData ( ) - > urls ( ) ;
foreach ( const QUrl & uri , uris )
2011-08-07 10:04:48 -04:00
{
2012-03-28 09:55:29 -03:00
if ( sendCoinsPage - > handleURI ( uri . toString ( ) ) )
nValidUrisFound + + ;
2011-08-07 10:04:48 -04:00
}
2012-03-28 09:55:29 -03:00
// if valid URIs were found
if ( nValidUrisFound )
gotoSendCoinsPage ( ) ;
else
notificator - > notify ( Notificator : : Warning , tr ( " URI handling " ) , tr ( " URI can not be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. " ) ) ;
2011-08-07 10:04:48 -04:00
}
event - > acceptProposedAction ( ) ;
}
2012-03-25 18:25:10 -03:00
void BitcoinGUI : : handleURI ( QString strURI )
2011-12-24 01:27:12 -03:00
{
2012-03-28 09:55:29 -03:00
// URI has to be valid
if ( sendCoinsPage - > handleURI ( strURI ) )
{
showNormalIfMinimized ( ) ;
gotoSendCoinsPage ( ) ;
}
else
notificator - > notify ( Notificator : : Warning , tr ( " URI handling " ) , tr ( " URI can not be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters. " ) ) ;
2011-12-24 01:27:12 -03:00
}
2011-08-23 15:08:42 -03:00
void BitcoinGUI : : setEncryptionStatus ( int status )
{
switch ( status )
{
case WalletModel : : Unencrypted :
labelEncryptionIcon - > hide ( ) ;
2011-08-24 17:07:26 -03:00
encryptWalletAction - > setChecked ( false ) ;
changePassphraseAction - > setEnabled ( false ) ;
encryptWalletAction - > setEnabled ( true ) ;
2011-08-23 15:08:42 -03:00
break ;
case WalletModel : : Unlocked :
labelEncryptionIcon - > show ( ) ;
labelEncryptionIcon - > setPixmap ( QIcon ( " :/icons/lock_open " ) . pixmap ( STATUSBAR_ICONSIZE , STATUSBAR_ICONSIZE ) ) ;
labelEncryptionIcon - > setToolTip ( tr ( " Wallet is <b>encrypted</b> and currently <b>unlocked</b> " ) ) ;
2011-08-24 17:07:26 -03:00
encryptWalletAction - > setChecked ( true ) ;
changePassphraseAction - > setEnabled ( true ) ;
encryptWalletAction - > setEnabled ( false ) ; // TODO: decrypt currently not supported
2011-08-23 15:08:42 -03:00
break ;
case WalletModel : : Locked :
labelEncryptionIcon - > show ( ) ;
labelEncryptionIcon - > setPixmap ( QIcon ( " :/icons/lock_closed " ) . pixmap ( STATUSBAR_ICONSIZE , STATUSBAR_ICONSIZE ) ) ;
labelEncryptionIcon - > setToolTip ( tr ( " Wallet is <b>encrypted</b> and currently <b>locked</b> " ) ) ;
2011-08-24 17:07:26 -03:00
encryptWalletAction - > setChecked ( true ) ;
changePassphraseAction - > setEnabled ( true ) ;
encryptWalletAction - > setEnabled ( false ) ; // TODO: decrypt currently not supported
2011-08-23 15:08:42 -03:00
break ;
}
}
2011-08-24 17:07:26 -03:00
void BitcoinGUI : : encryptWallet ( bool status )
{
2011-11-08 17:18:36 -03:00
if ( ! walletModel )
return ;
2011-08-24 17:07:26 -03:00
AskPassphraseDialog dlg ( status ? AskPassphraseDialog : : Encrypt :
AskPassphraseDialog : : Decrypt , this ) ;
dlg . setModel ( walletModel ) ;
dlg . exec ( ) ;
setEncryptionStatus ( walletModel - > getEncryptionStatus ( ) ) ;
}
2012-02-14 09:14:43 -03:00
void BitcoinGUI : : backupWallet ( )
{
QString saveDir = QDesktopServices : : storageLocation ( QDesktopServices : : DocumentsLocation ) ;
QString filename = QFileDialog : : getSaveFileName ( this , tr ( " Backup Wallet " ) , saveDir , tr ( " Wallet Data (*.dat) " ) ) ;
if ( ! filename . isEmpty ( ) ) {
if ( ! walletModel - > backupWallet ( filename ) ) {
QMessageBox : : warning ( this , tr ( " Backup Failed " ) , tr ( " There was an error trying to save the wallet data to the new location. " ) ) ;
}
}
}
2011-08-24 17:07:26 -03:00
void BitcoinGUI : : changePassphrase ( )
{
AskPassphraseDialog dlg ( AskPassphraseDialog : : ChangePass , this ) ;
dlg . setModel ( walletModel ) ;
dlg . exec ( ) ;
}
void BitcoinGUI : : unlockWallet ( )
{
2011-11-08 17:18:36 -03:00
if ( ! walletModel )
return ;
2011-08-31 11:08:31 -03:00
// Unlock wallet when requested by wallet model
2011-08-24 17:07:26 -03:00
if ( walletModel - > getEncryptionStatus ( ) = = WalletModel : : Locked )
{
AskPassphraseDialog dlg ( AskPassphraseDialog : : Unlock , this ) ;
dlg . setModel ( walletModel ) ;
dlg . exec ( ) ;
}
}
2012-02-17 19:19:52 -03:00
2012-06-05 01:23:26 -04:00
void BitcoinGUI : : showNormalIfMinimized ( bool fToggleHidden )
2012-02-17 19:19:52 -03:00
{
2012-06-05 01:23:26 -04:00
// activateWindow() (sometimes) helps with keyboard focus on Windows
if ( isHidden ( ) )
{
2012-02-17 19:19:52 -03:00
show ( ) ;
2012-06-05 01:23:26 -04:00
activateWindow ( ) ;
}
else if ( isMinimized ( ) )
{
2012-02-17 19:19:52 -03:00
showNormal ( ) ;
2012-06-05 01:23:26 -04:00
activateWindow ( ) ;
}
else if ( GUIUtil : : isObscured ( this ) )
{
raise ( ) ;
activateWindow ( ) ;
}
else if ( fToggleHidden )
hide ( ) ;
}
void BitcoinGUI : : toggleHidden ( )
{
showNormalIfMinimized ( true ) ;
2012-02-17 19:19:52 -03:00
}