2011-05-07 22:13:39 +02:00
/*
2011-05-10 19:03:10 +02:00
* Qt4 bitcoin GUI .
*
2012-05-12 05:36:37 +02:00
* W . J . van der Laan 2011 - 2012
2012-05-12 05:32:03 +02:00
* The Bitcoin Developers 2011 - 2012
2011-05-07 22:13:39 +02:00
*/
2011-05-12 14:49:42 +02:00
# include "bitcoingui.h"
# include "transactiontablemodel.h"
2011-07-07 17:33:15 +02:00
# include "addressbookpage.h"
2011-05-12 14:49:42 +02:00
# include "sendcoinsdialog.h"
2012-06-15 09:48:26 +02:00
# include "signverifymessagedialog.h"
2011-05-12 14:49:42 +02:00
# include "optionsdialog.h"
# include "aboutdialog.h"
2011-05-22 17:19:43 +02:00
# include "clientmodel.h"
2011-06-30 18:05:29 +02:00
# include "walletmodel.h"
2011-06-03 21:03:20 +02:00
# include "editaddressdialog.h"
2011-06-05 14:19:57 +02:00
# include "optionsmodel.h"
2011-06-10 15:05:51 +02:00
# include "transactiondescdialog.h"
2011-06-21 20:34:43 +02:00
# include "addresstablemodel.h"
2011-06-28 21:41:56 +02:00
# include "transactionview.h"
2011-07-05 22:09:39 +02:00
# include "overviewpage.h"
2011-07-25 21:35:45 +02:00
# include "bitcoinunits.h"
2011-08-23 20:08:42 +02:00
# include "guiconstants.h"
2011-08-24 22:07:26 +02:00
# include "askpassphrasedialog.h"
2011-09-03 20:52:54 +02:00
# include "notificator.h"
2012-02-17 15:34:53 +01:00
# include "guiutil.h"
2012-04-09 21:07:25 +02:00
# include "rpcconsole.h"
2011-05-07 22:13:39 +02:00
2011-10-07 13:21:45 +02:00
# ifdef Q_WS_MAC
# include "macdockiconhandler.h"
# endif
2011-05-07 22:13:39 +02:00
# include <QApplication>
# include <QMainWindow>
# include <QMenuBar>
# include <QMenu>
# include <QIcon>
2011-05-10 19:03:10 +02:00
# include <QTabWidget>
2011-05-07 22:13:39 +02:00
# include <QVBoxLayout>
# include <QToolBar>
# include <QStatusBar>
# include <QLabel>
# include <QLineEdit>
# include <QPushButton>
2011-05-09 20:44:46 +02:00
# include <QLocale>
2011-05-30 20:20:12 +02:00
# include <QMessageBox>
2011-06-18 21:25:38 +02:00
# include <QProgressBar>
2011-07-05 22:09:39 +02:00
# include <QStackedWidget>
2011-07-08 18:05:10 +02:00
# include <QDateTime>
2011-07-17 17:30:58 +02:00
# include <QMovie>
2012-02-14 13:14:43 +01:00
# include <QFileDialog>
# include <QDesktopServices>
2012-03-15 22:30:08 +01:00
# include <QTimer>
2011-08-07 16:04:48 +02:00
# include <QDragEnterEvent>
# include <QUrl>
2012-08-24 14:47:54 +02:00
# include <QStyle>
2011-08-07 16:04:48 +02:00
2011-05-07 22:13:39 +02:00
# include <iostream>
BitcoinGUI : : BitcoinGUI ( QWidget * parent ) :
2011-06-30 18:05:29 +02:00
QMainWindow ( parent ) ,
clientModel ( 0 ) ,
walletModel ( 0 ) ,
2011-08-24 22:07:26 +02:00
encryptWalletAction ( 0 ) ,
changePassphraseAction ( 0 ) ,
2011-12-13 17:30:13 +01:00
aboutQtAction ( 0 ) ,
2011-09-03 20:52:54 +02:00
trayIcon ( 0 ) ,
2012-04-09 21:07:25 +02:00
notificator ( 0 ) ,
rpcConsole ( 0 )
2011-05-07 22:13:39 +02:00
{
resize ( 850 , 550 ) ;
2012-07-13 08:29:36 +02:00
setWindowTitle ( tr ( " Bitcoin " ) + " - " + tr ( " Wallet " ) ) ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2012-05-11 12:35:17 +02:00
qApp - > setWindowIcon ( QIcon ( " :icons/bitcoin " ) ) ;
2011-05-09 20:44:46 +02:00
setWindowIcon ( QIcon ( " :icons/bitcoin " ) ) ;
2011-10-07 13:21:45 +02:00
# else
setUnifiedTitleAndToolBarOnMac ( true ) ;
QApplication : : setAttribute ( Qt : : AA_DontShowIconsInMenus ) ;
# endif
2011-08-08 17:38:17 +02:00
// Accept D&D of URIs
setAcceptDrops ( true ) ;
2011-05-12 20:16:42 +02:00
2011-10-07 13:21:45 +02:00
// Create actions for the toolbar, menu bar and tray/dock icon
2011-05-12 20:16:42 +02:00
createActions ( ) ;
2011-05-10 19:03:10 +02:00
2011-10-07 13:21:45 +02:00
// Create application menu bar
createMenuBar ( ) ;
2011-07-16 19:28:15 +02:00
2011-10-07 13:21:45 +02:00
// Create the toolbars
createToolBars ( ) ;
2011-05-07 22:13:39 +02:00
2011-10-07 13:21:45 +02:00
// Create the tray icon (or setup the dock icon)
createTrayIcon ( ) ;
2011-07-05 22:09:39 +02:00
2011-08-08 17:38:17 +02:00
// Create tabs
2011-07-07 14:27:16 +02:00
overviewPage = new OverviewPage ( ) ;
2011-05-12 20:16:42 +02:00
2011-08-08 17:38:17 +02:00
transactionsPage = new QWidget ( this ) ;
QVBoxLayout * vbox = new QVBoxLayout ( ) ;
2011-06-28 21:41:56 +02:00
transactionView = new TransactionView ( this ) ;
vbox - > addWidget ( transactionView ) ;
2011-07-05 22:09:39 +02:00
transactionsPage - > setLayout ( vbox ) ;
2011-07-07 17:33:15 +02:00
addressBookPage = new AddressBookPage ( AddressBookPage : : ForEditing , AddressBookPage : : SendingTab ) ;
receiveCoinsPage = new AddressBookPage ( AddressBookPage : : ForEditing , AddressBookPage : : ReceivingTab ) ;
sendCoinsPage = new SendCoinsDialog ( this ) ;
2012-06-15 09:48:26 +02:00
signVerifyMessageDialog = new SignVerifyMessageDialog ( this ) ;
2011-12-23 16:14:57 +01:00
2011-07-05 22:09:39 +02:00
centralWidget = new QStackedWidget ( this ) ;
centralWidget - > addWidget ( overviewPage ) ;
centralWidget - > addWidget ( transactionsPage ) ;
2011-07-07 17:33:15 +02:00
centralWidget - > addWidget ( addressBookPage ) ;
centralWidget - > addWidget ( receiveCoinsPage ) ;
centralWidget - > addWidget ( sendCoinsPage ) ;
2011-07-05 22:09:39 +02:00
setCentralWidget ( centralWidget ) ;
2011-08-28 14:12:26 +02:00
2011-06-05 14:19:57 +02:00
// Create status bar
2011-05-12 20:16:42 +02:00
statusBar ( ) ;
2011-06-14 21:34:51 +02:00
2011-08-08 17:38:17 +02:00
// Status bar notification icons
2011-07-17 17:30:58 +02:00
QFrame * frameBlocks = new QFrame ( ) ;
2011-08-04 19:04:42 +02:00
frameBlocks - > setContentsMargins ( 0 , 0 , 0 , 0 ) ;
frameBlocks - > setMinimumWidth ( 56 ) ;
frameBlocks - > setMaximumWidth ( 56 ) ;
2011-07-17 17:30:58 +02:00
QHBoxLayout * frameBlocksLayout = new QHBoxLayout ( frameBlocks ) ;
frameBlocksLayout - > setContentsMargins ( 3 , 0 , 3 , 0 ) ;
frameBlocksLayout - > setSpacing ( 3 ) ;
2011-08-23 20:08:42 +02:00
labelEncryptionIcon = new QLabel ( ) ;
2011-08-04 19:04:42 +02:00
labelConnectionsIcon = new QLabel ( ) ;
2011-07-17 17:30:58 +02:00
labelBlocksIcon = new QLabel ( ) ;
2011-08-04 19:04:42 +02:00
frameBlocksLayout - > addStretch ( ) ;
2011-08-23 20:08:42 +02:00
frameBlocksLayout - > addWidget ( labelEncryptionIcon ) ;
frameBlocksLayout - > addStretch ( ) ;
2011-08-04 19:04:42 +02:00
frameBlocksLayout - > addWidget ( labelConnectionsIcon ) ;
frameBlocksLayout - > addStretch ( ) ;
2011-07-17 17:30:58 +02:00
frameBlocksLayout - > addWidget ( labelBlocksIcon ) ;
frameBlocksLayout - > addStretch ( ) ;
2011-06-11 12:46:09 +02:00
2012-04-02 19:07:03 +02:00
// Progress bar and label for blocks download
progressBarLabel = new QLabel ( ) ;
2011-06-18 21:25:38 +02:00
progressBarLabel - > setVisible ( false ) ;
progressBar = new QProgressBar ( ) ;
2012-04-13 18:25:56 +02:00
progressBar - > setAlignment ( Qt : : AlignCenter ) ;
2011-06-18 21:25:38 +02:00
progressBar - > setVisible ( false ) ;
2012-08-24 14:47:54 +02: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 21:25:38 +02:00
statusBar ( ) - > addWidget ( progressBarLabel ) ;
statusBar ( ) - > addWidget ( progressBar ) ;
2011-07-17 17:30:58 +02:00
statusBar ( ) - > addPermanentWidget ( frameBlocks ) ;
2011-06-18 21:25:38 +02:00
2011-07-17 17:30:58 +02:00
syncIconMovie = new QMovie ( " :/movies/update_spinner " , " mng " , this ) ;
2011-08-08 17:38:17 +02:00
// Clicking on a transaction on the overview page simply sends you to transaction history page
2011-08-04 04:41:01 +02:00
connect ( overviewPage , SIGNAL ( transactionClicked ( QModelIndex ) ) , this , SLOT ( gotoHistoryPage ( ) ) ) ;
2012-05-12 13:19:44 +02:00
connect ( overviewPage , SIGNAL ( transactionClicked ( QModelIndex ) ) , transactionView , SLOT ( focusTransaction ( QModelIndex ) ) ) ;
2011-08-04 04:41:01 +02:00
2012-07-26 02:48:39 +02:00
// Double-clicking on a transaction on the transaction history page shows details
2011-08-08 17:38:17 +02:00
connect ( transactionView , SIGNAL ( doubleClicked ( QModelIndex ) ) , transactionView , SLOT ( showDetails ( ) ) ) ;
2011-08-07 16:04:48 +02:00
2012-04-09 21:07:25 +02:00
rpcConsole = new RPCConsole ( this ) ;
connect ( openRPCConsoleAction , SIGNAL ( triggered ( ) ) , rpcConsole , SLOT ( show ( ) ) ) ;
2012-07-08 18:48:56 +02: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 16:04:48 +02:00
gotoOverviewPage ( ) ;
2011-05-12 20:16:42 +02:00
}
2011-10-07 13:21:45 +02:00
BitcoinGUI : : ~ BitcoinGUI ( )
{
2012-02-19 12:07:07 +01:00
if ( trayIcon ) // Hide tray icon, as deleting will let it linger until quit (on Ubuntu)
trayIcon - > hide ( ) ;
2011-10-07 13:21:45 +02:00
# ifdef Q_WS_MAC
delete appMenuBar ;
# endif
}
2011-05-12 20:16:42 +02:00
void BitcoinGUI : : createActions ( )
{
2011-07-05 22:09:39 +02:00
QActionGroup * tabGroup = new QActionGroup ( this ) ;
2011-07-07 17:33:15 +02:00
2011-07-05 22:09:39 +02:00
overviewAction = new QAction ( QIcon ( " :/icons/overview " ) , tr ( " &Overview " ) , this ) ;
2011-07-24 18:06:07 +02:00
overviewAction - > setToolTip ( tr ( " Show general overview of wallet " ) ) ;
2011-07-05 22:09:39 +02:00
overviewAction - > setCheckable ( true ) ;
2011-10-09 21:40:03 +02:00
overviewAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_1 ) ) ;
2011-07-05 22:09:39 +02:00
tabGroup - > addAction ( overviewAction ) ;
2011-07-07 17:33:15 +02:00
2011-07-07 10:59:00 +02:00
historyAction = new QAction ( QIcon ( " :/icons/history " ) , tr ( " &Transactions " ) , this ) ;
2011-07-24 18:06:07 +02:00
historyAction - > setToolTip ( tr ( " Browse transaction history " ) ) ;
2011-07-05 22:09:39 +02:00
historyAction - > setCheckable ( true ) ;
2011-10-09 21:40:03 +02:00
historyAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_4 ) ) ;
2011-07-05 22:09:39 +02:00
tabGroup - > addAction ( historyAction ) ;
2011-07-07 17:33:15 +02: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 21:40:03 +02:00
addressBookAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_5 ) ) ;
2011-07-07 17:33:15 +02:00
tabGroup - > addAction ( addressBookAction ) ;
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 ) ;
2011-10-09 21:40:03 +02:00
receiveCoinsAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_3 ) ) ;
2011-07-07 17:33:15 +02:00
tabGroup - > addAction ( receiveCoinsAction ) ;
sendCoinsAction = new QAction ( QIcon ( " :/icons/send " ) , tr ( " &Send coins " ) , this ) ;
2012-05-13 16:09:14 +02:00
sendCoinsAction - > setToolTip ( tr ( " Send coins to a Bitcoin address " ) ) ;
2011-07-07 17:33:15 +02:00
sendCoinsAction - > setCheckable ( true ) ;
2011-10-09 21:40:03 +02:00
sendCoinsAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_2 ) ) ;
2011-07-07 17:33:15 +02:00
tabGroup - > addAction ( sendCoinsAction ) ;
2012-06-15 09:48:26 +02:00
signMessageAction = new QAction ( QIcon ( " :/icons/edit " ) , tr ( " Sign &message... " ) , this ) ;
signMessageAction - > setToolTip ( tr ( " Sign a message to prove you own a Bitcoin address " ) ) ;
tabGroup - > addAction ( signMessageAction ) ;
verifyMessageAction = new QAction ( QIcon ( " :/icons/transaction_0 " ) , tr ( " &Verify message... " ) , this ) ;
verifyMessageAction - > setToolTip ( tr ( " Verify a message to ensure it was signed with a specified Bitcoin address " ) ) ;
tabGroup - > addAction ( verifyMessageAction ) ;
2012-02-17 23:19:52 +01:00
connect ( overviewAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
2011-07-07 17:33:15 +02:00
connect ( overviewAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoOverviewPage ( ) ) ) ;
2012-02-17 23:19:52 +01:00
connect ( historyAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
2011-07-07 17:33:15 +02:00
connect ( historyAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoHistoryPage ( ) ) ) ;
2012-02-17 23:19:52 +01:00
connect ( addressBookAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
2011-07-07 17:33:15 +02:00
connect ( addressBookAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoAddressBookPage ( ) ) ) ;
2012-02-17 23:19:52 +01:00
connect ( receiveCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
2011-07-07 17:33:15 +02:00
connect ( receiveCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoReceiveCoinsPage ( ) ) ) ;
2012-02-17 23:19:52 +01:00
connect ( sendCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
2011-07-07 17:33:15 +02:00
connect ( sendCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoSendCoinsPage ( ) ) ) ;
2012-06-15 09:48:26 +02:00
connect ( signMessageAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
connect ( signMessageAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoSignMessageTab ( ) ) ) ;
connect ( verifyMessageAction , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormalIfMinimized ( ) ) ) ;
connect ( verifyMessageAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoVerifyMessageTab ( ) ) ) ;
2011-07-07 17:33:15 +02:00
2011-10-09 21:06:28 +02:00
quitAction = new QAction ( QIcon ( " :/icons/quit " ) , tr ( " E&xit " ) , this ) ;
2011-07-07 17:33:15 +02:00
quitAction - > setToolTip ( tr ( " Quit application " ) ) ;
2011-10-09 21:06:28 +02:00
quitAction - > setShortcut ( QKeySequence ( Qt : : CTRL + Qt : : Key_Q ) ) ;
2011-10-07 13:21:45 +02:00
quitAction - > setMenuRole ( QAction : : QuitRole ) ;
2012-07-13 08:29:36 +02:00
aboutAction = new QAction ( QIcon ( " :/icons/bitcoin " ) , tr ( " &About Bitcoin " ) , this ) ;
2011-07-07 17:33:15 +02:00
aboutAction - > setToolTip ( tr ( " Show information about Bitcoin " ) ) ;
2011-12-13 17:30:13 +01:00
aboutAction - > setMenuRole ( QAction : : AboutRole ) ;
2012-08-23 21:55:03 +02:00
aboutQtAction = new QAction ( QIcon ( " :/trolltech/qmessagebox/images/qtlogo-64.png " ) , tr ( " About &Qt " ) , this ) ;
2011-12-13 17:30:13 +01:00
aboutQtAction - > setToolTip ( tr ( " Show information about Qt " ) ) ;
aboutQtAction - > setMenuRole ( QAction : : AboutQtRole ) ;
2011-07-07 17:33:15 +02:00
optionsAction = new QAction ( QIcon ( " :/icons/options " ) , tr ( " &Options... " ) , this ) ;
2012-05-13 16:09:14 +02:00
optionsAction - > setToolTip ( tr ( " Modify configuration options for Bitcoin " ) ) ;
2011-10-07 13:21:45 +02:00
optionsAction - > setMenuRole ( QAction : : PreferencesRole ) ;
2012-07-21 13:01:02 +02:00
toggleHideAction = new QAction ( QIcon ( " :/icons/bitcoin " ) , tr ( " &Show / Hide " ) , this ) ;
2011-07-07 14:27:16 +02:00
exportAction = new QAction ( QIcon ( " :/icons/export " ) , tr ( " &Export... " ) , this ) ;
2012-02-12 12:53:20 +01:00
exportAction - > setToolTip ( tr ( " Export the data in the current tab to a file " ) ) ;
2012-05-06 16:24:15 +02:00
encryptWalletAction = new QAction ( QIcon ( " :/icons/lock_closed " ) , tr ( " &Encrypt Wallet... " ) , this ) ;
2011-08-24 22:07:26 +02:00
encryptWalletAction - > setToolTip ( tr ( " Encrypt or decrypt wallet " ) ) ;
encryptWalletAction - > setCheckable ( true ) ;
2012-05-06 16:24:15 +02:00
backupWalletAction = new QAction ( QIcon ( " :/icons/filesave " ) , tr ( " &Backup Wallet... " ) , this ) ;
2012-02-14 13:14:43 +01:00
backupWalletAction - > setToolTip ( tr ( " Backup wallet to another location " ) ) ;
2012-05-06 16:24:15 +02:00
changePassphraseAction = new QAction ( QIcon ( " :/icons/key " ) , tr ( " &Change Passphrase... " ) , this ) ;
2011-08-24 22:07:26 +02:00
changePassphraseAction - > setToolTip ( tr ( " Change the passphrase used for wallet encryption " ) ) ;
2012-05-17 20:05:49 +02:00
openRPCConsoleAction = new QAction ( QIcon ( " :/icons/debugwindow " ) , tr ( " &Debug window " ) , this ) ;
2012-04-09 21:07:25 +02:00
openRPCConsoleAction - > setToolTip ( tr ( " Open debugging and diagnostic console " ) ) ;
2011-05-12 20:16:42 +02:00
2011-07-07 17:33:15 +02:00
connect ( quitAction , SIGNAL ( triggered ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
connect ( optionsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( optionsClicked ( ) ) ) ;
connect ( aboutAction , SIGNAL ( triggered ( ) ) , this , SLOT ( aboutClicked ( ) ) ) ;
2011-12-13 17:30:13 +01:00
connect ( aboutQtAction , SIGNAL ( triggered ( ) ) , qApp , SLOT ( aboutQt ( ) ) ) ;
2012-02-17 15:34:53 +01:00
connect ( toggleHideAction , SIGNAL ( triggered ( ) ) , this , SLOT ( toggleHidden ( ) ) ) ;
2011-08-24 22:07:26 +02:00
connect ( encryptWalletAction , SIGNAL ( triggered ( bool ) ) , this , SLOT ( encryptWallet ( bool ) ) ) ;
2012-02-14 13:14:43 +01:00
connect ( backupWalletAction , SIGNAL ( triggered ( ) ) , this , SLOT ( backupWallet ( ) ) ) ;
2011-08-24 22:07:26 +02:00
connect ( changePassphraseAction , SIGNAL ( triggered ( ) ) , this , SLOT ( changePassphrase ( ) ) ) ;
2011-05-12 20:16:42 +02:00
}
2011-10-07 13:21:45 +02:00
void BitcoinGUI : : createMenuBar ( )
{
# ifdef Q_WS_MAC
// 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-26 03:04:25 +01:00
file - > addAction ( backupWalletAction ) ;
2012-02-12 12:53:20 +01:00
file - > addAction ( exportAction ) ;
2012-06-15 09:48:26 +02:00
file - > addAction ( signMessageAction ) ;
2012-02-27 12:55:04 +01:00
file - > addAction ( verifyMessageAction ) ;
2012-02-26 03:04:25 +01:00
file - > addSeparator ( ) ;
2011-10-07 13:21:45 +02: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 21:07:25 +02:00
help - > addAction ( openRPCConsoleAction ) ;
help - > addSeparator ( ) ;
2011-10-07 13:21:45 +02:00
help - > addAction ( aboutAction ) ;
2011-12-13 17:30:13 +01:00
help - > addAction ( aboutQtAction ) ;
2011-10-07 13:21:45 +02: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 18:05:29 +02:00
void BitcoinGUI : : setClientModel ( ClientModel * clientModel )
2011-05-22 17:19:43 +02:00
{
2011-06-30 18:05:29 +02:00
this - > clientModel = clientModel ;
2011-11-08 21:18:36 +01:00
if ( clientModel )
2011-06-30 19:14:42 +02:00
{
2012-07-13 08:46:09 +02:00
// Replace some strings and icons, when using the testnet
2011-11-08 21:18:36 +01:00
if ( clientModel - > isTestNet ( ) )
{
2012-05-09 15:11:47 +02:00
setWindowTitle ( windowTitle ( ) + QString ( " " ) + tr ( " [testnet] " ) ) ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2012-05-11 12:35:17 +02:00
qApp - > setWindowIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
2011-11-08 21:18:36 +01:00
setWindowIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
2011-10-07 13:21:45 +02:00
# else
2011-11-08 21:18:36 +01:00
MacDockIconHandler : : instance ( ) - > setIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
2011-10-07 13:21:45 +02:00
# endif
2011-11-08 21:18:36 +01:00
if ( trayIcon )
{
2012-05-09 15:11:47 +02:00
trayIcon - > setToolTip ( tr ( " Bitcoin client " ) + QString ( " " ) + tr ( " [testnet] " ) ) ;
2011-11-08 21:18:36 +01:00
trayIcon - > setIcon ( QIcon ( " :/icons/toolbar_testnet " ) ) ;
2012-05-09 15:11:47 +02:00
toggleHideAction - > setIcon ( QIcon ( " :/icons/toolbar_testnet " ) ) ;
2011-11-08 21:18:36 +01:00
}
2012-07-13 08:46:09 +02:00
aboutAction - > setIcon ( QIcon ( " :/icons/toolbar_testnet " ) ) ;
2011-06-30 19:14:42 +02:00
}
2011-11-08 21:18:36 +01:00
// Keep up to date with client
setNumConnections ( clientModel - > getNumConnections ( ) ) ;
connect ( clientModel , SIGNAL ( numConnectionsChanged ( int ) ) , this , SLOT ( setNumConnections ( int ) ) ) ;
2011-05-22 17:19:43 +02:00
2012-05-05 16:07:14 +02:00
setNumBlocks ( clientModel - > getNumBlocks ( ) , clientModel - > getNumBlocksOfPeers ( ) ) ;
connect ( clientModel , SIGNAL ( numBlocksChanged ( int , int ) ) , this , SLOT ( setNumBlocks ( int , int ) ) ) ;
2011-05-22 17:19:43 +02:00
2011-11-08 21:18:36 +01:00
// Report errors from network/worker thread
2012-05-05 16:07:14 +02:00
connect ( clientModel , SIGNAL ( error ( QString , QString , bool ) ) , this , SLOT ( error ( QString , QString , bool ) ) ) ;
2012-04-09 21:07:25 +02:00
rpcConsole - > setClientModel ( clientModel ) ;
2012-06-24 18:28:05 +02:00
addressBookPage - > setOptionsModel ( clientModel - > getOptionsModel ( ) ) ;
receiveCoinsPage - > setOptionsModel ( clientModel - > getOptionsModel ( ) ) ;
2011-11-08 21:18:36 +01:00
}
2011-06-30 18:05:29 +02:00
}
void BitcoinGUI : : setWalletModel ( WalletModel * walletModel )
{
this - > walletModel = walletModel ;
2011-11-08 21:18:36 +01:00
if ( walletModel )
{
// Report errors from wallet thread
2012-03-25 20:47:33 +02:00
connect ( walletModel , SIGNAL ( error ( QString , QString , bool ) ) , this , SLOT ( error ( QString , QString , bool ) ) ) ;
2011-05-22 17:19:43 +02:00
2011-11-08 21:18:36 +01:00
// Put transaction list in tabs
transactionView - > setModel ( walletModel ) ;
2011-06-28 21:41:56 +02:00
2011-11-08 21:18:36 +01:00
overviewPage - > setModel ( walletModel ) ;
addressBookPage - > setModel ( walletModel - > getAddressTableModel ( ) ) ;
receiveCoinsPage - > setModel ( walletModel - > getAddressTableModel ( ) ) ;
sendCoinsPage - > setModel ( walletModel ) ;
2012-06-15 09:48:26 +02:00
signVerifyMessageDialog - > setModel ( walletModel ) ;
2011-07-07 17:33:15 +02:00
2011-11-08 21:18:36 +01:00
setEncryptionStatus ( walletModel - > getEncryptionStatus ( ) ) ;
connect ( walletModel , SIGNAL ( encryptionStatusChanged ( int ) ) , this , SLOT ( setEncryptionStatus ( int ) ) ) ;
2011-08-23 20:08:42 +02:00
2012-07-26 02:48:39 +02:00
// Balloon pop-up for new transaction
2011-11-08 21:18:36 +01:00
connect ( walletModel - > getTransactionTableModel ( ) , SIGNAL ( rowsInserted ( QModelIndex , int , int ) ) ,
this , SLOT ( incomingTransaction ( QModelIndex , int , int ) ) ) ;
2011-08-24 22:07:26 +02:00
2011-11-08 21:18:36 +01:00
// Ask for passphrase if needed
connect ( walletModel , SIGNAL ( requireUnlock ( ) ) , this , SLOT ( unlockWallet ( ) ) ) ;
}
2011-05-22 17:19:43 +02:00
}
2011-05-12 20:16:42 +02:00
void BitcoinGUI : : createTrayIcon ( )
{
2011-10-07 13:21:45 +02:00
QMenu * trayIconMenu ;
# ifndef Q_WS_MAC
2011-05-12 20:16:42 +02:00
trayIcon = new QSystemTrayIcon ( this ) ;
2011-10-07 13:21:45 +02:00
trayIconMenu = new QMenu ( this ) ;
2011-05-12 20:16:42 +02:00
trayIcon - > setContextMenu ( trayIconMenu ) ;
2012-03-29 07:58:49 +02:00
trayIcon - > setToolTip ( tr ( " Bitcoin client " ) ) ;
2011-05-13 15:58:27 +02:00
trayIcon - > setIcon ( QIcon ( " :/icons/toolbar " ) ) ;
2011-06-05 14:19:57 +02:00
connect ( trayIcon , SIGNAL ( activated ( QSystemTrayIcon : : ActivationReason ) ) ,
this , SLOT ( trayIconActivated ( QSystemTrayIcon : : ActivationReason ) ) ) ;
2011-05-12 20:16:42 +02:00
trayIcon - > show ( ) ;
2011-10-07 13:21:45 +02: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 15:34:53 +01:00
trayIconMenu - > addAction ( toggleHideAction ) ;
2011-10-07 13:21:45 +02:00
trayIconMenu - > addSeparator ( ) ;
2012-06-14 07:57:10 +02:00
trayIconMenu - > addAction ( sendCoinsAction ) ;
trayIconMenu - > addAction ( receiveCoinsAction ) ;
2011-12-23 16:14:57 +01:00
trayIconMenu - > addSeparator ( ) ;
2012-06-15 09:48:26 +02:00
trayIconMenu - > addAction ( signMessageAction ) ;
2012-06-14 07:57:10 +02:00
trayIconMenu - > addAction ( verifyMessageAction ) ;
2011-10-07 13:21:45 +02:00
trayIconMenu - > addSeparator ( ) ;
trayIconMenu - > addAction ( optionsAction ) ;
2012-06-14 07:57:10 +02:00
trayIconMenu - > addAction ( openRPCConsoleAction ) ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC // This is built-in on Mac
trayIconMenu - > addSeparator ( ) ;
trayIconMenu - > addAction ( quitAction ) ;
# endif
2011-09-03 20:52:54 +02:00
2012-05-13 16:09:14 +02:00
notificator = new Notificator ( qApp - > applicationName ( ) , trayIcon ) ;
2011-05-12 20:16:42 +02:00
}
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2011-06-05 14:19:57 +02:00
void BitcoinGUI : : trayIconActivated ( QSystemTrayIcon : : ActivationReason reason )
{
2011-08-08 17:38:17 +02:00
if ( reason = = QSystemTrayIcon : : Trigger )
2011-06-05 14:19:57 +02:00
{
2012-07-21 13:01:02 +02:00
// Click on system tray icon triggers show/hide of the main window
2012-02-17 15:34:53 +01:00
toggleHideAction - > trigger ( ) ;
2011-06-05 14:19:57 +02:00
}
}
2011-10-07 13:21:45 +02:00
# endif
2011-06-05 14:19:57 +02:00
2011-05-10 19:03:10 +02:00
void BitcoinGUI : : optionsClicked ( )
{
2011-11-08 21:18:36 +01:00
if ( ! clientModel | | ! clientModel - > getOptionsModel ( ) )
return ;
2011-05-12 09:40:40 +02:00
OptionsDialog dlg ;
2011-06-30 18:05:29 +02:00
dlg . setModel ( clientModel - > getOptionsModel ( ) ) ;
2011-05-12 09:40:40 +02:00
dlg . exec ( ) ;
2011-05-10 19:03:10 +02:00
}
2011-05-12 09:40:40 +02:00
void BitcoinGUI : : aboutClicked ( )
2011-05-10 19:03:10 +02:00
{
2011-05-12 09:40:40 +02:00
AboutDialog dlg ;
2011-07-01 17:06:36 +02:00
dlg . setModel ( clientModel ) ;
2011-05-12 09:40:40 +02:00
dlg . exec ( ) ;
2011-05-10 19:03:10 +02:00
}
2011-05-12 20:28:07 +02:00
void BitcoinGUI : : setNumConnections ( int count )
{
2011-06-14 21:34:51 +02:00
QString icon ;
switch ( count )
{
2011-06-17 17:47:40 +02: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 21:34:51 +02:00
}
2011-08-23 20:08:42 +02:00
labelConnectionsIcon - > setPixmap ( QIcon ( icon ) . pixmap ( STATUSBAR_ICONSIZE , STATUSBAR_ICONSIZE ) ) ;
2011-08-05 15:37:49 +02:00
labelConnectionsIcon - > setToolTip ( tr ( " %n active connection(s) to Bitcoin network " , " " , count ) ) ;
2011-05-12 20:28:07 +02:00
}
2012-05-05 16:07:14 +02:00
void BitcoinGUI : : setNumBlocks ( int count , int nTotalBlocks )
2011-05-12 20:28:07 +02:00
{
2012-07-26 05:25:26 +02:00
// don't show / hide progressBar and its label if we have no connection(s) to the network
2012-04-02 10:18:51 +02:00
if ( ! clientModel | | clientModel - > getNumConnections ( ) = = 0 )
{
progressBarLabel - > setVisible ( false ) ;
progressBar - > setVisible ( false ) ;
2011-11-08 21:18:36 +01:00
return ;
2012-04-02 10:18:51 +02:00
}
2012-07-13 09:01:27 +02:00
QString strStatusBarWarnings = clientModel - > getStatusBarWarnings ( ) ;
2011-07-17 14:06:43 +02:00
QString tooltip ;
2012-04-02 23:51:40 +02:00
if ( count < nTotalBlocks )
2011-06-18 21:25:38 +02:00
{
2012-04-02 23:51:40 +02:00
int nRemainingBlocks = nTotalBlocks - count ;
2012-04-03 08:30:13 +02:00
float nPercentageDone = count / ( nTotalBlocks * 0.01f ) ;
2012-04-02 15:28:53 +02:00
2012-07-13 09:01:27 +02:00
if ( strStatusBarWarnings . isEmpty ( ) )
2011-12-13 20:00:21 +01:00
{
progressBarLabel - > setText ( tr ( " Synchronizing with network... " ) ) ;
2012-04-02 19:07:03 +02:00
progressBarLabel - > setVisible ( true ) ;
2012-04-03 09:42:34 +02:00
progressBar - > setFormat ( tr ( " ~%n block(s) remaining " , " " , nRemainingBlocks ) ) ;
2012-04-02 23:51:40 +02:00
progressBar - > setMaximum ( nTotalBlocks ) ;
2012-01-17 09:19:23 +01:00
progressBar - > setValue ( count ) ;
2012-04-02 19:07:03 +02:00
progressBar - > setVisible ( true ) ;
2011-12-13 20:00:21 +01:00
}
2012-07-13 09:01:27 +02:00
2012-04-03 08:30:13 +02: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 21:25:38 +02:00
}
else
{
2012-07-13 09:01:27 +02:00
if ( strStatusBarWarnings . isEmpty ( ) )
2011-12-13 20:00:21 +01:00
progressBarLabel - > setVisible ( false ) ;
2012-07-13 09:01:27 +02:00
2011-06-18 21:25:38 +02:00
progressBar - > setVisible ( false ) ;
2011-07-17 14:06:43 +02:00
tooltip = tr ( " Downloaded %1 blocks of transaction history. " ) . arg ( count ) ;
2011-06-18 21:25:38 +02:00
}
2012-07-13 09:01:27 +02:00
// Override progressBarLabel text and hide progressBar, when we have warnings to display
if ( ! strStatusBarWarnings . isEmpty ( ) )
{
progressBarLabel - > setText ( strStatusBarWarnings ) ;
progressBarLabel - > setVisible ( true ) ;
progressBar - > setVisible ( false ) ;
}
2011-07-08 18:05:10 +02:00
QDateTime lastBlockDate = clientModel - > getLastBlockDate ( ) ;
2012-07-13 09:01:27 +02:00
int secs = lastBlockDate . secsTo ( QDateTime : : currentDateTime ( ) ) ;
2011-07-08 18:05:10 +02:00
QString text ;
2011-07-18 06:55:05 +02:00
// Represent time from last generated block in human readable text
2012-02-25 19:07:53 +01:00
if ( secs < = 0 )
{
// Fully up to date. Leave text empty.
}
else if ( secs < 60 )
2011-07-08 18:05:10 +02:00
{
2011-07-18 06:55:05 +02:00
text = tr ( " %n second(s) ago " , " " , secs ) ;
2011-07-08 18:05:10 +02: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 06:55:05 +02:00
2011-08-08 17:38:17 +02:00
// Set icon state: spinning if catching up, tick otherwise
2012-04-14 08:21:22 +02:00
if ( secs < 90 * 60 & & count > = nTotalBlocks )
2011-07-18 06:55:05 +02:00
{
2012-04-13 17:10:50 +02:00
tooltip = tr ( " Up to date " ) + QString ( " .<br> " ) + tooltip ;
2012-04-13 18:25:56 +02:00
labelBlocksIcon - > setPixmap ( QIcon ( " :/icons/synced " ) . pixmap ( STATUSBAR_ICONSIZE , STATUSBAR_ICONSIZE ) ) ;
2012-05-15 16:57:59 +02:00
overviewPage - > showOutOfSyncWarning ( false ) ;
2011-07-18 06:55:05 +02:00
}
2011-08-04 19:04:42 +02:00
else
{
2012-04-13 17:10:50 +02:00
tooltip = tr ( " Catching up... " ) + QString ( " <br> " ) + tooltip ;
2011-08-08 17:38:17 +02:00
labelBlocksIcon - > setMovie ( syncIconMovie ) ;
syncIconMovie - > start ( ) ;
2012-05-15 16:57:59 +02:00
overviewPage - > showOutOfSyncWarning ( true ) ;
2011-08-04 19:04:42 +02:00
}
2011-07-18 06:55:05 +02:00
2012-02-25 19:07:53 +01:00
if ( ! text . isEmpty ( ) )
{
2012-04-13 17:10:50 +02:00
tooltip + = QString ( " <br> " ) ;
2012-02-25 19:07:53 +01:00
tooltip + = tr ( " Last received block was generated %1. " ) . arg ( text ) ;
}
2011-07-17 17:30:58 +02:00
2012-04-13 17:10:50 +02:00
// Don't word-wrap this (fixed-width) tooltip
tooltip = QString ( " <nobr> " ) + tooltip + QString ( " </nobr> " ) ;
2011-07-17 17:30:58 +02:00
labelBlocksIcon - > setToolTip ( tooltip ) ;
2011-07-17 14:06:43 +02:00
progressBarLabel - > setToolTip ( tooltip ) ;
progressBar - > setToolTip ( tooltip ) ;
2011-05-12 20:28:07 +02:00
}
2012-03-25 20:47:33 +02:00
void BitcoinGUI : : error ( const QString & title , const QString & message , bool modal )
2011-05-30 20:20:12 +02:00
{
2011-06-05 14:19:57 +02:00
// Report errors from network/worker thread
2012-03-25 20:47:33 +02:00
if ( modal )
{
QMessageBox : : critical ( this , title , message , QMessageBox : : Ok , QMessageBox : : Ok ) ;
} else {
notificator - > notify ( Notificator : : Critical , title , message ) ;
}
2011-05-30 20:20:12 +02:00
}
2011-06-05 14:19:57 +02:00
void BitcoinGUI : : changeEvent ( QEvent * e )
{
2012-03-15 22:30:08 +01:00
QMainWindow : : changeEvent ( e ) ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC // Ignored on Mac
2011-11-13 08:45:29 +01:00
if ( e - > type ( ) = = QEvent : : WindowStateChange )
2011-06-05 14:19:57 +02:00
{
2011-11-13 08:45:29 +01:00
if ( clientModel & & clientModel - > getOptionsModel ( ) - > getMinimizeToTray ( ) )
2011-06-05 14:19:57 +02:00
{
2012-02-17 13:50:32 +01:00
QWindowStateChangeEvent * wsevt = static_cast < QWindowStateChangeEvent * > ( e ) ;
2012-03-15 22:30:08 +01:00
if ( ! ( wsevt - > oldState ( ) & Qt : : WindowMinimized ) & & isMinimized ( ) )
2011-06-07 18:59:01 +02:00
{
2012-03-15 22:30:08 +01:00
QTimer : : singleShot ( 0 , this , SLOT ( hide ( ) ) ) ;
e - > ignore ( ) ;
2011-06-05 14:19:57 +02:00
}
}
}
2011-10-07 13:21:45 +02:00
# endif
2011-06-05 14:19:57 +02:00
}
void BitcoinGUI : : closeEvent ( QCloseEvent * event )
{
2011-11-08 21:18:36 +01:00
if ( clientModel )
2011-06-05 14:19:57 +02:00
{
2011-11-08 21:18:36 +01:00
# ifndef Q_WS_MAC // Ignored on Mac
if ( ! clientModel - > getOptionsModel ( ) - > getMinimizeToTray ( ) & &
! clientModel - > getOptionsModel ( ) - > getMinimizeOnClose ( ) )
{
qApp - > quit ( ) ;
}
2011-10-07 13:21:45 +02:00
# endif
2011-11-08 21:18:36 +01:00
}
2011-06-05 14:19:57 +02:00
QMainWindow : : closeEvent ( event ) ;
}
2011-06-05 17:36:52 +02: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 21:35:45 +02:00
" Do you want to pay the fee? " ) . arg (
BitcoinUnits : : formatWithUnit ( BitcoinUnits : : BTC , nFeeRequired ) ) ;
2011-06-05 17:36:52 +02:00
QMessageBox : : StandardButton retval = QMessageBox : : question (
2012-05-06 16:24:15 +02:00
this , tr ( " Confirm transaction fee " ) , strMessage ,
2011-06-05 17:36:52 +02:00
QMessageBox : : Yes | QMessageBox : : Cancel , QMessageBox : : Yes ) ;
* payFee = ( retval = = QMessageBox : : Yes ) ;
}
2011-06-10 15:05:51 +02:00
2011-06-10 21:59:29 +02:00
void BitcoinGUI : : incomingTransaction ( const QModelIndex & parent , int start , int end )
{
2011-11-08 21:18:36 +01:00
if ( ! walletModel | | ! clientModel )
return ;
2011-06-30 18:05:29 +02:00
TransactionTableModel * ttm = walletModel - > getTransactionTableModel ( ) ;
2011-06-26 22:47:02 +02:00
qint64 amount = ttm - > index ( start , TransactionTableModel : : Amount , parent )
2011-06-10 21:59:29 +02:00
. data ( Qt : : EditRole ) . toULongLong ( ) ;
2011-07-11 21:01:53 +02:00
if ( ! clientModel - > inInitialBlockDownload ( ) )
2011-06-10 21:59:29 +02:00
{
2011-08-08 17:38:17 +02:00
// On new transaction, make an info balloon
2011-06-18 13:13:48 +02:00
// Unless the initial block download is in progress, to prevent balloon-spam
2011-06-10 21:59:29 +02:00
QString date = ttm - > index ( start , TransactionTableModel : : Date , parent )
. data ( ) . toString ( ) ;
2011-06-26 22:47:02 +02:00
QString type = ttm - > index ( start , TransactionTableModel : : Type , parent )
. data ( ) . toString ( ) ;
QString address = ttm - > index ( start , TransactionTableModel : : ToAddress , parent )
2011-06-10 21:59:29 +02:00
. data ( ) . toString ( ) ;
2011-09-03 20:52:54 +02: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 21:59:29 +02:00
}
}
2011-07-05 22:09:39 +02:00
2011-07-07 17:33:15 +02:00
void BitcoinGUI : : gotoOverviewPage ( )
2011-07-05 22:09:39 +02:00
{
overviewAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( overviewPage ) ;
2011-07-09 10:53:55 +02:00
2011-07-07 14:27:16 +02:00
exportAction - > setEnabled ( false ) ;
2011-07-09 10:53:55 +02:00
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
2011-07-05 22:09:39 +02:00
}
2011-07-07 17:33:15 +02:00
void BitcoinGUI : : gotoHistoryPage ( )
2011-07-05 22:09:39 +02:00
{
historyAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( transactionsPage ) ;
2011-07-09 10:53:55 +02:00
2011-07-07 14:27:16 +02:00
exportAction - > setEnabled ( true ) ;
2011-07-09 10:53:55 +02:00
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
connect ( exportAction , SIGNAL ( triggered ( ) ) , transactionView , SLOT ( exportClicked ( ) ) ) ;
2011-07-07 14:27:16 +02:00
}
2011-07-07 17:33:15 +02:00
void BitcoinGUI : : gotoAddressBookPage ( )
{
addressBookAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( addressBookPage ) ;
2011-07-09 10:53:55 +02:00
exportAction - > setEnabled ( true ) ;
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
connect ( exportAction , SIGNAL ( triggered ( ) ) , addressBookPage , SLOT ( exportClicked ( ) ) ) ;
2011-07-07 17:33:15 +02:00
}
void BitcoinGUI : : gotoReceiveCoinsPage ( )
{
receiveCoinsAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( receiveCoinsPage ) ;
2011-07-09 10:53:55 +02:00
exportAction - > setEnabled ( true ) ;
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
connect ( exportAction , SIGNAL ( triggered ( ) ) , receiveCoinsPage , SLOT ( exportClicked ( ) ) ) ;
2011-07-07 17:33:15 +02:00
}
void BitcoinGUI : : gotoSendCoinsPage ( )
{
sendCoinsAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( sendCoinsPage ) ;
2011-07-09 10:53:55 +02:00
exportAction - > setEnabled ( false ) ;
disconnect ( exportAction , SIGNAL ( triggered ( ) ) , 0 , 0 ) ;
2011-07-05 22:09:39 +02:00
}
2011-07-07 14:27:16 +02:00
2012-06-15 09:48:26 +02:00
void BitcoinGUI : : gotoSignMessageTab ( QString addr )
2011-12-23 16:14:57 +01:00
{
2012-06-15 09:48:26 +02:00
// call show() in showTab_SM()
signVerifyMessageDialog - > showTab_SM ( true ) ;
2012-05-05 15:24:06 +02:00
if ( ! addr . isEmpty ( ) )
2012-06-15 09:48:26 +02:00
signVerifyMessageDialog - > setAddress_SM ( addr ) ;
}
2012-05-05 15:24:06 +02:00
2012-06-15 09:48:26 +02: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 16:14:57 +01:00
}
2011-08-07 16:04:48 +02:00
void BitcoinGUI : : dragEnterEvent ( QDragEnterEvent * event )
{
2012-03-25 23:25:10 +02:00
// Accept only URIs
2011-08-07 16:04:48 +02:00
if ( event - > mimeData ( ) - > hasUrls ( ) )
event - > acceptProposedAction ( ) ;
}
void BitcoinGUI : : dropEvent ( QDropEvent * event )
{
if ( event - > mimeData ( ) - > hasUrls ( ) )
{
2012-03-28 14:55:29 +02:00
int nValidUrisFound = 0 ;
2012-03-25 23:25:10 +02:00
QList < QUrl > uris = event - > mimeData ( ) - > urls ( ) ;
foreach ( const QUrl & uri , uris )
2011-08-07 16:04:48 +02:00
{
2012-03-28 14:55:29 +02:00
if ( sendCoinsPage - > handleURI ( uri . toString ( ) ) )
nValidUrisFound + + ;
2011-08-07 16:04:48 +02:00
}
2012-03-28 14:55:29 +02: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 16:04:48 +02:00
}
event - > acceptProposedAction ( ) ;
}
2012-03-25 23:25:10 +02:00
void BitcoinGUI : : handleURI ( QString strURI )
2011-12-24 05:27:12 +01:00
{
2012-03-28 14:55:29 +02: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 05:27:12 +01:00
}
2011-08-23 20:08:42 +02:00
void BitcoinGUI : : setEncryptionStatus ( int status )
{
switch ( status )
{
case WalletModel : : Unencrypted :
labelEncryptionIcon - > hide ( ) ;
2011-08-24 22:07:26 +02:00
encryptWalletAction - > setChecked ( false ) ;
changePassphraseAction - > setEnabled ( false ) ;
encryptWalletAction - > setEnabled ( true ) ;
2011-08-23 20:08:42 +02: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 22:07:26 +02:00
encryptWalletAction - > setChecked ( true ) ;
changePassphraseAction - > setEnabled ( true ) ;
encryptWalletAction - > setEnabled ( false ) ; // TODO: decrypt currently not supported
2011-08-23 20:08:42 +02: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 22:07:26 +02:00
encryptWalletAction - > setChecked ( true ) ;
changePassphraseAction - > setEnabled ( true ) ;
encryptWalletAction - > setEnabled ( false ) ; // TODO: decrypt currently not supported
2011-08-23 20:08:42 +02:00
break ;
}
}
2011-08-24 22:07:26 +02:00
void BitcoinGUI : : encryptWallet ( bool status )
{
2011-11-08 21:18:36 +01:00
if ( ! walletModel )
return ;
2011-08-24 22:07:26 +02:00
AskPassphraseDialog dlg ( status ? AskPassphraseDialog : : Encrypt :
AskPassphraseDialog : : Decrypt , this ) ;
dlg . setModel ( walletModel ) ;
dlg . exec ( ) ;
setEncryptionStatus ( walletModel - > getEncryptionStatus ( ) ) ;
}
2012-02-14 13:14:43 +01: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 22:07:26 +02:00
void BitcoinGUI : : changePassphrase ( )
{
AskPassphraseDialog dlg ( AskPassphraseDialog : : ChangePass , this ) ;
dlg . setModel ( walletModel ) ;
dlg . exec ( ) ;
}
void BitcoinGUI : : unlockWallet ( )
{
2011-11-08 21:18:36 +01:00
if ( ! walletModel )
return ;
2011-08-31 16:08:31 +02:00
// Unlock wallet when requested by wallet model
2011-08-24 22:07:26 +02:00
if ( walletModel - > getEncryptionStatus ( ) = = WalletModel : : Locked )
{
AskPassphraseDialog dlg ( AskPassphraseDialog : : Unlock , this ) ;
dlg . setModel ( walletModel ) ;
dlg . exec ( ) ;
}
}
2012-02-17 23:19:52 +01:00
2012-06-05 07:23:26 +02:00
void BitcoinGUI : : showNormalIfMinimized ( bool fToggleHidden )
2012-02-17 23:19:52 +01:00
{
2012-06-05 07:23:26 +02:00
// activateWindow() (sometimes) helps with keyboard focus on Windows
if ( isHidden ( ) )
{
2012-02-17 23:19:52 +01:00
show ( ) ;
2012-06-05 07:23:26 +02:00
activateWindow ( ) ;
}
else if ( isMinimized ( ) )
{
2012-02-17 23:19:52 +01:00
showNormal ( ) ;
2012-06-05 07:23:26 +02:00
activateWindow ( ) ;
}
else if ( GUIUtil : : isObscured ( this ) )
{
raise ( ) ;
activateWindow ( ) ;
}
else if ( fToggleHidden )
hide ( ) ;
}
void BitcoinGUI : : toggleHidden ( )
{
showNormalIfMinimized ( true ) ;
2012-02-17 23:19:52 +01:00
}