@ -22,6 +22,10 @@
# include "askpassphrasedialog.h"
# include "askpassphrasedialog.h"
# include "notificator.h"
# include "notificator.h"
# ifdef Q_WS_MAC
# include "macdockiconhandler.h"
# endif
# include <QApplication>
# include <QApplication>
# include <QMainWindow>
# include <QMainWindow>
# include <QMenuBar>
# include <QMenuBar>
@ -57,40 +61,26 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
{
{
resize ( 850 , 550 ) ;
resize ( 850 , 550 ) ;
setWindowTitle ( tr ( " Bitcoin Wallet " ) ) ;
setWindowTitle ( tr ( " Bitcoin Wallet " ) ) ;
# ifndef Q_WS_MAC
setWindowIcon ( QIcon ( " :icons/bitcoin " ) ) ;
setWindowIcon ( QIcon ( " :icons/bitcoin " ) ) ;
# else
setUnifiedTitleAndToolBarOnMac ( true ) ;
QApplication : : setAttribute ( Qt : : AA_DontShowIconsInMenus ) ;
# endif
// Accept D&D of URIs
// Accept D&D of URIs
setAcceptDrops ( true ) ;
setAcceptDrops ( true ) ;
// Create actions for the toolbar, menu bar and tray/dock icon
createActions ( ) ;
createActions ( ) ;
// Menus
// Create application menu bar
QMenu * file = menuBar ( ) - > addMenu ( tr ( " &File " ) ) ;
createMenuBar ( ) ;
file - > addAction ( sendCoinsAction ) ;
file - > addAction ( receiveCoinsAction ) ;
file - > addSeparator ( ) ;
file - > addAction ( quitAction ) ;
QMenu * settings = menuBar ( ) - > addMenu ( tr ( " &Settings " ) ) ;
// Create the toolbars
settings - > addAction ( encryptWalletAction ) ;
createToolBars ( ) ;
settings - > addAction ( changePassphraseAction ) ;
settings - > addSeparator ( ) ;
settings - > addAction ( optionsAction ) ;
QMenu * help = menuBar ( ) - > addMenu ( tr ( " &Help " ) ) ;
help - > addAction ( aboutAction ) ;
// Toolbars
// Create the tray icon (or setup the dock icon)
QToolBar * toolbar = addToolBar ( tr ( " Tabs toolbar " ) ) ;
createTrayIcon ( ) ;
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 ) ;
// Create tabs
// Create tabs
overviewPage = new OverviewPage ( ) ;
overviewPage = new OverviewPage ( ) ;
@ -149,8 +139,6 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
statusBar ( ) - > addWidget ( progressBar ) ;
statusBar ( ) - > addWidget ( progressBar ) ;
statusBar ( ) - > addPermanentWidget ( frameBlocks ) ;
statusBar ( ) - > addPermanentWidget ( frameBlocks ) ;
createTrayIcon ( ) ;
syncIconMovie = new QMovie ( " :/movies/update_spinner " , " mng " , this ) ;
syncIconMovie = new QMovie ( " :/movies/update_spinner " , " mng " , this ) ;
// 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
@ -162,6 +150,13 @@ BitcoinGUI::BitcoinGUI(QWidget *parent):
gotoOverviewPage ( ) ;
gotoOverviewPage ( ) ;
}
}
BitcoinGUI : : ~ BitcoinGUI ( )
{
# ifdef Q_WS_MAC
delete appMenuBar ;
# endif
}
void BitcoinGUI : : createActions ( )
void BitcoinGUI : : createActions ( )
{
{
QActionGroup * tabGroup = new QActionGroup ( this ) ;
QActionGroup * tabGroup = new QActionGroup ( this ) ;
@ -169,26 +164,31 @@ void BitcoinGUI::createActions()
overviewAction = new QAction ( QIcon ( " :/icons/overview " ) , tr ( " &Overview " ) , this ) ;
overviewAction = new QAction ( QIcon ( " :/icons/overview " ) , tr ( " &Overview " ) , this ) ;
overviewAction - > setToolTip ( tr ( " Show general overview of wallet " ) ) ;
overviewAction - > setToolTip ( tr ( " Show general overview of wallet " ) ) ;
overviewAction - > setCheckable ( true ) ;
overviewAction - > setCheckable ( true ) ;
overviewAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_1 ) ) ;
tabGroup - > addAction ( overviewAction ) ;
tabGroup - > addAction ( overviewAction ) ;
historyAction = new QAction ( QIcon ( " :/icons/history " ) , tr ( " &Transactions " ) , this ) ;
historyAction = new QAction ( QIcon ( " :/icons/history " ) , tr ( " &Transactions " ) , this ) ;
historyAction - > setToolTip ( tr ( " Browse transaction history " ) ) ;
historyAction - > setToolTip ( tr ( " Browse transaction history " ) ) ;
historyAction - > setCheckable ( true ) ;
historyAction - > setCheckable ( true ) ;
historyAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_4 ) ) ;
tabGroup - > addAction ( historyAction ) ;
tabGroup - > addAction ( historyAction ) ;
addressBookAction = new QAction ( QIcon ( " :/icons/address-book " ) , tr ( " &Address Book " ) , this ) ;
addressBookAction = new QAction ( QIcon ( " :/icons/address-book " ) , tr ( " &Address Book " ) , this ) ;
addressBookAction - > setToolTip ( tr ( " Edit the list of stored addresses and labels " ) ) ;
addressBookAction - > setToolTip ( tr ( " Edit the list of stored addresses and labels " ) ) ;
addressBookAction - > setCheckable ( true ) ;
addressBookAction - > setCheckable ( true ) ;
addressBookAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_5 ) ) ;
tabGroup - > addAction ( addressBookAction ) ;
tabGroup - > addAction ( addressBookAction ) ;
receiveCoinsAction = new QAction ( QIcon ( " :/icons/receiving_addresses " ) , tr ( " &Receive coins " ) , this ) ;
receiveCoinsAction = new QAction ( QIcon ( " :/icons/receiving_addresses " ) , tr ( " &Receive coins " ) , this ) ;
receiveCoinsAction - > setToolTip ( tr ( " Show the list of addresses for receiving payments " ) ) ;
receiveCoinsAction - > setToolTip ( tr ( " Show the list of addresses for receiving payments " ) ) ;
receiveCoinsAction - > setCheckable ( true ) ;
receiveCoinsAction - > setCheckable ( true ) ;
receiveCoinsAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_3 ) ) ;
tabGroup - > addAction ( receiveCoinsAction ) ;
tabGroup - > addAction ( receiveCoinsAction ) ;
sendCoinsAction = new QAction ( QIcon ( " :/icons/send " ) , tr ( " &Send coins " ) , this ) ;
sendCoinsAction = new QAction ( QIcon ( " :/icons/send " ) , tr ( " &Send coins " ) , this ) ;
sendCoinsAction - > setToolTip ( tr ( " Send coins to a bitcoin address " ) ) ;
sendCoinsAction - > setToolTip ( tr ( " Send coins to a bitcoin address " ) ) ;
sendCoinsAction - > setCheckable ( true ) ;
sendCoinsAction - > setCheckable ( true ) ;
sendCoinsAction - > setShortcut ( QKeySequence ( Qt : : ALT + Qt : : Key_2 ) ) ;
tabGroup - > addAction ( sendCoinsAction ) ;
tabGroup - > addAction ( sendCoinsAction ) ;
connect ( overviewAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoOverviewPage ( ) ) ) ;
connect ( overviewAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoOverviewPage ( ) ) ) ;
@ -197,12 +197,16 @@ void BitcoinGUI::createActions()
connect ( receiveCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoReceiveCoinsPage ( ) ) ) ;
connect ( receiveCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoReceiveCoinsPage ( ) ) ) ;
connect ( sendCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoSendCoinsPage ( ) ) ) ;
connect ( sendCoinsAction , SIGNAL ( triggered ( ) ) , this , SLOT ( gotoSendCoinsPage ( ) ) ) ;
quitAction = new QAction ( QIcon ( " :/icons/quit " ) , tr ( " &E xit " ) , this ) ;
quitAction = new QAction ( QIcon ( " :/icons/quit " ) , tr ( " E &xit" ) , this ) ;
quitAction - > setToolTip ( tr ( " Quit application " ) ) ;
quitAction - > setToolTip ( tr ( " Quit application " ) ) ;
aboutAction = new QAction ( QIcon ( " :/icons/bitcoin " ) , tr ( " &About " ) , this ) ;
quitAction - > setShortcut ( QKeySequence ( Qt : : CTRL + Qt : : Key_Q ) ) ;
quitAction - > setMenuRole ( QAction : : QuitRole ) ;
aboutAction = new QAction ( QIcon ( " :/icons/bitcoin " ) , tr ( " &About %1 " ) . arg ( qApp - > applicationName ( ) ) , this ) ;
aboutAction - > setToolTip ( tr ( " Show information about Bitcoin " ) ) ;
aboutAction - > setToolTip ( tr ( " Show information about Bitcoin " ) ) ;
aboutAction - > setMenuRole ( QAction : : AboutQtRole ) ;
optionsAction = new QAction ( QIcon ( " :/icons/options " ) , tr ( " &Options... " ) , this ) ;
optionsAction = new QAction ( QIcon ( " :/icons/options " ) , tr ( " &Options... " ) , this ) ;
optionsAction - > setToolTip ( tr ( " Modify configuration options for bitcoin " ) ) ;
optionsAction - > setToolTip ( tr ( " Modify configuration options for bitcoin " ) ) ;
optionsAction - > setMenuRole ( QAction : : PreferencesRole ) ;
openBitcoinAction = new QAction ( QIcon ( " :/icons/bitcoin " ) , tr ( " Open &Bitcoin " ) , this ) ;
openBitcoinAction = new QAction ( QIcon ( " :/icons/bitcoin " ) , tr ( " Open &Bitcoin " ) , this ) ;
openBitcoinAction - > setToolTip ( tr ( " Show the Bitcoin window " ) ) ;
openBitcoinAction - > setToolTip ( tr ( " Show the Bitcoin window " ) ) ;
exportAction = new QAction ( QIcon ( " :/icons/export " ) , tr ( " &Export... " ) , this ) ;
exportAction = new QAction ( QIcon ( " :/icons/export " ) , tr ( " &Export... " ) , this ) ;
@ -221,6 +225,45 @@ void BitcoinGUI::createActions()
connect ( changePassphraseAction , SIGNAL ( triggered ( ) ) , this , SLOT ( changePassphrase ( ) ) ) ;
connect ( changePassphraseAction , SIGNAL ( triggered ( ) ) , this , SLOT ( changePassphrase ( ) ) ) ;
}
}
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 " ) ) ;
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 " ) ) ;
help - > addAction ( aboutAction ) ;
}
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 ) ;
}
void BitcoinGUI : : setClientModel ( ClientModel * clientModel )
void BitcoinGUI : : setClientModel ( ClientModel * clientModel )
{
{
this - > clientModel = clientModel ;
this - > clientModel = clientModel ;
@ -229,7 +272,11 @@ void BitcoinGUI::setClientModel(ClientModel *clientModel)
{
{
QString title_testnet = windowTitle ( ) + QString ( " " ) + tr ( " [testnet] " ) ;
QString title_testnet = windowTitle ( ) + QString ( " " ) + tr ( " [testnet] " ) ;
setWindowTitle ( title_testnet ) ;
setWindowTitle ( title_testnet ) ;
# ifndef Q_WS_MAC
setWindowIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
setWindowIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
# else
MacDockIconHandler : : instance ( ) - > setIcon ( QIcon ( " :icons/bitcoin_testnet " ) ) ;
# endif
if ( trayIcon )
if ( trayIcon )
{
{
trayIcon - > setToolTip ( title_testnet ) ;
trayIcon - > setToolTip ( title_testnet ) ;
@ -276,23 +323,39 @@ void BitcoinGUI::setWalletModel(WalletModel *walletModel)
void BitcoinGUI : : createTrayIcon ( )
void BitcoinGUI : : createTrayIcon ( )
{
{
QMenu * trayIconMenu = new QMenu ( this ) ;
QMenu * trayIconMenu ;
trayIconMenu - > addAction ( openBitcoinAction ) ;
# ifndef Q_WS_MAC
trayIconMenu - > addAction ( optionsAction ) ;
trayIconMenu - > addSeparator ( ) ;
trayIconMenu - > addAction ( quitAction ) ;
trayIcon = new QSystemTrayIcon ( this ) ;
trayIcon = new QSystemTrayIcon ( this ) ;
trayIconMenu = new QMenu ( this ) ;
trayIcon - > setContextMenu ( trayIconMenu ) ;
trayIcon - > setContextMenu ( trayIconMenu ) ;
trayIcon - > setToolTip ( " Bitcoin client " ) ;
trayIcon - > setToolTip ( " Bitcoin client " ) ;
trayIcon - > setIcon ( QIcon ( " :/icons/toolbar " ) ) ;
trayIcon - > setIcon ( QIcon ( " :/icons/toolbar " ) ) ;
connect ( trayIcon , SIGNAL ( activated ( QSystemTrayIcon : : ActivationReason ) ) ,
connect ( trayIcon , SIGNAL ( activated ( QSystemTrayIcon : : ActivationReason ) ) ,
this , SLOT ( trayIconActivated ( QSystemTrayIcon : : ActivationReason ) ) ) ;
this , SLOT ( trayIconActivated ( QSystemTrayIcon : : ActivationReason ) ) ) ;
trayIcon - > show ( ) ;
trayIcon - > show ( ) ;
# else
// Note: On Mac, the dock icon is used to provide the tray's functionality.
MacDockIconHandler * dockIconHandler = MacDockIconHandler : : instance ( ) ;
connect ( dockIconHandler , SIGNAL ( dockIconClicked ( ) ) , openBitcoinAction , SLOT ( trigger ( ) ) ) ;
trayIconMenu = dockIconHandler - > dockMenu ( ) ;
# endif
// Configuration of the tray icon (or dock icon) icon menu
trayIconMenu - > addAction ( openBitcoinAction ) ;
trayIconMenu - > addSeparator ( ) ;
trayIconMenu - > addAction ( receiveCoinsAction ) ;
trayIconMenu - > addAction ( sendCoinsAction ) ;
trayIconMenu - > addSeparator ( ) ;
trayIconMenu - > addAction ( optionsAction ) ;
# ifndef Q_WS_MAC // This is built-in on Mac
trayIconMenu - > addSeparator ( ) ;
trayIconMenu - > addAction ( quitAction ) ;
# endif
notificator = new Notificator ( tr ( " bitcoin-qt " ) , trayIcon ) ;
notificator = new Notificator ( tr ( " bitcoin-qt " ) , trayIcon ) ;
}
}
# ifndef Q_WS_MAC
void BitcoinGUI : : trayIconActivated ( QSystemTrayIcon : : ActivationReason reason )
void BitcoinGUI : : trayIconActivated ( QSystemTrayIcon : : ActivationReason reason )
{
{
if ( reason = = QSystemTrayIcon : : Trigger )
if ( reason = = QSystemTrayIcon : : Trigger )
@ -302,6 +365,7 @@ void BitcoinGUI::trayIconActivated(QSystemTrayIcon::ActivationReason reason)
}
}
}
}
# endif
void BitcoinGUI : : optionsClicked ( )
void BitcoinGUI : : optionsClicked ( )
{
{
@ -405,9 +469,10 @@ void BitcoinGUI::error(const QString &title, const QString &message)
void BitcoinGUI : : changeEvent ( QEvent * e )
void BitcoinGUI : : changeEvent ( QEvent * e )
{
{
# ifndef Q_WS_MAC // Ignored on Mac
if ( e - > type ( ) = = QEvent : : WindowStateChange )
if ( e - > type ( ) = = QEvent : : WindowStateChange )
{
{
if ( clientModel - > getOptionsModel ( ) - > getMinimizeToTray ( ) )
if ( clientModel - > getOptionsModel ( ) - > getMinimizeToTray ( ) )
{
{
if ( isMinimized ( ) )
if ( isMinimized ( ) )
{
{
@ -421,16 +486,19 @@ void BitcoinGUI::changeEvent(QEvent *e)
}
}
}
}
}
}
# endif
QMainWindow : : changeEvent ( e ) ;
QMainWindow : : changeEvent ( e ) ;
}
}
void BitcoinGUI : : closeEvent ( QCloseEvent * event )
void BitcoinGUI : : closeEvent ( QCloseEvent * event )
{
{
# ifndef Q_WS_MAC // Ignored on Mac
if ( ! clientModel - > getOptionsModel ( ) - > getMinimizeToTray ( ) & &
if ( ! clientModel - > getOptionsModel ( ) - > getMinimizeToTray ( ) & &
! clientModel - > getOptionsModel ( ) - > getMinimizeOnClose ( ) )
! clientModel - > getOptionsModel ( ) - > getMinimizeOnClose ( ) )
{
{
qApp - > quit ( ) ;
qApp - > quit ( ) ;
}
}
# endif
QMainWindow : : closeEvent ( event ) ;
QMainWindow : : closeEvent ( event ) ;
}
}
@ -482,6 +550,7 @@ void BitcoinGUI::incomingTransaction(const QModelIndex & parent, int start, int
void BitcoinGUI : : gotoOverviewPage ( )
void BitcoinGUI : : gotoOverviewPage ( )
{
{
show ( ) ;
overviewAction - > setChecked ( true ) ;
overviewAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( overviewPage ) ;
centralWidget - > setCurrentWidget ( overviewPage ) ;
@ -491,6 +560,7 @@ void BitcoinGUI::gotoOverviewPage()
void BitcoinGUI : : gotoHistoryPage ( )
void BitcoinGUI : : gotoHistoryPage ( )
{
{
show ( ) ;
historyAction - > setChecked ( true ) ;
historyAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( transactionsPage ) ;
centralWidget - > setCurrentWidget ( transactionsPage ) ;
@ -501,6 +571,7 @@ void BitcoinGUI::gotoHistoryPage()
void BitcoinGUI : : gotoAddressBookPage ( )
void BitcoinGUI : : gotoAddressBookPage ( )
{
{
show ( ) ;
addressBookAction - > setChecked ( true ) ;
addressBookAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( addressBookPage ) ;
centralWidget - > setCurrentWidget ( addressBookPage ) ;
@ -511,6 +582,7 @@ void BitcoinGUI::gotoAddressBookPage()
void BitcoinGUI : : gotoReceiveCoinsPage ( )
void BitcoinGUI : : gotoReceiveCoinsPage ( )
{
{
show ( ) ;
receiveCoinsAction - > setChecked ( true ) ;
receiveCoinsAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( receiveCoinsPage ) ;
centralWidget - > setCurrentWidget ( receiveCoinsPage ) ;
@ -521,6 +593,7 @@ void BitcoinGUI::gotoReceiveCoinsPage()
void BitcoinGUI : : gotoSendCoinsPage ( )
void BitcoinGUI : : gotoSendCoinsPage ( )
{
{
show ( ) ;
sendCoinsAction - > setChecked ( true ) ;
sendCoinsAction - > setChecked ( true ) ;
centralWidget - > setCurrentWidget ( sendCoinsPage ) ;
centralWidget - > setCurrentWidget ( sendCoinsPage ) ;