From acec2b399f698fba30afd874ce20781a24947734 Mon Sep 17 00:00:00 2001 From: crowning- Date: Sun, 3 May 2015 15:29:35 +0200 Subject: [PATCH 1/6] Resync with upstream --- src/qt/transactionfilterproxy.cpp | 4 ---- 1 file changed, 4 deletions(-) mode change 100644 => 100755 src/qt/transactionfilterproxy.cpp diff --git a/src/qt/transactionfilterproxy.cpp b/src/qt/transactionfilterproxy.cpp old mode 100644 new mode 100755 index a0b5b15501..2a0f621d1e --- a/src/qt/transactionfilterproxy.cpp +++ b/src/qt/transactionfilterproxy.cpp @@ -21,12 +21,8 @@ TransactionFilterProxy::TransactionFilterProxy(QObject *parent) : dateFrom(MIN_DATE), dateTo(MAX_DATE), addrPrefix(), -<<<<<<< HEAD - typeFilter(COMMON_TYPES), -======= typeFilter(ALL_TYPES), watchOnlyFilter(WatchOnlyFilter_All), ->>>>>>> upstream/v0.12.0.x minAmount(0), limitRows(-1), showInactive(true) From 2154f9413159eed19ac40ce7f2cb461c2f96ff0c Mon Sep 17 00:00:00 2001 From: crowning- Date: Sun, 17 May 2015 20:56:00 +0200 Subject: [PATCH 2/6] Open peers information page when clicking on connections item --- src/qt/bitcoingui.cpp | 9 +++++++-- src/qt/bitcoingui.h | 3 ++- src/qt/transactionfilterproxy.cpp | 4 ---- 3 files changed, 9 insertions(+), 7 deletions(-) mode change 100755 => 100644 src/qt/bitcoingui.cpp mode change 100755 => 100644 src/qt/bitcoingui.h mode change 100755 => 100644 src/qt/transactionfilterproxy.cpp diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp old mode 100755 new mode 100644 index 90da0354a9..a6e502477d --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -175,7 +175,10 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : frameBlocksLayout->setSpacing(3); unitDisplayControl = new UnitDisplayStatusBarControl(); labelEncryptionIcon = new QLabel(); - labelConnectionsIcon = new QLabel(); + labelConnectionsIcon = new QPushButton(); + labelConnectionsIcon->setFlat(true); // Make the button look like a label, but clickable + labelConnectionsIcon->setStyleSheet("background-color: rgba(255, 255, 255, 0);"); + labelConnectionsIcon->setMaximumSize(16, 16); labelBlocksIcon = new QLabel(); if(enableWallet) { @@ -216,6 +219,7 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : connect(openPeersAction, SIGNAL(triggered()), rpcConsole, SLOT(showPeers())); connect(openConfEditorAction, SIGNAL(triggered()), rpcConsole, SLOT(showConfEditor())); connect(showBackupsAction, SIGNAL(triggered()), rpcConsole, SLOT(showBackups())); + connect(labelConnectionsIcon, SIGNAL(clicked()), rpcConsole, SLOT(showPeers())); // prevents an open debug window from becoming stuck/unusable on client shutdown connect(quitAction, SIGNAL(triggered()), rpcConsole, SLOT(hide())); @@ -700,7 +704,8 @@ void BitcoinGUI::setNumConnections(int count) case 7: case 8: case 9: icon = ":/icons/connect_3"; break; default: icon = ":/icons/connect_4"; break; } - labelConnectionsIcon->setPixmap(QIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + QIcon connectionItem = QIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE); + labelConnectionsIcon->setIcon(connectionItem); labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Dash network", "", count)); } diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h old mode 100755 new mode 100644 index 046b4b30a5..31a98036c5 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -16,6 +16,7 @@ #include #include #include +#include #include class ClientModel; @@ -79,7 +80,7 @@ private: UnitDisplayStatusBarControl *unitDisplayControl; QLabel *labelEncryptionIcon; - QLabel *labelConnectionsIcon; + QPushButton *labelConnectionsIcon; QLabel *labelBlocksIcon; QLabel *progressBarLabel; QProgressBar *progressBar; diff --git a/src/qt/transactionfilterproxy.cpp b/src/qt/transactionfilterproxy.cpp old mode 100755 new mode 100644 index 94ef80e7ae..420c87bc5a --- a/src/qt/transactionfilterproxy.cpp +++ b/src/qt/transactionfilterproxy.cpp @@ -21,11 +21,7 @@ TransactionFilterProxy::TransactionFilterProxy(QObject *parent) : dateFrom(MIN_DATE), dateTo(MAX_DATE), addrPrefix(), -<<<<<<< HEAD - typeFilter(ALL_TYPES), -======= typeFilter(COMMON_TYPES), ->>>>>>> upstream/v0.12.0.x watchOnlyFilter(WatchOnlyFilter_All), minAmount(0), limitRows(-1), From 8f61995aadd342517be89ea060cb72367997d982 Mon Sep 17 00:00:00 2001 From: crowning- Date: Sun, 17 May 2015 21:20:26 +0200 Subject: [PATCH 3/6] Use constants instead of hard coded values --- bitcoingui.cpp | 1174 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1174 insertions(+) create mode 100644 bitcoingui.cpp diff --git a/bitcoingui.cpp b/bitcoingui.cpp new file mode 100644 index 0000000000..a12d99151c --- /dev/null +++ b/bitcoingui.cpp @@ -0,0 +1,1174 @@ +// Copyright (c) 2011-2014 The Bitcoin developers +// Copyright (c) 2014-2015 The Dash developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "bitcoingui.h" + +#include "bitcoinunits.h" +#include "clientmodel.h" +#include "guiconstants.h" +#include "guiutil.h" +#include "networkstyle.h" +#include "notificator.h" +#include "openuridialog.h" +#include "optionsdialog.h" +#include "optionsmodel.h" +#include "rpcconsole.h" +#include "utilitydialog.h" + +#ifdef ENABLE_WALLET +#include "walletframe.h" +#include "walletmodel.h" +#endif // ENABLE_WALLET + +#ifdef Q_OS_MAC +#include "macdockiconhandler.h" +#endif + +#include "init.h" +#include "ui_interface.h" +#include "util.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if QT_VERSION < 0x050000 +#include +#include +#else +#include +#endif + +const QString BitcoinGUI::DEFAULT_WALLET = "~Default"; + +BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : + QMainWindow(parent), + clientModel(0), + walletFrame(0), + unitDisplayControl(0), + labelEncryptionIcon(0), + labelConnectionsIcon(0), + labelBlocksIcon(0), + progressBarLabel(0), + progressBar(0), + progressDialog(0), + appMenuBar(0), + overviewAction(0), + historyAction(0), + quitAction(0), + sendCoinsAction(0), + usedSendingAddressesAction(0), + usedReceivingAddressesAction(0), + signMessageAction(0), + verifyMessageAction(0), + aboutAction(0), + receiveCoinsAction(0), + optionsAction(0), + toggleHideAction(0), + encryptWalletAction(0), + backupWalletAction(0), + changePassphraseAction(0), + aboutQtAction(0), + openRPCConsoleAction(0), + openAction(0), + showHelpMessageAction(0), + trayIcon(0), + trayIconMenu(0), + notificator(0), + rpcConsole(0), + prevBlocks(0), + spinnerFrame(0) +{ + /* Open CSS when configured */ + this->setStyleSheet(GUIUtil::loadStyleSheet()); + + GUIUtil::restoreWindowGeometry("nWindow", QSize(850, 550), this); + + QString windowTitle = tr("Dash Core") + " - "; +#ifdef ENABLE_WALLET + /* if compiled with wallet support, -disablewallet can still disable the wallet */ + enableWallet = !GetBoolArg("-disablewallet", false); +#else + enableWallet = false; +#endif // ENABLE_WALLET + if(enableWallet) + { + windowTitle += tr("Wallet"); + } else { + windowTitle += tr("Node"); + } + windowTitle += " " + networkStyle->getTitleAddText(); +#ifndef Q_OS_MAC + QApplication::setWindowIcon(networkStyle->getAppIcon()); + setWindowIcon(networkStyle->getAppIcon()); +#else + MacDockIconHandler::instance()->setIcon(networkStyle->getAppIcon()); +#endif + setWindowTitle(windowTitle); + +#if defined(Q_OS_MAC) && QT_VERSION < 0x050000 + // This property is not implemented in Qt 5. Setting it has no effect. + // A replacement API (QtMacUnifiedToolBar) is available in QtMacExtras. + setUnifiedTitleAndToolBarOnMac(true); +#endif + + rpcConsole = new RPCConsole(enableWallet ? this : 0); +#ifdef ENABLE_WALLET + if(enableWallet) + { + /** Create wallet frame*/ + walletFrame = new WalletFrame(this); + } else +#endif // ENABLE_WALLET + { + /* When compiled without wallet or -disablewallet is provided, + * the central widget is the rpc console. + */ + setCentralWidget(rpcConsole); + } + + // Accept D&D of URIs + setAcceptDrops(true); + + // Create actions for the toolbar, menu bar and tray/dock icon + // Needs walletFrame to be initialized + createActions(networkStyle); + + // Create application menu bar + createMenuBar(); + + // Create the toolbars + createToolBars(); + + // Create system tray icon and notification + createTrayIcon(networkStyle); + + // Create status bar + statusBar(); + + // Status bar notification icons + QFrame *frameBlocks = new QFrame(); + frameBlocks->setContentsMargins(0,0,0,0); + frameBlocks->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + QHBoxLayout *frameBlocksLayout = new QHBoxLayout(frameBlocks); + frameBlocksLayout->setContentsMargins(3,0,3,0); + frameBlocksLayout->setSpacing(3); + unitDisplayControl = new UnitDisplayStatusBarControl(); + labelEncryptionIcon = new QLabel(); + labelConnectionsIcon = new QPushButton(); + labelConnectionsIcon->setFlat(true); // Make the button look like a label, but clickable + labelConnectionsIcon->setStyleSheet("background-color: rgba(255, 255, 255, 0);"); + labelConnectionsIcon->setMaximumSize(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE); + labelBlocksIcon = new QLabel(); + if(enableWallet) + { + frameBlocksLayout->addStretch(); + frameBlocksLayout->addWidget(unitDisplayControl); + frameBlocksLayout->addStretch(); + frameBlocksLayout->addWidget(labelEncryptionIcon); + } + frameBlocksLayout->addStretch(); + frameBlocksLayout->addWidget(labelConnectionsIcon); + frameBlocksLayout->addStretch(); + frameBlocksLayout->addWidget(labelBlocksIcon); + frameBlocksLayout->addStretch(); + + // Progress bar and label for blocks download + progressBarLabel = new QLabel(); + progressBarLabel->setVisible(false); + progressBar = new GUIUtil::ProgressBar(); + progressBar->setAlignment(Qt::AlignCenter); + progressBar->setVisible(false); + + // 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 = QApplication::style()->metaObject()->className(); + if(curStyle == "QWindowsStyle" || curStyle == "QWindowsXPStyle") + { + progressBar->setStyleSheet("QProgressBar { background-color: #F8F8F8; 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 #00CCFF, stop: 1 #33CCFF); border-radius: 7px; margin: 0px; }"); + } + + statusBar()->addWidget(progressBarLabel); + statusBar()->addWidget(progressBar); + statusBar()->addPermanentWidget(frameBlocks); + + connect(openInfoAction, SIGNAL(triggered()), rpcConsole, SLOT(showInfo())); + connect(openRPCConsoleAction, SIGNAL(triggered()), rpcConsole, SLOT(showConsole())); + connect(openNetworkAction, SIGNAL(triggered()), rpcConsole, SLOT(showNetwork())); + connect(openPeersAction, SIGNAL(triggered()), rpcConsole, SLOT(showPeers())); + connect(openConfEditorAction, SIGNAL(triggered()), rpcConsole, SLOT(showConfEditor())); + connect(showBackupsAction, SIGNAL(triggered()), rpcConsole, SLOT(showBackups())); + connect(labelConnectionsIcon, SIGNAL(clicked()), rpcConsole, SLOT(showPeers())); + + // prevents an open debug window from becoming stuck/unusable on client shutdown + connect(quitAction, SIGNAL(triggered()), rpcConsole, SLOT(hide())); + + // Install event filter to be able to catch status tip events (QEvent::StatusTip) + this->installEventFilter(this); + + // Initially wallet actions should be disabled + setWalletActionsEnabled(false); + + // Subscribe to notifications from core + subscribeToCoreSignals(); +} + +BitcoinGUI::~BitcoinGUI() +{ + // Unsubscribe from notifications from core + unsubscribeFromCoreSignals(); + + GUIUtil::saveWindowGeometry("nWindow", this); + if(trayIcon) // Hide tray icon, as deleting will let it linger until quit (on Ubuntu) + trayIcon->hide(); +#ifdef Q_OS_MAC + delete appMenuBar; + MacDockIconHandler::cleanup(); +#endif +} + +void BitcoinGUI::createActions(const NetworkStyle *networkStyle) +{ + QActionGroup *tabGroup = new QActionGroup(this); + + overviewAction = new QAction(QIcon(":/icons/overview"), tr("&Overview"), this); + overviewAction->setStatusTip(tr("Show general overview of wallet")); + overviewAction->setToolTip(overviewAction->statusTip()); + overviewAction->setCheckable(true); +#ifdef Q_OS_MAC + overviewAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_1)); +#else + overviewAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_1)); +#endif + tabGroup->addAction(overviewAction); + + sendCoinsAction = new QAction(QIcon(":/icons/send"), tr("&Send"), this); + sendCoinsAction->setStatusTip(tr("Send coins to a Dash address")); + sendCoinsAction->setToolTip(sendCoinsAction->statusTip()); + sendCoinsAction->setCheckable(true); +#ifdef Q_OS_MAC + sendCoinsAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_2)); +#else + sendCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_2)); +#endif + tabGroup->addAction(sendCoinsAction); + + receiveCoinsAction = new QAction(QIcon(":/icons/receiving_addresses"), tr("&Receive"), this); + receiveCoinsAction->setStatusTip(tr("Request payments (generates QR codes and dash: URIs)")); + receiveCoinsAction->setToolTip(receiveCoinsAction->statusTip()); + receiveCoinsAction->setCheckable(true); +#ifdef Q_OS_MAC + receiveCoinsAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_3)); +#else + receiveCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_3)); +#endif + tabGroup->addAction(receiveCoinsAction); + + historyAction = new QAction(QIcon(":/icons/history"), tr("&Transactions"), this); + historyAction->setStatusTip(tr("Browse transaction history")); + historyAction->setToolTip(historyAction->statusTip()); + historyAction->setCheckable(true); +#ifdef Q_OS_MAC + historyAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_4)); +#else + historyAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_4)); +#endif + tabGroup->addAction(historyAction); + +#ifdef ENABLE_WALLET + // These showNormalIfMinimized are needed because Send Coins and Receive Coins + // can be triggered from the tray menu, and need to show the GUI to be useful. + connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); + connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage())); + 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())); + connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); + connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage())); +#endif // ENABLE_WALLET + + quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this); + quitAction->setStatusTip(tr("Quit application")); + quitAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q)); + quitAction->setMenuRole(QAction::QuitRole); + aboutAction = new QAction(networkStyle->getAppIcon(), tr("&About Dash Core"), this); + aboutAction->setStatusTip(tr("Show information about Dash Core")); + aboutAction->setMenuRole(QAction::AboutRole); +#if QT_VERSION < 0x050000 + aboutQtAction = new QAction(QIcon(":/trolltech/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); +#else + aboutQtAction = new QAction(QIcon(":/qt-project.org/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); +#endif + aboutQtAction->setStatusTip(tr("Show information about Qt")); + aboutQtAction->setMenuRole(QAction::AboutQtRole); + optionsAction = new QAction(QIcon(":/icons/options"), tr("&Options..."), this); + optionsAction->setStatusTip(tr("Modify configuration options for Dash")); + optionsAction->setMenuRole(QAction::PreferencesRole); + toggleHideAction = new QAction(networkStyle->getAppIcon(), tr("&Show / Hide"), this); + toggleHideAction->setStatusTip(tr("Show or hide the main Window")); + + encryptWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Encrypt Wallet..."), this); + encryptWalletAction->setStatusTip(tr("Encrypt the private keys that belong to your wallet")); + encryptWalletAction->setCheckable(true); + backupWalletAction = new QAction(QIcon(":/icons/filesave"), tr("&Backup Wallet..."), this); + backupWalletAction->setStatusTip(tr("Backup wallet to another location")); + changePassphraseAction = new QAction(QIcon(":/icons/key"), tr("&Change Passphrase..."), this); + changePassphraseAction->setStatusTip(tr("Change the passphrase used for wallet encryption")); + unlockWalletAction = new QAction(tr("&Unlock Wallet..."), this); + unlockWalletAction->setToolTip(tr("Unlock wallet")); + lockWalletAction = new QAction(tr("&Lock Wallet"), this); + signMessageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this); + signMessageAction->setStatusTip(tr("Sign messages with your Dash addresses to prove you own them")); + verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this); + verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Dash addresses")); + + openInfoAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation), tr("&Information"), this); + openInfoAction->setStatusTip(tr("Show diagnostic information")); + openRPCConsoleAction = new QAction(QIcon(":/icons/debugwindow"), tr("&Debug console"), this); + openRPCConsoleAction->setStatusTip(tr("Open debugging console")); + openNetworkAction = new QAction(QIcon(":/icons/connect_4"), tr("&Network Monitor"), this); + openNetworkAction->setStatusTip(tr("Show network monitor")); + openPeersAction = new QAction(QIcon(":/icons/connect_4"), tr("&Peers list"), this); + openPeersAction->setStatusTip(tr("Show peers info")); + openConfEditorAction = new QAction(QIcon(":/icons/edit"), tr("Open &Configuration File"), this); + openConfEditorAction->setStatusTip(tr("Open configuration file")); + showBackupsAction = new QAction(QIcon(":/icons/browse"), tr("Show Automatic &Backups"), this); + showBackupsAction->setStatusTip(tr("Show automatically created wallet backups")); + + usedSendingAddressesAction = new QAction(QIcon(":/icons/address-book"), tr("&Sending addresses..."), this); + usedSendingAddressesAction->setStatusTip(tr("Show the list of used sending addresses and labels")); + usedReceivingAddressesAction = new QAction(QIcon(":/icons/address-book"), tr("&Receiving addresses..."), this); + usedReceivingAddressesAction->setStatusTip(tr("Show the list of used receiving addresses and labels")); + + openAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_FileIcon), tr("Open &URI..."), this); + openAction->setStatusTip(tr("Open a dash: URI or payment request")); + + showHelpMessageAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation), tr("&Command-line options"), this); + showHelpMessageAction->setMenuRole(QAction::NoRole); + showHelpMessageAction->setStatusTip(tr("Show the Dash Core help message to get a list with possible Dash command-line options")); + + connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutClicked())); + connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); + connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked())); + connect(toggleHideAction, SIGNAL(triggered()), this, SLOT(toggleHidden())); + connect(showHelpMessageAction, SIGNAL(triggered()), this, SLOT(showHelpMessageClicked())); +#ifdef ENABLE_WALLET + if(walletFrame) + { + connect(encryptWalletAction, SIGNAL(triggered(bool)), walletFrame, SLOT(encryptWallet(bool))); + connect(backupWalletAction, SIGNAL(triggered()), walletFrame, SLOT(backupWallet())); + connect(changePassphraseAction, SIGNAL(triggered()), walletFrame, SLOT(changePassphrase())); + connect(unlockWalletAction, SIGNAL(triggered()), walletFrame, SLOT(unlockWallet())); + connect(lockWalletAction, SIGNAL(triggered()), walletFrame, SLOT(lockWallet())); + connect(signMessageAction, SIGNAL(triggered()), this, SLOT(gotoSignMessageTab())); + connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(gotoVerifyMessageTab())); + connect(usedSendingAddressesAction, SIGNAL(triggered()), walletFrame, SLOT(usedSendingAddresses())); + connect(usedReceivingAddressesAction, SIGNAL(triggered()), walletFrame, SLOT(usedReceivingAddresses())); + connect(openAction, SIGNAL(triggered()), this, SLOT(openClicked())); + } +#endif // ENABLE_WALLET +} + +void BitcoinGUI::createMenuBar() +{ +#ifdef Q_OS_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")); + if(walletFrame) + { + file->addAction(openAction); + file->addAction(backupWalletAction); + file->addAction(signMessageAction); + file->addAction(verifyMessageAction); + file->addSeparator(); + file->addAction(usedSendingAddressesAction); + file->addAction(usedReceivingAddressesAction); + file->addSeparator(); + } + file->addAction(quitAction); + + QMenu *settings = appMenuBar->addMenu(tr("&Settings")); + if(walletFrame) + { + settings->addAction(encryptWalletAction); + settings->addAction(changePassphraseAction); + settings->addAction(unlockWalletAction); + settings->addAction(lockWalletAction); + settings->addSeparator(); + } + settings->addAction(optionsAction); + + if(walletFrame) + { + QMenu *tools = appMenuBar->addMenu(tr("&Tools")); + tools->addAction(openInfoAction); + tools->addAction(openRPCConsoleAction); + tools->addAction(openNetworkAction); + tools->addAction(openPeersAction); + tools->addSeparator(); + tools->addAction(openConfEditorAction); + tools->addAction(showBackupsAction); + } + + QMenu *help = appMenuBar->addMenu(tr("&Help")); + help->addAction(showHelpMessageAction); + help->addSeparator(); + help->addAction(aboutAction); + help->addAction(aboutQtAction); +} + +void BitcoinGUI::createToolBars() +{ + if(walletFrame) + { + QToolBar *toolbar = new QToolBar(tr("Tabs toolbar")); + toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + toolbar->addAction(overviewAction); + toolbar->addAction(sendCoinsAction); + toolbar->addAction(receiveCoinsAction); + toolbar->addAction(historyAction); + toolbar->setMovable(false); // remove unused icon in upper left corner + overviewAction->setChecked(true); + + /** Create additional container for toolbar and walletFrame and make it the central widget. + This is a workaround mostly for toolbar styling on Mac OS but should work fine for every other OSes too. + */ + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(toolbar); + layout->addWidget(walletFrame); + layout->setSpacing(0); + layout->setContentsMargins(QMargins()); + QWidget *containerWidget = new QWidget(); + containerWidget->setLayout(layout); + setCentralWidget(containerWidget); + } +} + +void BitcoinGUI::setClientModel(ClientModel *clientModel) +{ + this->clientModel = clientModel; + if(clientModel) + { + // Create system tray menu (or setup the dock menu) that late to prevent users from calling actions, + // while the client has not yet fully loaded + createTrayIconMenu(); + + // Keep up to date with client + setNumConnections(clientModel->getNumConnections()); + connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int))); + + setNumBlocks(clientModel->getNumBlocks()); + connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int))); + + // Receive and report messages from client model + connect(clientModel, SIGNAL(message(QString,QString,unsigned int)), this, SLOT(message(QString,QString,unsigned int))); + + // Show progress dialog + connect(clientModel, SIGNAL(showProgress(QString,int)), this, SLOT(showProgress(QString,int))); + + rpcConsole->setClientModel(clientModel); +#ifdef ENABLE_WALLET + if(walletFrame) + { + walletFrame->setClientModel(clientModel); + } +#endif // ENABLE_WALLET + unitDisplayControl->setOptionsModel(clientModel->getOptionsModel()); + } else { + // Disable possibility to show main window via action + toggleHideAction->setEnabled(false); + if(trayIconMenu) + { + // Disable context menu on tray icon + trayIconMenu->clear(); + } + } +} + +#ifdef ENABLE_WALLET +bool BitcoinGUI::addWallet(const QString& name, WalletModel *walletModel) +{ + if(!walletFrame) + return false; + setWalletActionsEnabled(true); + return walletFrame->addWallet(name, walletModel); +} + +bool BitcoinGUI::setCurrentWallet(const QString& name) +{ + if(!walletFrame) + return false; + return walletFrame->setCurrentWallet(name); +} + +void BitcoinGUI::removeAllWallets() +{ + if(!walletFrame) + return; + setWalletActionsEnabled(false); + walletFrame->removeAllWallets(); +} +#endif // ENABLE_WALLET + +void BitcoinGUI::setWalletActionsEnabled(bool enabled) +{ + overviewAction->setEnabled(enabled); + sendCoinsAction->setEnabled(enabled); + receiveCoinsAction->setEnabled(enabled); + historyAction->setEnabled(enabled); + encryptWalletAction->setEnabled(enabled); + backupWalletAction->setEnabled(enabled); + changePassphraseAction->setEnabled(enabled); + signMessageAction->setEnabled(enabled); + verifyMessageAction->setEnabled(enabled); + usedSendingAddressesAction->setEnabled(enabled); + usedReceivingAddressesAction->setEnabled(enabled); + openAction->setEnabled(enabled); +} + +void BitcoinGUI::createTrayIcon(const NetworkStyle *networkStyle) +{ +#ifndef Q_OS_MAC + trayIcon = new QSystemTrayIcon(this); + QString toolTip = tr("Dash Core client") + " " + networkStyle->getTitleAddText(); + trayIcon->setToolTip(toolTip); + trayIcon->setIcon(networkStyle->getAppIcon()); + trayIcon->show(); +#endif + + notificator = new Notificator(QApplication::applicationName(), trayIcon, this); +} + +void BitcoinGUI::createTrayIconMenu() +{ +#ifndef Q_OS_MAC + // return if trayIcon is unset (only on non-Mac OSes) + if (!trayIcon) + return; + + trayIconMenu = new QMenu(this); + trayIcon->setContextMenu(trayIconMenu); + + connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); +#else + // Note: On Mac, the dock icon is used to provide the tray's functionality. + MacDockIconHandler *dockIconHandler = MacDockIconHandler::instance(); + dockIconHandler->setMainWindow((QMainWindow *)this); + trayIconMenu = dockIconHandler->dockMenu(); +#endif + + // Configuration of the tray icon (or dock icon) icon menu + trayIconMenu->addAction(toggleHideAction); + trayIconMenu->addSeparator(); + trayIconMenu->addAction(sendCoinsAction); + trayIconMenu->addAction(receiveCoinsAction); + trayIconMenu->addSeparator(); + trayIconMenu->addAction(signMessageAction); + trayIconMenu->addAction(verifyMessageAction); + trayIconMenu->addSeparator(); + trayIconMenu->addAction(optionsAction); + trayIconMenu->addAction(openInfoAction); + trayIconMenu->addAction(openRPCConsoleAction); + trayIconMenu->addAction(openNetworkAction); + trayIconMenu->addAction(openPeersAction); + trayIconMenu->addSeparator(); + trayIconMenu->addAction(openConfEditorAction); + trayIconMenu->addAction(showBackupsAction); +#ifndef Q_OS_MAC // This is built-in on Mac + trayIconMenu->addSeparator(); + trayIconMenu->addAction(quitAction); +#endif +} + +#ifndef Q_OS_MAC +void BitcoinGUI::trayIconActivated(QSystemTrayIcon::ActivationReason reason) +{ + if(reason == QSystemTrayIcon::Trigger) + { + // Click on system tray icon triggers show/hide of the main window + toggleHidden(); + } +} +#endif + +void BitcoinGUI::optionsClicked() +{ + if(!clientModel || !clientModel->getOptionsModel()) + return; + + OptionsDialog dlg(this, enableWallet); + dlg.setModel(clientModel->getOptionsModel()); + dlg.exec(); +} + +void BitcoinGUI::aboutClicked() +{ + if(!clientModel) + return; + + HelpMessageDialog dlg(this, true); + dlg.exec(); +} + +void BitcoinGUI::showHelpMessageClicked() +{ + HelpMessageDialog *help = new HelpMessageDialog(this, false); + help->setAttribute(Qt::WA_DeleteOnClose); + help->show(); +} + +#ifdef ENABLE_WALLET +void BitcoinGUI::openClicked() +{ + OpenURIDialog dlg(this); + if(dlg.exec()) + { + emit receivedURI(dlg.getURI()); + } +} + +void BitcoinGUI::gotoOverviewPage() +{ + overviewAction->setChecked(true); + if (walletFrame) walletFrame->gotoOverviewPage(); +} + +void BitcoinGUI::gotoHistoryPage() +{ + historyAction->setChecked(true); + if (walletFrame) walletFrame->gotoHistoryPage(); +} + +void BitcoinGUI::gotoReceiveCoinsPage() +{ + receiveCoinsAction->setChecked(true); + if (walletFrame) walletFrame->gotoReceiveCoinsPage(); +} + +void BitcoinGUI::gotoSendCoinsPage(QString addr) +{ + sendCoinsAction->setChecked(true); + if (walletFrame) walletFrame->gotoSendCoinsPage(addr); +} + +void BitcoinGUI::gotoSignMessageTab(QString addr) +{ + if (walletFrame) walletFrame->gotoSignMessageTab(addr); +} + +void BitcoinGUI::gotoVerifyMessageTab(QString addr) +{ + if (walletFrame) walletFrame->gotoVerifyMessageTab(addr); +} +#endif // ENABLE_WALLET + +void BitcoinGUI::setNumConnections(int count) +{ + QString icon; + switch(count) + { + 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; + } + QIcon connectionItem = QIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE); + labelConnectionsIcon->setIcon(connectionItem); + labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Dash network", "", count)); +} + +void BitcoinGUI::setNumBlocks(int count) +{ + if(!clientModel) + return; + + // Prevent orphan statusbar messages (e.g. hover Quit in main menu, wait until chain-sync starts -> garbelled text) + statusBar()->clearMessage(); + + // Acquire current block source + enum BlockSource blockSource = clientModel->getBlockSource(); + switch (blockSource) { + case BLOCK_SOURCE_NETWORK: + progressBarLabel->setText(tr("Synchronizing with network...")); + break; + case BLOCK_SOURCE_DISK: + progressBarLabel->setText(tr("Importing blocks from disk...")); + break; + case BLOCK_SOURCE_REINDEX: + progressBarLabel->setText(tr("Reindexing blocks on disk...")); + break; + case BLOCK_SOURCE_NONE: + // Case: not Importing, not Reindexing and no network connection + progressBarLabel->setText(tr("No block source available...")); + break; + } + + QString tooltip; + + QDateTime lastBlockDate = clientModel->getLastBlockDate(); + QDateTime currentDate = QDateTime::currentDateTime(); + int secs = lastBlockDate.secsTo(currentDate); + + tooltip = tr("Processed %n blocks of transaction history.", "", count); + + // Set icon state: spinning if catching up, tick otherwise + if(secs < 25*60) // 90*60 for bitcoin but we are 4x times faster + { + tooltip = tr("Up to date") + QString(".
") + tooltip; + labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); + +#ifdef ENABLE_WALLET + if(walletFrame) + walletFrame->showOutOfSyncWarning(false); +#endif // ENABLE_WALLET + + progressBarLabel->setVisible(false); + progressBar->setVisible(false); + } + else + { + // Represent time from last generated block in human readable text + QString timeBehindText; + const int HOUR_IN_SECONDS = 60*60; + const int DAY_IN_SECONDS = 24*60*60; + const int WEEK_IN_SECONDS = 7*24*60*60; + const int YEAR_IN_SECONDS = 31556952; // Average length of year in Gregorian calendar + if(secs < 2*DAY_IN_SECONDS) + { + timeBehindText = tr("%n hour(s)","",secs/HOUR_IN_SECONDS); + } + else if(secs < 2*WEEK_IN_SECONDS) + { + timeBehindText = tr("%n day(s)","",secs/DAY_IN_SECONDS); + } + else if(secs < YEAR_IN_SECONDS) + { + timeBehindText = tr("%n week(s)","",secs/WEEK_IN_SECONDS); + } + else + { + int years = secs / YEAR_IN_SECONDS; + int remainder = secs % YEAR_IN_SECONDS; + timeBehindText = tr("%1 and %2").arg(tr("%n year(s)", "", years)).arg(tr("%n week(s)","", remainder/WEEK_IN_SECONDS)); + } + + progressBarLabel->setVisible(true); + progressBar->setFormat(tr("%1 behind").arg(timeBehindText)); + progressBar->setMaximum(1000000000); + progressBar->setValue(clientModel->getVerificationProgress() * 1000000000.0 + 0.5); + progressBar->setVisible(true); + + tooltip = tr("Catching up...") + QString("
") + tooltip; + if(count != prevBlocks) + { + labelBlocksIcon->setPixmap(QIcon(QString( + ":/movies/spinner-%1").arg(spinnerFrame, 3, 10, QChar('0'))) + .pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); + spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES; + } + prevBlocks = count; + +#ifdef ENABLE_WALLET + if(walletFrame) + walletFrame->showOutOfSyncWarning(true); +#endif // ENABLE_WALLET + + tooltip += QString("
"); + tooltip += tr("Last received block was generated %1 ago.").arg(timeBehindText); + tooltip += QString("
"); + tooltip += tr("Transactions after this will not yet be visible."); + } + + // Don't word-wrap this (fixed-width) tooltip + tooltip = QString("") + tooltip + QString(""); + + labelBlocksIcon->setToolTip(tooltip); + progressBarLabel->setToolTip(tooltip); + progressBar->setToolTip(tooltip); +} + +void BitcoinGUI::message(const QString &title, const QString &message, unsigned int style, bool *ret) +{ + QString strTitle = tr("Dash Core"); // default title + // Default to information icon + int nMBoxIcon = QMessageBox::Information; + int nNotifyIcon = Notificator::Information; + + QString msgType; + + // Prefer supplied title over style based title + if (!title.isEmpty()) { + msgType = title; + } + else { + switch (style) { + case CClientUIInterface::MSG_ERROR: + msgType = tr("Error"); + break; + case CClientUIInterface::MSG_WARNING: + msgType = tr("Warning"); + break; + case CClientUIInterface::MSG_INFORMATION: + msgType = tr("Information"); + break; + default: + break; + } + } + // Append title to "Dash - " + if (!msgType.isEmpty()) + strTitle += " - " + msgType; + + // Check for error/warning icon + if (style & CClientUIInterface::ICON_ERROR) { + nMBoxIcon = QMessageBox::Critical; + nNotifyIcon = Notificator::Critical; + } + else if (style & CClientUIInterface::ICON_WARNING) { + nMBoxIcon = QMessageBox::Warning; + nNotifyIcon = Notificator::Warning; + } + + // Display message + if (style & CClientUIInterface::MODAL) { + // Check for buttons, use OK as default, if none was supplied + QMessageBox::StandardButton buttons; + if (!(buttons = (QMessageBox::StandardButton)(style & CClientUIInterface::BTN_MASK))) + buttons = QMessageBox::Ok; + + showNormalIfMinimized(); + QMessageBox mBox((QMessageBox::Icon)nMBoxIcon, strTitle, message, buttons, this); + int r = mBox.exec(); + if (ret != NULL) + *ret = r == QMessageBox::Ok; + } + else + notificator->notify((Notificator::Class)nNotifyIcon, strTitle, message); +} + +void BitcoinGUI::changeEvent(QEvent *e) +{ + QMainWindow::changeEvent(e); +#ifndef Q_OS_MAC // Ignored on Mac + if(e->type() == QEvent::WindowStateChange) + { + if(clientModel && clientModel->getOptionsModel() && clientModel->getOptionsModel()->getMinimizeToTray()) + { + QWindowStateChangeEvent *wsevt = static_cast(e); + if(!(wsevt->oldState() & Qt::WindowMinimized) && isMinimized()) + { + QTimer::singleShot(0, this, SLOT(hide())); + e->ignore(); + } + } + } +#endif +} + +void BitcoinGUI::closeEvent(QCloseEvent *event) +{ +#ifndef Q_OS_MAC // Ignored on Mac + if(clientModel && clientModel->getOptionsModel()) + { + if(!clientModel->getOptionsModel()->getMinimizeOnClose()) + { + QApplication::quit(); + } + } +#endif + QMainWindow::closeEvent(event); +} + +#ifdef ENABLE_WALLET +void BitcoinGUI::incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address) +{ + // On new transaction, make an info balloon + message((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(unit, amount, true)) + .arg(type) + .arg(address), CClientUIInterface::MSG_INFORMATION); +} +#endif // ENABLE_WALLET + +void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event) +{ + // Accept only URIs + if(event->mimeData()->hasUrls()) + event->acceptProposedAction(); +} + +void BitcoinGUI::dropEvent(QDropEvent *event) +{ + if(event->mimeData()->hasUrls()) + { + foreach(const QUrl &uri, event->mimeData()->urls()) + { + emit receivedURI(uri.toString()); + } + } + event->acceptProposedAction(); +} + +bool BitcoinGUI::eventFilter(QObject *object, QEvent *event) +{ + // Catch status tip events + if (event->type() == QEvent::StatusTip) + { + // Prevent adding text from setStatusTip(), if we currently use the status bar for displaying other stuff + if (progressBarLabel->isVisible() || progressBar->isVisible()) + return true; + } + return QMainWindow::eventFilter(object, event); +} + +#ifdef ENABLE_WALLET +bool BitcoinGUI::handlePaymentRequest(const SendCoinsRecipient& recipient) +{ + // URI has to be valid + if (walletFrame && walletFrame->handlePaymentRequest(recipient)) + { + showNormalIfMinimized(); + gotoSendCoinsPage(); + return true; + } + return false; +} + +void BitcoinGUI::setEncryptionStatus(int status) +{ + switch(status) + { + case WalletModel::Unencrypted: + labelEncryptionIcon->hide(); + encryptWalletAction->setChecked(false); + changePassphraseAction->setEnabled(false); + unlockWalletAction->setVisible(false); + lockWalletAction->setVisible(false); + encryptWalletAction->setEnabled(true); + break; + case WalletModel::Unlocked: + labelEncryptionIcon->show(); + labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently unlocked")); + encryptWalletAction->setChecked(true); + changePassphraseAction->setEnabled(true); + unlockWalletAction->setVisible(false); + lockWalletAction->setVisible(true); + encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + break; + case WalletModel::UnlockedForAnonymizationOnly: + labelEncryptionIcon->show(); + labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently unlocked for anonimization only")); + encryptWalletAction->setChecked(true); + changePassphraseAction->setEnabled(true); + unlockWalletAction->setVisible(true); + lockWalletAction->setVisible(true); + encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + break; + case WalletModel::Locked: + labelEncryptionIcon->show(); + labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_closed").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); + labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently locked")); + encryptWalletAction->setChecked(true); + changePassphraseAction->setEnabled(true); + unlockWalletAction->setVisible(true); + lockWalletAction->setVisible(false); + encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported + break; + } +} +#endif // ENABLE_WALLET + +void BitcoinGUI::showNormalIfMinimized(bool fToggleHidden) +{ + if(!clientModel) + return; + + // activateWindow() (sometimes) helps with keyboard focus on Windows + if (isHidden()) + { + show(); + activateWindow(); + } + else if (isMinimized()) + { + showNormal(); + activateWindow(); + } + else if (GUIUtil::isObscured(this)) + { + raise(); + activateWindow(); + } + else if(fToggleHidden) + hide(); +} + +void BitcoinGUI::toggleHidden() +{ + showNormalIfMinimized(true); +} + +void BitcoinGUI::detectShutdown() +{ + if (ShutdownRequested()) + { + if(rpcConsole) + rpcConsole->hide(); + qApp->quit(); + } +} + +void BitcoinGUI::showProgress(const QString &title, int nProgress) +{ + if (nProgress == 0) + { + progressDialog = new QProgressDialog(title, "", 0, 100); + progressDialog->setWindowModality(Qt::ApplicationModal); + progressDialog->setMinimumDuration(0); + progressDialog->setCancelButton(0); + progressDialog->setAutoClose(false); + progressDialog->setValue(0); + } + else if (nProgress == 100) + { + if (progressDialog) + { + progressDialog->close(); + progressDialog->deleteLater(); + } + } + else if (progressDialog) + progressDialog->setValue(nProgress); +} + +static bool ThreadSafeMessageBox(BitcoinGUI *gui, const std::string& message, const std::string& caption, unsigned int style) +{ + bool modal = (style & CClientUIInterface::MODAL); + // The SECURE flag has no effect in the Qt GUI. + // bool secure = (style & CClientUIInterface::SECURE); + style &= ~CClientUIInterface::SECURE; + bool ret = false; + // In case of modal message, use blocking connection to wait for user to click a button + QMetaObject::invokeMethod(gui, "message", + modal ? GUIUtil::blockingGUIThreadConnection() : Qt::QueuedConnection, + Q_ARG(QString, QString::fromStdString(caption)), + Q_ARG(QString, QString::fromStdString(message)), + Q_ARG(unsigned int, style), + Q_ARG(bool*, &ret)); + return ret; +} + +void BitcoinGUI::subscribeToCoreSignals() +{ + // Connect signals to client + uiInterface.ThreadSafeMessageBox.connect(boost::bind(ThreadSafeMessageBox, this, _1, _2, _3)); +} + +void BitcoinGUI::unsubscribeFromCoreSignals() +{ + // Disconnect signals from client + uiInterface.ThreadSafeMessageBox.disconnect(boost::bind(ThreadSafeMessageBox, this, _1, _2, _3)); +} + +UnitDisplayStatusBarControl::UnitDisplayStatusBarControl() : + optionsModel(0), + menu(0) +{ + createContextMenu(); + setToolTip(tr("Unit to show amounts in. Click to select another unit.")); +} + +/** So that it responds to button clicks */ +void UnitDisplayStatusBarControl::mousePressEvent(QMouseEvent *event) +{ + onDisplayUnitsClicked(event->pos()); +} + +/** Creates context menu, its actions, and wires up all the relevant signals for mouse events. */ +void UnitDisplayStatusBarControl::createContextMenu() +{ + menu = new QMenu(); + foreach(BitcoinUnits::Unit u, BitcoinUnits::availableUnits()) + { + QAction *menuAction = new QAction(QString(BitcoinUnits::name(u)), this); + menuAction->setData(QVariant(u)); + menu->addAction(menuAction); + } + connect(menu,SIGNAL(triggered(QAction*)),this,SLOT(onMenuSelection(QAction*))); +} + +/** Lets the control know about the Options Model (and its signals) */ +void UnitDisplayStatusBarControl::setOptionsModel(OptionsModel *optionsModel) +{ + if (optionsModel) + { + this->optionsModel = optionsModel; + + // be aware of a display unit change reported by the OptionsModel object. + connect(optionsModel,SIGNAL(displayUnitChanged(int)),this,SLOT(updateDisplayUnit(int))); + + // initialize the display units label with the current value in the model. + updateDisplayUnit(optionsModel->getDisplayUnit()); + } +} + +/** When Display Units are changed on OptionsModel it will refresh the display text of the control on the status bar */ +void UnitDisplayStatusBarControl::updateDisplayUnit(int newUnits) +{ + setPixmap(QIcon(":/icons/unit_" + BitcoinUnits::id(newUnits)).pixmap(31,STATUSBAR_ICONSIZE)); +} + +/** Shows context menu with Display Unit options by the mouse coordinates */ +void UnitDisplayStatusBarControl::onDisplayUnitsClicked(const QPoint& point) +{ + QPoint globalPos = mapToGlobal(point); + menu->exec(globalPos); +} + +/** Tells underlying optionsModel to update its current display unit. */ +void UnitDisplayStatusBarControl::onMenuSelection(QAction* action) +{ + if (action) + { + optionsModel->setDisplayUnit(action->data()); + } +} From eea331775554a7acfc9753cc977fbafe37d4803c Mon Sep 17 00:00:00 2001 From: crowning- Date: Sun, 17 May 2015 21:21:43 +0200 Subject: [PATCH 4/6] Use existing constant instead of hardcoded size value --- bitcoingui.cpp | 1174 ----------------------------------------- src/qt/bitcoingui.cpp | 2 +- 2 files changed, 1 insertion(+), 1175 deletions(-) delete mode 100644 bitcoingui.cpp diff --git a/bitcoingui.cpp b/bitcoingui.cpp deleted file mode 100644 index a12d99151c..0000000000 --- a/bitcoingui.cpp +++ /dev/null @@ -1,1174 +0,0 @@ -// Copyright (c) 2011-2014 The Bitcoin developers -// Copyright (c) 2014-2015 The Dash developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "bitcoingui.h" - -#include "bitcoinunits.h" -#include "clientmodel.h" -#include "guiconstants.h" -#include "guiutil.h" -#include "networkstyle.h" -#include "notificator.h" -#include "openuridialog.h" -#include "optionsdialog.h" -#include "optionsmodel.h" -#include "rpcconsole.h" -#include "utilitydialog.h" - -#ifdef ENABLE_WALLET -#include "walletframe.h" -#include "walletmodel.h" -#endif // ENABLE_WALLET - -#ifdef Q_OS_MAC -#include "macdockiconhandler.h" -#endif - -#include "init.h" -#include "ui_interface.h" -#include "util.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if QT_VERSION < 0x050000 -#include -#include -#else -#include -#endif - -const QString BitcoinGUI::DEFAULT_WALLET = "~Default"; - -BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : - QMainWindow(parent), - clientModel(0), - walletFrame(0), - unitDisplayControl(0), - labelEncryptionIcon(0), - labelConnectionsIcon(0), - labelBlocksIcon(0), - progressBarLabel(0), - progressBar(0), - progressDialog(0), - appMenuBar(0), - overviewAction(0), - historyAction(0), - quitAction(0), - sendCoinsAction(0), - usedSendingAddressesAction(0), - usedReceivingAddressesAction(0), - signMessageAction(0), - verifyMessageAction(0), - aboutAction(0), - receiveCoinsAction(0), - optionsAction(0), - toggleHideAction(0), - encryptWalletAction(0), - backupWalletAction(0), - changePassphraseAction(0), - aboutQtAction(0), - openRPCConsoleAction(0), - openAction(0), - showHelpMessageAction(0), - trayIcon(0), - trayIconMenu(0), - notificator(0), - rpcConsole(0), - prevBlocks(0), - spinnerFrame(0) -{ - /* Open CSS when configured */ - this->setStyleSheet(GUIUtil::loadStyleSheet()); - - GUIUtil::restoreWindowGeometry("nWindow", QSize(850, 550), this); - - QString windowTitle = tr("Dash Core") + " - "; -#ifdef ENABLE_WALLET - /* if compiled with wallet support, -disablewallet can still disable the wallet */ - enableWallet = !GetBoolArg("-disablewallet", false); -#else - enableWallet = false; -#endif // ENABLE_WALLET - if(enableWallet) - { - windowTitle += tr("Wallet"); - } else { - windowTitle += tr("Node"); - } - windowTitle += " " + networkStyle->getTitleAddText(); -#ifndef Q_OS_MAC - QApplication::setWindowIcon(networkStyle->getAppIcon()); - setWindowIcon(networkStyle->getAppIcon()); -#else - MacDockIconHandler::instance()->setIcon(networkStyle->getAppIcon()); -#endif - setWindowTitle(windowTitle); - -#if defined(Q_OS_MAC) && QT_VERSION < 0x050000 - // This property is not implemented in Qt 5. Setting it has no effect. - // A replacement API (QtMacUnifiedToolBar) is available in QtMacExtras. - setUnifiedTitleAndToolBarOnMac(true); -#endif - - rpcConsole = new RPCConsole(enableWallet ? this : 0); -#ifdef ENABLE_WALLET - if(enableWallet) - { - /** Create wallet frame*/ - walletFrame = new WalletFrame(this); - } else -#endif // ENABLE_WALLET - { - /* When compiled without wallet or -disablewallet is provided, - * the central widget is the rpc console. - */ - setCentralWidget(rpcConsole); - } - - // Accept D&D of URIs - setAcceptDrops(true); - - // Create actions for the toolbar, menu bar and tray/dock icon - // Needs walletFrame to be initialized - createActions(networkStyle); - - // Create application menu bar - createMenuBar(); - - // Create the toolbars - createToolBars(); - - // Create system tray icon and notification - createTrayIcon(networkStyle); - - // Create status bar - statusBar(); - - // Status bar notification icons - QFrame *frameBlocks = new QFrame(); - frameBlocks->setContentsMargins(0,0,0,0); - frameBlocks->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); - QHBoxLayout *frameBlocksLayout = new QHBoxLayout(frameBlocks); - frameBlocksLayout->setContentsMargins(3,0,3,0); - frameBlocksLayout->setSpacing(3); - unitDisplayControl = new UnitDisplayStatusBarControl(); - labelEncryptionIcon = new QLabel(); - labelConnectionsIcon = new QPushButton(); - labelConnectionsIcon->setFlat(true); // Make the button look like a label, but clickable - labelConnectionsIcon->setStyleSheet("background-color: rgba(255, 255, 255, 0);"); - labelConnectionsIcon->setMaximumSize(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE); - labelBlocksIcon = new QLabel(); - if(enableWallet) - { - frameBlocksLayout->addStretch(); - frameBlocksLayout->addWidget(unitDisplayControl); - frameBlocksLayout->addStretch(); - frameBlocksLayout->addWidget(labelEncryptionIcon); - } - frameBlocksLayout->addStretch(); - frameBlocksLayout->addWidget(labelConnectionsIcon); - frameBlocksLayout->addStretch(); - frameBlocksLayout->addWidget(labelBlocksIcon); - frameBlocksLayout->addStretch(); - - // Progress bar and label for blocks download - progressBarLabel = new QLabel(); - progressBarLabel->setVisible(false); - progressBar = new GUIUtil::ProgressBar(); - progressBar->setAlignment(Qt::AlignCenter); - progressBar->setVisible(false); - - // 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 = QApplication::style()->metaObject()->className(); - if(curStyle == "QWindowsStyle" || curStyle == "QWindowsXPStyle") - { - progressBar->setStyleSheet("QProgressBar { background-color: #F8F8F8; 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 #00CCFF, stop: 1 #33CCFF); border-radius: 7px; margin: 0px; }"); - } - - statusBar()->addWidget(progressBarLabel); - statusBar()->addWidget(progressBar); - statusBar()->addPermanentWidget(frameBlocks); - - connect(openInfoAction, SIGNAL(triggered()), rpcConsole, SLOT(showInfo())); - connect(openRPCConsoleAction, SIGNAL(triggered()), rpcConsole, SLOT(showConsole())); - connect(openNetworkAction, SIGNAL(triggered()), rpcConsole, SLOT(showNetwork())); - connect(openPeersAction, SIGNAL(triggered()), rpcConsole, SLOT(showPeers())); - connect(openConfEditorAction, SIGNAL(triggered()), rpcConsole, SLOT(showConfEditor())); - connect(showBackupsAction, SIGNAL(triggered()), rpcConsole, SLOT(showBackups())); - connect(labelConnectionsIcon, SIGNAL(clicked()), rpcConsole, SLOT(showPeers())); - - // prevents an open debug window from becoming stuck/unusable on client shutdown - connect(quitAction, SIGNAL(triggered()), rpcConsole, SLOT(hide())); - - // Install event filter to be able to catch status tip events (QEvent::StatusTip) - this->installEventFilter(this); - - // Initially wallet actions should be disabled - setWalletActionsEnabled(false); - - // Subscribe to notifications from core - subscribeToCoreSignals(); -} - -BitcoinGUI::~BitcoinGUI() -{ - // Unsubscribe from notifications from core - unsubscribeFromCoreSignals(); - - GUIUtil::saveWindowGeometry("nWindow", this); - if(trayIcon) // Hide tray icon, as deleting will let it linger until quit (on Ubuntu) - trayIcon->hide(); -#ifdef Q_OS_MAC - delete appMenuBar; - MacDockIconHandler::cleanup(); -#endif -} - -void BitcoinGUI::createActions(const NetworkStyle *networkStyle) -{ - QActionGroup *tabGroup = new QActionGroup(this); - - overviewAction = new QAction(QIcon(":/icons/overview"), tr("&Overview"), this); - overviewAction->setStatusTip(tr("Show general overview of wallet")); - overviewAction->setToolTip(overviewAction->statusTip()); - overviewAction->setCheckable(true); -#ifdef Q_OS_MAC - overviewAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_1)); -#else - overviewAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_1)); -#endif - tabGroup->addAction(overviewAction); - - sendCoinsAction = new QAction(QIcon(":/icons/send"), tr("&Send"), this); - sendCoinsAction->setStatusTip(tr("Send coins to a Dash address")); - sendCoinsAction->setToolTip(sendCoinsAction->statusTip()); - sendCoinsAction->setCheckable(true); -#ifdef Q_OS_MAC - sendCoinsAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_2)); -#else - sendCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_2)); -#endif - tabGroup->addAction(sendCoinsAction); - - receiveCoinsAction = new QAction(QIcon(":/icons/receiving_addresses"), tr("&Receive"), this); - receiveCoinsAction->setStatusTip(tr("Request payments (generates QR codes and dash: URIs)")); - receiveCoinsAction->setToolTip(receiveCoinsAction->statusTip()); - receiveCoinsAction->setCheckable(true); -#ifdef Q_OS_MAC - receiveCoinsAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_3)); -#else - receiveCoinsAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_3)); -#endif - tabGroup->addAction(receiveCoinsAction); - - historyAction = new QAction(QIcon(":/icons/history"), tr("&Transactions"), this); - historyAction->setStatusTip(tr("Browse transaction history")); - historyAction->setToolTip(historyAction->statusTip()); - historyAction->setCheckable(true); -#ifdef Q_OS_MAC - historyAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_4)); -#else - historyAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_4)); -#endif - tabGroup->addAction(historyAction); - -#ifdef ENABLE_WALLET - // These showNormalIfMinimized are needed because Send Coins and Receive Coins - // can be triggered from the tray menu, and need to show the GUI to be useful. - connect(overviewAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); - connect(overviewAction, SIGNAL(triggered()), this, SLOT(gotoOverviewPage())); - 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())); - connect(historyAction, SIGNAL(triggered()), this, SLOT(showNormalIfMinimized())); - connect(historyAction, SIGNAL(triggered()), this, SLOT(gotoHistoryPage())); -#endif // ENABLE_WALLET - - quitAction = new QAction(QIcon(":/icons/quit"), tr("E&xit"), this); - quitAction->setStatusTip(tr("Quit application")); - quitAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q)); - quitAction->setMenuRole(QAction::QuitRole); - aboutAction = new QAction(networkStyle->getAppIcon(), tr("&About Dash Core"), this); - aboutAction->setStatusTip(tr("Show information about Dash Core")); - aboutAction->setMenuRole(QAction::AboutRole); -#if QT_VERSION < 0x050000 - aboutQtAction = new QAction(QIcon(":/trolltech/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); -#else - aboutQtAction = new QAction(QIcon(":/qt-project.org/qmessagebox/images/qtlogo-64.png"), tr("About &Qt"), this); -#endif - aboutQtAction->setStatusTip(tr("Show information about Qt")); - aboutQtAction->setMenuRole(QAction::AboutQtRole); - optionsAction = new QAction(QIcon(":/icons/options"), tr("&Options..."), this); - optionsAction->setStatusTip(tr("Modify configuration options for Dash")); - optionsAction->setMenuRole(QAction::PreferencesRole); - toggleHideAction = new QAction(networkStyle->getAppIcon(), tr("&Show / Hide"), this); - toggleHideAction->setStatusTip(tr("Show or hide the main Window")); - - encryptWalletAction = new QAction(QIcon(":/icons/lock_closed"), tr("&Encrypt Wallet..."), this); - encryptWalletAction->setStatusTip(tr("Encrypt the private keys that belong to your wallet")); - encryptWalletAction->setCheckable(true); - backupWalletAction = new QAction(QIcon(":/icons/filesave"), tr("&Backup Wallet..."), this); - backupWalletAction->setStatusTip(tr("Backup wallet to another location")); - changePassphraseAction = new QAction(QIcon(":/icons/key"), tr("&Change Passphrase..."), this); - changePassphraseAction->setStatusTip(tr("Change the passphrase used for wallet encryption")); - unlockWalletAction = new QAction(tr("&Unlock Wallet..."), this); - unlockWalletAction->setToolTip(tr("Unlock wallet")); - lockWalletAction = new QAction(tr("&Lock Wallet"), this); - signMessageAction = new QAction(QIcon(":/icons/edit"), tr("Sign &message..."), this); - signMessageAction->setStatusTip(tr("Sign messages with your Dash addresses to prove you own them")); - verifyMessageAction = new QAction(QIcon(":/icons/transaction_0"), tr("&Verify message..."), this); - verifyMessageAction->setStatusTip(tr("Verify messages to ensure they were signed with specified Dash addresses")); - - openInfoAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation), tr("&Information"), this); - openInfoAction->setStatusTip(tr("Show diagnostic information")); - openRPCConsoleAction = new QAction(QIcon(":/icons/debugwindow"), tr("&Debug console"), this); - openRPCConsoleAction->setStatusTip(tr("Open debugging console")); - openNetworkAction = new QAction(QIcon(":/icons/connect_4"), tr("&Network Monitor"), this); - openNetworkAction->setStatusTip(tr("Show network monitor")); - openPeersAction = new QAction(QIcon(":/icons/connect_4"), tr("&Peers list"), this); - openPeersAction->setStatusTip(tr("Show peers info")); - openConfEditorAction = new QAction(QIcon(":/icons/edit"), tr("Open &Configuration File"), this); - openConfEditorAction->setStatusTip(tr("Open configuration file")); - showBackupsAction = new QAction(QIcon(":/icons/browse"), tr("Show Automatic &Backups"), this); - showBackupsAction->setStatusTip(tr("Show automatically created wallet backups")); - - usedSendingAddressesAction = new QAction(QIcon(":/icons/address-book"), tr("&Sending addresses..."), this); - usedSendingAddressesAction->setStatusTip(tr("Show the list of used sending addresses and labels")); - usedReceivingAddressesAction = new QAction(QIcon(":/icons/address-book"), tr("&Receiving addresses..."), this); - usedReceivingAddressesAction->setStatusTip(tr("Show the list of used receiving addresses and labels")); - - openAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_FileIcon), tr("Open &URI..."), this); - openAction->setStatusTip(tr("Open a dash: URI or payment request")); - - showHelpMessageAction = new QAction(QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation), tr("&Command-line options"), this); - showHelpMessageAction->setMenuRole(QAction::NoRole); - showHelpMessageAction->setStatusTip(tr("Show the Dash Core help message to get a list with possible Dash command-line options")); - - connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); - connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutClicked())); - connect(aboutQtAction, SIGNAL(triggered()), qApp, SLOT(aboutQt())); - connect(optionsAction, SIGNAL(triggered()), this, SLOT(optionsClicked())); - connect(toggleHideAction, SIGNAL(triggered()), this, SLOT(toggleHidden())); - connect(showHelpMessageAction, SIGNAL(triggered()), this, SLOT(showHelpMessageClicked())); -#ifdef ENABLE_WALLET - if(walletFrame) - { - connect(encryptWalletAction, SIGNAL(triggered(bool)), walletFrame, SLOT(encryptWallet(bool))); - connect(backupWalletAction, SIGNAL(triggered()), walletFrame, SLOT(backupWallet())); - connect(changePassphraseAction, SIGNAL(triggered()), walletFrame, SLOT(changePassphrase())); - connect(unlockWalletAction, SIGNAL(triggered()), walletFrame, SLOT(unlockWallet())); - connect(lockWalletAction, SIGNAL(triggered()), walletFrame, SLOT(lockWallet())); - connect(signMessageAction, SIGNAL(triggered()), this, SLOT(gotoSignMessageTab())); - connect(verifyMessageAction, SIGNAL(triggered()), this, SLOT(gotoVerifyMessageTab())); - connect(usedSendingAddressesAction, SIGNAL(triggered()), walletFrame, SLOT(usedSendingAddresses())); - connect(usedReceivingAddressesAction, SIGNAL(triggered()), walletFrame, SLOT(usedReceivingAddresses())); - connect(openAction, SIGNAL(triggered()), this, SLOT(openClicked())); - } -#endif // ENABLE_WALLET -} - -void BitcoinGUI::createMenuBar() -{ -#ifdef Q_OS_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")); - if(walletFrame) - { - file->addAction(openAction); - file->addAction(backupWalletAction); - file->addAction(signMessageAction); - file->addAction(verifyMessageAction); - file->addSeparator(); - file->addAction(usedSendingAddressesAction); - file->addAction(usedReceivingAddressesAction); - file->addSeparator(); - } - file->addAction(quitAction); - - QMenu *settings = appMenuBar->addMenu(tr("&Settings")); - if(walletFrame) - { - settings->addAction(encryptWalletAction); - settings->addAction(changePassphraseAction); - settings->addAction(unlockWalletAction); - settings->addAction(lockWalletAction); - settings->addSeparator(); - } - settings->addAction(optionsAction); - - if(walletFrame) - { - QMenu *tools = appMenuBar->addMenu(tr("&Tools")); - tools->addAction(openInfoAction); - tools->addAction(openRPCConsoleAction); - tools->addAction(openNetworkAction); - tools->addAction(openPeersAction); - tools->addSeparator(); - tools->addAction(openConfEditorAction); - tools->addAction(showBackupsAction); - } - - QMenu *help = appMenuBar->addMenu(tr("&Help")); - help->addAction(showHelpMessageAction); - help->addSeparator(); - help->addAction(aboutAction); - help->addAction(aboutQtAction); -} - -void BitcoinGUI::createToolBars() -{ - if(walletFrame) - { - QToolBar *toolbar = new QToolBar(tr("Tabs toolbar")); - toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - toolbar->addAction(overviewAction); - toolbar->addAction(sendCoinsAction); - toolbar->addAction(receiveCoinsAction); - toolbar->addAction(historyAction); - toolbar->setMovable(false); // remove unused icon in upper left corner - overviewAction->setChecked(true); - - /** Create additional container for toolbar and walletFrame and make it the central widget. - This is a workaround mostly for toolbar styling on Mac OS but should work fine for every other OSes too. - */ - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(toolbar); - layout->addWidget(walletFrame); - layout->setSpacing(0); - layout->setContentsMargins(QMargins()); - QWidget *containerWidget = new QWidget(); - containerWidget->setLayout(layout); - setCentralWidget(containerWidget); - } -} - -void BitcoinGUI::setClientModel(ClientModel *clientModel) -{ - this->clientModel = clientModel; - if(clientModel) - { - // Create system tray menu (or setup the dock menu) that late to prevent users from calling actions, - // while the client has not yet fully loaded - createTrayIconMenu(); - - // Keep up to date with client - setNumConnections(clientModel->getNumConnections()); - connect(clientModel, SIGNAL(numConnectionsChanged(int)), this, SLOT(setNumConnections(int))); - - setNumBlocks(clientModel->getNumBlocks()); - connect(clientModel, SIGNAL(numBlocksChanged(int)), this, SLOT(setNumBlocks(int))); - - // Receive and report messages from client model - connect(clientModel, SIGNAL(message(QString,QString,unsigned int)), this, SLOT(message(QString,QString,unsigned int))); - - // Show progress dialog - connect(clientModel, SIGNAL(showProgress(QString,int)), this, SLOT(showProgress(QString,int))); - - rpcConsole->setClientModel(clientModel); -#ifdef ENABLE_WALLET - if(walletFrame) - { - walletFrame->setClientModel(clientModel); - } -#endif // ENABLE_WALLET - unitDisplayControl->setOptionsModel(clientModel->getOptionsModel()); - } else { - // Disable possibility to show main window via action - toggleHideAction->setEnabled(false); - if(trayIconMenu) - { - // Disable context menu on tray icon - trayIconMenu->clear(); - } - } -} - -#ifdef ENABLE_WALLET -bool BitcoinGUI::addWallet(const QString& name, WalletModel *walletModel) -{ - if(!walletFrame) - return false; - setWalletActionsEnabled(true); - return walletFrame->addWallet(name, walletModel); -} - -bool BitcoinGUI::setCurrentWallet(const QString& name) -{ - if(!walletFrame) - return false; - return walletFrame->setCurrentWallet(name); -} - -void BitcoinGUI::removeAllWallets() -{ - if(!walletFrame) - return; - setWalletActionsEnabled(false); - walletFrame->removeAllWallets(); -} -#endif // ENABLE_WALLET - -void BitcoinGUI::setWalletActionsEnabled(bool enabled) -{ - overviewAction->setEnabled(enabled); - sendCoinsAction->setEnabled(enabled); - receiveCoinsAction->setEnabled(enabled); - historyAction->setEnabled(enabled); - encryptWalletAction->setEnabled(enabled); - backupWalletAction->setEnabled(enabled); - changePassphraseAction->setEnabled(enabled); - signMessageAction->setEnabled(enabled); - verifyMessageAction->setEnabled(enabled); - usedSendingAddressesAction->setEnabled(enabled); - usedReceivingAddressesAction->setEnabled(enabled); - openAction->setEnabled(enabled); -} - -void BitcoinGUI::createTrayIcon(const NetworkStyle *networkStyle) -{ -#ifndef Q_OS_MAC - trayIcon = new QSystemTrayIcon(this); - QString toolTip = tr("Dash Core client") + " " + networkStyle->getTitleAddText(); - trayIcon->setToolTip(toolTip); - trayIcon->setIcon(networkStyle->getAppIcon()); - trayIcon->show(); -#endif - - notificator = new Notificator(QApplication::applicationName(), trayIcon, this); -} - -void BitcoinGUI::createTrayIconMenu() -{ -#ifndef Q_OS_MAC - // return if trayIcon is unset (only on non-Mac OSes) - if (!trayIcon) - return; - - trayIconMenu = new QMenu(this); - trayIcon->setContextMenu(trayIconMenu); - - connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), - this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); -#else - // Note: On Mac, the dock icon is used to provide the tray's functionality. - MacDockIconHandler *dockIconHandler = MacDockIconHandler::instance(); - dockIconHandler->setMainWindow((QMainWindow *)this); - trayIconMenu = dockIconHandler->dockMenu(); -#endif - - // Configuration of the tray icon (or dock icon) icon menu - trayIconMenu->addAction(toggleHideAction); - trayIconMenu->addSeparator(); - trayIconMenu->addAction(sendCoinsAction); - trayIconMenu->addAction(receiveCoinsAction); - trayIconMenu->addSeparator(); - trayIconMenu->addAction(signMessageAction); - trayIconMenu->addAction(verifyMessageAction); - trayIconMenu->addSeparator(); - trayIconMenu->addAction(optionsAction); - trayIconMenu->addAction(openInfoAction); - trayIconMenu->addAction(openRPCConsoleAction); - trayIconMenu->addAction(openNetworkAction); - trayIconMenu->addAction(openPeersAction); - trayIconMenu->addSeparator(); - trayIconMenu->addAction(openConfEditorAction); - trayIconMenu->addAction(showBackupsAction); -#ifndef Q_OS_MAC // This is built-in on Mac - trayIconMenu->addSeparator(); - trayIconMenu->addAction(quitAction); -#endif -} - -#ifndef Q_OS_MAC -void BitcoinGUI::trayIconActivated(QSystemTrayIcon::ActivationReason reason) -{ - if(reason == QSystemTrayIcon::Trigger) - { - // Click on system tray icon triggers show/hide of the main window - toggleHidden(); - } -} -#endif - -void BitcoinGUI::optionsClicked() -{ - if(!clientModel || !clientModel->getOptionsModel()) - return; - - OptionsDialog dlg(this, enableWallet); - dlg.setModel(clientModel->getOptionsModel()); - dlg.exec(); -} - -void BitcoinGUI::aboutClicked() -{ - if(!clientModel) - return; - - HelpMessageDialog dlg(this, true); - dlg.exec(); -} - -void BitcoinGUI::showHelpMessageClicked() -{ - HelpMessageDialog *help = new HelpMessageDialog(this, false); - help->setAttribute(Qt::WA_DeleteOnClose); - help->show(); -} - -#ifdef ENABLE_WALLET -void BitcoinGUI::openClicked() -{ - OpenURIDialog dlg(this); - if(dlg.exec()) - { - emit receivedURI(dlg.getURI()); - } -} - -void BitcoinGUI::gotoOverviewPage() -{ - overviewAction->setChecked(true); - if (walletFrame) walletFrame->gotoOverviewPage(); -} - -void BitcoinGUI::gotoHistoryPage() -{ - historyAction->setChecked(true); - if (walletFrame) walletFrame->gotoHistoryPage(); -} - -void BitcoinGUI::gotoReceiveCoinsPage() -{ - receiveCoinsAction->setChecked(true); - if (walletFrame) walletFrame->gotoReceiveCoinsPage(); -} - -void BitcoinGUI::gotoSendCoinsPage(QString addr) -{ - sendCoinsAction->setChecked(true); - if (walletFrame) walletFrame->gotoSendCoinsPage(addr); -} - -void BitcoinGUI::gotoSignMessageTab(QString addr) -{ - if (walletFrame) walletFrame->gotoSignMessageTab(addr); -} - -void BitcoinGUI::gotoVerifyMessageTab(QString addr) -{ - if (walletFrame) walletFrame->gotoVerifyMessageTab(addr); -} -#endif // ENABLE_WALLET - -void BitcoinGUI::setNumConnections(int count) -{ - QString icon; - switch(count) - { - 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; - } - QIcon connectionItem = QIcon(icon).pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE); - labelConnectionsIcon->setIcon(connectionItem); - labelConnectionsIcon->setToolTip(tr("%n active connection(s) to Dash network", "", count)); -} - -void BitcoinGUI::setNumBlocks(int count) -{ - if(!clientModel) - return; - - // Prevent orphan statusbar messages (e.g. hover Quit in main menu, wait until chain-sync starts -> garbelled text) - statusBar()->clearMessage(); - - // Acquire current block source - enum BlockSource blockSource = clientModel->getBlockSource(); - switch (blockSource) { - case BLOCK_SOURCE_NETWORK: - progressBarLabel->setText(tr("Synchronizing with network...")); - break; - case BLOCK_SOURCE_DISK: - progressBarLabel->setText(tr("Importing blocks from disk...")); - break; - case BLOCK_SOURCE_REINDEX: - progressBarLabel->setText(tr("Reindexing blocks on disk...")); - break; - case BLOCK_SOURCE_NONE: - // Case: not Importing, not Reindexing and no network connection - progressBarLabel->setText(tr("No block source available...")); - break; - } - - QString tooltip; - - QDateTime lastBlockDate = clientModel->getLastBlockDate(); - QDateTime currentDate = QDateTime::currentDateTime(); - int secs = lastBlockDate.secsTo(currentDate); - - tooltip = tr("Processed %n blocks of transaction history.", "", count); - - // Set icon state: spinning if catching up, tick otherwise - if(secs < 25*60) // 90*60 for bitcoin but we are 4x times faster - { - tooltip = tr("Up to date") + QString(".
") + tooltip; - labelBlocksIcon->setPixmap(QIcon(":/icons/synced").pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); - -#ifdef ENABLE_WALLET - if(walletFrame) - walletFrame->showOutOfSyncWarning(false); -#endif // ENABLE_WALLET - - progressBarLabel->setVisible(false); - progressBar->setVisible(false); - } - else - { - // Represent time from last generated block in human readable text - QString timeBehindText; - const int HOUR_IN_SECONDS = 60*60; - const int DAY_IN_SECONDS = 24*60*60; - const int WEEK_IN_SECONDS = 7*24*60*60; - const int YEAR_IN_SECONDS = 31556952; // Average length of year in Gregorian calendar - if(secs < 2*DAY_IN_SECONDS) - { - timeBehindText = tr("%n hour(s)","",secs/HOUR_IN_SECONDS); - } - else if(secs < 2*WEEK_IN_SECONDS) - { - timeBehindText = tr("%n day(s)","",secs/DAY_IN_SECONDS); - } - else if(secs < YEAR_IN_SECONDS) - { - timeBehindText = tr("%n week(s)","",secs/WEEK_IN_SECONDS); - } - else - { - int years = secs / YEAR_IN_SECONDS; - int remainder = secs % YEAR_IN_SECONDS; - timeBehindText = tr("%1 and %2").arg(tr("%n year(s)", "", years)).arg(tr("%n week(s)","", remainder/WEEK_IN_SECONDS)); - } - - progressBarLabel->setVisible(true); - progressBar->setFormat(tr("%1 behind").arg(timeBehindText)); - progressBar->setMaximum(1000000000); - progressBar->setValue(clientModel->getVerificationProgress() * 1000000000.0 + 0.5); - progressBar->setVisible(true); - - tooltip = tr("Catching up...") + QString("
") + tooltip; - if(count != prevBlocks) - { - labelBlocksIcon->setPixmap(QIcon(QString( - ":/movies/spinner-%1").arg(spinnerFrame, 3, 10, QChar('0'))) - .pixmap(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE)); - spinnerFrame = (spinnerFrame + 1) % SPINNER_FRAMES; - } - prevBlocks = count; - -#ifdef ENABLE_WALLET - if(walletFrame) - walletFrame->showOutOfSyncWarning(true); -#endif // ENABLE_WALLET - - tooltip += QString("
"); - tooltip += tr("Last received block was generated %1 ago.").arg(timeBehindText); - tooltip += QString("
"); - tooltip += tr("Transactions after this will not yet be visible."); - } - - // Don't word-wrap this (fixed-width) tooltip - tooltip = QString("") + tooltip + QString(""); - - labelBlocksIcon->setToolTip(tooltip); - progressBarLabel->setToolTip(tooltip); - progressBar->setToolTip(tooltip); -} - -void BitcoinGUI::message(const QString &title, const QString &message, unsigned int style, bool *ret) -{ - QString strTitle = tr("Dash Core"); // default title - // Default to information icon - int nMBoxIcon = QMessageBox::Information; - int nNotifyIcon = Notificator::Information; - - QString msgType; - - // Prefer supplied title over style based title - if (!title.isEmpty()) { - msgType = title; - } - else { - switch (style) { - case CClientUIInterface::MSG_ERROR: - msgType = tr("Error"); - break; - case CClientUIInterface::MSG_WARNING: - msgType = tr("Warning"); - break; - case CClientUIInterface::MSG_INFORMATION: - msgType = tr("Information"); - break; - default: - break; - } - } - // Append title to "Dash - " - if (!msgType.isEmpty()) - strTitle += " - " + msgType; - - // Check for error/warning icon - if (style & CClientUIInterface::ICON_ERROR) { - nMBoxIcon = QMessageBox::Critical; - nNotifyIcon = Notificator::Critical; - } - else if (style & CClientUIInterface::ICON_WARNING) { - nMBoxIcon = QMessageBox::Warning; - nNotifyIcon = Notificator::Warning; - } - - // Display message - if (style & CClientUIInterface::MODAL) { - // Check for buttons, use OK as default, if none was supplied - QMessageBox::StandardButton buttons; - if (!(buttons = (QMessageBox::StandardButton)(style & CClientUIInterface::BTN_MASK))) - buttons = QMessageBox::Ok; - - showNormalIfMinimized(); - QMessageBox mBox((QMessageBox::Icon)nMBoxIcon, strTitle, message, buttons, this); - int r = mBox.exec(); - if (ret != NULL) - *ret = r == QMessageBox::Ok; - } - else - notificator->notify((Notificator::Class)nNotifyIcon, strTitle, message); -} - -void BitcoinGUI::changeEvent(QEvent *e) -{ - QMainWindow::changeEvent(e); -#ifndef Q_OS_MAC // Ignored on Mac - if(e->type() == QEvent::WindowStateChange) - { - if(clientModel && clientModel->getOptionsModel() && clientModel->getOptionsModel()->getMinimizeToTray()) - { - QWindowStateChangeEvent *wsevt = static_cast(e); - if(!(wsevt->oldState() & Qt::WindowMinimized) && isMinimized()) - { - QTimer::singleShot(0, this, SLOT(hide())); - e->ignore(); - } - } - } -#endif -} - -void BitcoinGUI::closeEvent(QCloseEvent *event) -{ -#ifndef Q_OS_MAC // Ignored on Mac - if(clientModel && clientModel->getOptionsModel()) - { - if(!clientModel->getOptionsModel()->getMinimizeOnClose()) - { - QApplication::quit(); - } - } -#endif - QMainWindow::closeEvent(event); -} - -#ifdef ENABLE_WALLET -void BitcoinGUI::incomingTransaction(const QString& date, int unit, const CAmount& amount, const QString& type, const QString& address) -{ - // On new transaction, make an info balloon - message((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(unit, amount, true)) - .arg(type) - .arg(address), CClientUIInterface::MSG_INFORMATION); -} -#endif // ENABLE_WALLET - -void BitcoinGUI::dragEnterEvent(QDragEnterEvent *event) -{ - // Accept only URIs - if(event->mimeData()->hasUrls()) - event->acceptProposedAction(); -} - -void BitcoinGUI::dropEvent(QDropEvent *event) -{ - if(event->mimeData()->hasUrls()) - { - foreach(const QUrl &uri, event->mimeData()->urls()) - { - emit receivedURI(uri.toString()); - } - } - event->acceptProposedAction(); -} - -bool BitcoinGUI::eventFilter(QObject *object, QEvent *event) -{ - // Catch status tip events - if (event->type() == QEvent::StatusTip) - { - // Prevent adding text from setStatusTip(), if we currently use the status bar for displaying other stuff - if (progressBarLabel->isVisible() || progressBar->isVisible()) - return true; - } - return QMainWindow::eventFilter(object, event); -} - -#ifdef ENABLE_WALLET -bool BitcoinGUI::handlePaymentRequest(const SendCoinsRecipient& recipient) -{ - // URI has to be valid - if (walletFrame && walletFrame->handlePaymentRequest(recipient)) - { - showNormalIfMinimized(); - gotoSendCoinsPage(); - return true; - } - return false; -} - -void BitcoinGUI::setEncryptionStatus(int status) -{ - switch(status) - { - case WalletModel::Unencrypted: - labelEncryptionIcon->hide(); - encryptWalletAction->setChecked(false); - changePassphraseAction->setEnabled(false); - unlockWalletAction->setVisible(false); - lockWalletAction->setVisible(false); - encryptWalletAction->setEnabled(true); - break; - case WalletModel::Unlocked: - labelEncryptionIcon->show(); - labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); - labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently unlocked")); - encryptWalletAction->setChecked(true); - changePassphraseAction->setEnabled(true); - unlockWalletAction->setVisible(false); - lockWalletAction->setVisible(true); - encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported - break; - case WalletModel::UnlockedForAnonymizationOnly: - labelEncryptionIcon->show(); - labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_open").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); - labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently unlocked for anonimization only")); - encryptWalletAction->setChecked(true); - changePassphraseAction->setEnabled(true); - unlockWalletAction->setVisible(true); - lockWalletAction->setVisible(true); - encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported - break; - case WalletModel::Locked: - labelEncryptionIcon->show(); - labelEncryptionIcon->setPixmap(QIcon(":/icons/lock_closed").pixmap(STATUSBAR_ICONSIZE,STATUSBAR_ICONSIZE)); - labelEncryptionIcon->setToolTip(tr("Wallet is encrypted and currently locked")); - encryptWalletAction->setChecked(true); - changePassphraseAction->setEnabled(true); - unlockWalletAction->setVisible(true); - lockWalletAction->setVisible(false); - encryptWalletAction->setEnabled(false); // TODO: decrypt currently not supported - break; - } -} -#endif // ENABLE_WALLET - -void BitcoinGUI::showNormalIfMinimized(bool fToggleHidden) -{ - if(!clientModel) - return; - - // activateWindow() (sometimes) helps with keyboard focus on Windows - if (isHidden()) - { - show(); - activateWindow(); - } - else if (isMinimized()) - { - showNormal(); - activateWindow(); - } - else if (GUIUtil::isObscured(this)) - { - raise(); - activateWindow(); - } - else if(fToggleHidden) - hide(); -} - -void BitcoinGUI::toggleHidden() -{ - showNormalIfMinimized(true); -} - -void BitcoinGUI::detectShutdown() -{ - if (ShutdownRequested()) - { - if(rpcConsole) - rpcConsole->hide(); - qApp->quit(); - } -} - -void BitcoinGUI::showProgress(const QString &title, int nProgress) -{ - if (nProgress == 0) - { - progressDialog = new QProgressDialog(title, "", 0, 100); - progressDialog->setWindowModality(Qt::ApplicationModal); - progressDialog->setMinimumDuration(0); - progressDialog->setCancelButton(0); - progressDialog->setAutoClose(false); - progressDialog->setValue(0); - } - else if (nProgress == 100) - { - if (progressDialog) - { - progressDialog->close(); - progressDialog->deleteLater(); - } - } - else if (progressDialog) - progressDialog->setValue(nProgress); -} - -static bool ThreadSafeMessageBox(BitcoinGUI *gui, const std::string& message, const std::string& caption, unsigned int style) -{ - bool modal = (style & CClientUIInterface::MODAL); - // The SECURE flag has no effect in the Qt GUI. - // bool secure = (style & CClientUIInterface::SECURE); - style &= ~CClientUIInterface::SECURE; - bool ret = false; - // In case of modal message, use blocking connection to wait for user to click a button - QMetaObject::invokeMethod(gui, "message", - modal ? GUIUtil::blockingGUIThreadConnection() : Qt::QueuedConnection, - Q_ARG(QString, QString::fromStdString(caption)), - Q_ARG(QString, QString::fromStdString(message)), - Q_ARG(unsigned int, style), - Q_ARG(bool*, &ret)); - return ret; -} - -void BitcoinGUI::subscribeToCoreSignals() -{ - // Connect signals to client - uiInterface.ThreadSafeMessageBox.connect(boost::bind(ThreadSafeMessageBox, this, _1, _2, _3)); -} - -void BitcoinGUI::unsubscribeFromCoreSignals() -{ - // Disconnect signals from client - uiInterface.ThreadSafeMessageBox.disconnect(boost::bind(ThreadSafeMessageBox, this, _1, _2, _3)); -} - -UnitDisplayStatusBarControl::UnitDisplayStatusBarControl() : - optionsModel(0), - menu(0) -{ - createContextMenu(); - setToolTip(tr("Unit to show amounts in. Click to select another unit.")); -} - -/** So that it responds to button clicks */ -void UnitDisplayStatusBarControl::mousePressEvent(QMouseEvent *event) -{ - onDisplayUnitsClicked(event->pos()); -} - -/** Creates context menu, its actions, and wires up all the relevant signals for mouse events. */ -void UnitDisplayStatusBarControl::createContextMenu() -{ - menu = new QMenu(); - foreach(BitcoinUnits::Unit u, BitcoinUnits::availableUnits()) - { - QAction *menuAction = new QAction(QString(BitcoinUnits::name(u)), this); - menuAction->setData(QVariant(u)); - menu->addAction(menuAction); - } - connect(menu,SIGNAL(triggered(QAction*)),this,SLOT(onMenuSelection(QAction*))); -} - -/** Lets the control know about the Options Model (and its signals) */ -void UnitDisplayStatusBarControl::setOptionsModel(OptionsModel *optionsModel) -{ - if (optionsModel) - { - this->optionsModel = optionsModel; - - // be aware of a display unit change reported by the OptionsModel object. - connect(optionsModel,SIGNAL(displayUnitChanged(int)),this,SLOT(updateDisplayUnit(int))); - - // initialize the display units label with the current value in the model. - updateDisplayUnit(optionsModel->getDisplayUnit()); - } -} - -/** When Display Units are changed on OptionsModel it will refresh the display text of the control on the status bar */ -void UnitDisplayStatusBarControl::updateDisplayUnit(int newUnits) -{ - setPixmap(QIcon(":/icons/unit_" + BitcoinUnits::id(newUnits)).pixmap(31,STATUSBAR_ICONSIZE)); -} - -/** Shows context menu with Display Unit options by the mouse coordinates */ -void UnitDisplayStatusBarControl::onDisplayUnitsClicked(const QPoint& point) -{ - QPoint globalPos = mapToGlobal(point); - menu->exec(globalPos); -} - -/** Tells underlying optionsModel to update its current display unit. */ -void UnitDisplayStatusBarControl::onMenuSelection(QAction* action) -{ - if (action) - { - optionsModel->setDisplayUnit(action->data()); - } -} diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index a6e502477d..a12d99151c 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -178,7 +178,7 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : labelConnectionsIcon = new QPushButton(); labelConnectionsIcon->setFlat(true); // Make the button look like a label, but clickable labelConnectionsIcon->setStyleSheet("background-color: rgba(255, 255, 255, 0);"); - labelConnectionsIcon->setMaximumSize(16, 16); + labelConnectionsIcon->setMaximumSize(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE); labelBlocksIcon = new QLabel(); if(enableWallet) { From 34a205b9a6362b13f247f10a48e047427fd409a7 Mon Sep 17 00:00:00 2001 From: crowning- Date: Wed, 20 May 2015 09:05:46 +0200 Subject: [PATCH 5/6] Fix tooltip background for OSX --- src/qt/bitcoingui.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index a12d99151c..9c17d81da5 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -176,8 +176,12 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : unitDisplayControl = new UnitDisplayStatusBarControl(); labelEncryptionIcon = new QLabel(); labelConnectionsIcon = new QPushButton(); - labelConnectionsIcon->setFlat(true); // Make the button look like a label, but clickable + labelConnectionsIcon->setFlat(true); // Make the button look like a label, but clickable +#ifndef Q_OS_MAC labelConnectionsIcon->setStyleSheet("background-color: rgba(255, 255, 255, 0);"); +#else + labelConnectionsIcon->setStyleSheet("QPushButton { background-color: rgba(255, 255, 255, 0);} QPushButton QToolTip { background-color: black;}"); +#endif labelConnectionsIcon->setMaximumSize(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE); labelBlocksIcon = new QLabel(); if(enableWallet) From 472d2a21d6a6946bd7fb386c3a8b719bd9f00cf2 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Wed, 20 May 2015 23:09:31 +0300 Subject: [PATCH 6/6] fix tooltip background --- src/qt/bitcoingui.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 9c17d81da5..346fc51a3c 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -177,11 +177,7 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) : labelEncryptionIcon = new QLabel(); labelConnectionsIcon = new QPushButton(); labelConnectionsIcon->setFlat(true); // Make the button look like a label, but clickable -#ifndef Q_OS_MAC - labelConnectionsIcon->setStyleSheet("background-color: rgba(255, 255, 255, 0);"); -#else - labelConnectionsIcon->setStyleSheet("QPushButton { background-color: rgba(255, 255, 255, 0);} QPushButton QToolTip { background-color: black;}"); -#endif + labelConnectionsIcon->setStyleSheet(".QPushButton { background-color: rgba(255, 255, 255, 0);}"); labelConnectionsIcon->setMaximumSize(STATUSBAR_ICONSIZE, STATUSBAR_ICONSIZE); labelBlocksIcon = new QLabel(); if(enableWallet)