From 6d5fcad576962e5950641f7e7b113a6ac6f397e5 Mon Sep 17 00:00:00 2001 From: Cristian Mircea Messel Date: Wed, 16 May 2018 23:05:09 +0300 Subject: [PATCH] [gui] Make proxy icon from statusbar clickable Clicking on the proxy icon will open settings showing the network tab Create enum Tab in OptionsModel Use new connect syntax Use lambda for private slots --- src/qt/bitcoingui.cpp | 32 +++++++++++++++++++------------- src/qt/bitcoingui.h | 16 +++++++++++----- src/qt/optionsdialog.cpp | 10 ++++++++++ src/qt/optionsdialog.h | 6 ++++++ 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 2438361a5..a26bacd5d 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -146,7 +146,7 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty unitDisplayControl = new UnitDisplayStatusBarControl(platformStyle); labelWalletEncryptionIcon = new QLabel(); labelWalletHDStatusIcon = new QLabel(); - labelProxyIcon = new QLabel(); + labelProxyIcon = new GUIUtil::ClickableLabel(); connectionsControl = new GUIUtil::ClickableLabel(); labelBlocksIcon = new GUIUtil::ClickableLabel(); if(enableWallet) @@ -193,7 +193,12 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const PlatformStyle *_platformSty // Subscribe to notifications from core subscribeToCoreSignals(); - connect(connectionsControl, SIGNAL(clicked(QPoint)), this, SLOT(toggleNetworkActive())); + connect(connectionsControl, &GUIUtil::ClickableLabel::clicked, [this] { + m_node.setNetworkActive(!m_node.getNetworkActive()); + }); + connect(labelProxyIcon, &GUIUtil::ClickableLabel::clicked, [this] { + openOptionsDialogWithTab(OptionsDialog::TAB_NETWORK); + }); modalOverlay = new ModalOverlay(this->centralWidget()); #ifdef ENABLE_WALLET @@ -635,12 +640,7 @@ void BitcoinGUI::trayIconActivated(QSystemTrayIcon::ActivationReason reason) void BitcoinGUI::optionsClicked() { - if(!clientModel || !clientModel->getOptionsModel()) - return; - - OptionsDialog dlg(this, enableWallet); - dlg.setModel(clientModel->getOptionsModel()); - dlg.exec(); + openOptionsDialogWithTab(OptionsDialog::TAB_MAIN); } void BitcoinGUI::aboutClicked() @@ -764,6 +764,17 @@ void BitcoinGUI::updateHeadersSyncProgressLabel() progressBarLabel->setText(tr("Syncing Headers (%1%)...").arg(QString::number(100.0 / (headersTipHeight+estHeadersLeft)*headersTipHeight, 'f', 1))); } +void BitcoinGUI::openOptionsDialogWithTab(OptionsDialog::Tab tab) +{ + if (!clientModel || !clientModel->getOptionsModel()) + return; + + OptionsDialog dlg(this, enableWallet); + dlg.setCurrentTab(tab); + dlg.setModel(clientModel->getOptionsModel()); + dlg.exec(); +} + void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, bool header) { if (modalOverlay) @@ -1231,11 +1242,6 @@ void BitcoinGUI::unsubscribeFromCoreSignals() m_handler_question->disconnect(); } -void BitcoinGUI::toggleNetworkActive() -{ - m_node.setNetworkActive(!m_node.getNetworkActive()); -} - UnitDisplayStatusBarControl::UnitDisplayStatusBarControl(const PlatformStyle *platformStyle) : optionsModel(0), menu(0) diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 4deeb325b..2b4c19ec5 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -9,6 +9,8 @@ #include #endif +#include + #include #include @@ -45,6 +47,10 @@ class QProgressBar; class QProgressDialog; QT_END_NAMESPACE +namespace GUIUtil { +class ClickableLabel; +} + /** Bitcoin GUI main class. This class represents the main window of the Bitcoin UI. It communicates with both the client and wallet models to give the user an up-to-date view of the current core state. @@ -93,8 +99,8 @@ private: UnitDisplayStatusBarControl* unitDisplayControl = nullptr; QLabel* labelWalletEncryptionIcon = nullptr; QLabel* labelWalletHDStatusIcon = nullptr; - QLabel* labelProxyIcon = nullptr; - QLabel* connectionsControl = nullptr; + GUIUtil::ClickableLabel* labelProxyIcon = nullptr; + GUIUtil::ClickableLabel* connectionsControl = nullptr; QLabel* labelBlocksIcon = nullptr; QLabel* progressBarLabel = nullptr; QProgressBar* progressBar = nullptr; @@ -166,6 +172,9 @@ private: void updateHeadersSyncProgressLabel(); + /** Open the OptionsDialog on the specified tab index */ + void openOptionsDialogWithTab(OptionsDialog::Tab tab); + Q_SIGNALS: /** Signal raised when a URI was entered or dragged to the GUI */ void receivedURI(const QString &uri); @@ -266,9 +275,6 @@ private Q_SLOTS: /** When hideTrayIcon setting is changed in OptionsModel hide or show the icon accordingly. */ void setTrayIconVisible(bool); - /** Toggle networking */ - void toggleNetworkActive(); - void showModalOverlay(); }; diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index a57343f03..79f4f7777 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -170,6 +170,16 @@ void OptionsDialog::setModel(OptionsModel *_model) connect(ui->thirdPartyTxUrls, SIGNAL(textChanged(const QString &)), this, SLOT(showRestartWarning())); } +void OptionsDialog::setCurrentTab(OptionsDialog::Tab tab) +{ + QWidget *tab_widget = nullptr; + if (tab == OptionsDialog::Tab::TAB_NETWORK) tab_widget = ui->tabNetwork; + if (tab == OptionsDialog::Tab::TAB_MAIN) tab_widget = ui->tabMain; + if (tab_widget && ui->tabWidget->currentWidget() != tab_widget) { + ui->tabWidget->setCurrentWidget(tab_widget); + } +} + void OptionsDialog::setMapper() { /* Main */ diff --git a/src/qt/optionsdialog.h b/src/qt/optionsdialog.h index 5aad484ce..482f61658 100644 --- a/src/qt/optionsdialog.h +++ b/src/qt/optionsdialog.h @@ -40,8 +40,14 @@ public: explicit OptionsDialog(QWidget *parent, bool enableWallet); ~OptionsDialog(); + enum Tab { + TAB_MAIN, + TAB_NETWORK, + }; + void setModel(OptionsModel *model); void setMapper(); + void setCurrentTab(OptionsDialog::Tab tab); private Q_SLOTS: /* set OK button state (enabled / disabled) */