From 9a2fef7d8fe6ead4c271db4207944a0c516ffb01 Mon Sep 17 00:00:00 2001 From: MarcoFalke Date: Mon, 13 Jul 2020 10:34:21 +0200 Subject: [PATCH] Merge bitcoin-core/gui#30: Disable the main window toolbar when the modal overlay is shown d0cc1f6df740e03ca0213a3754c3277b01ae2c05 qt: Disable toolbar when overlay is shown (Hennadii Stepanov) e74cd2083d579b14b0b718aa36796f2bcf679600 qt, refactor: Cleanup ModalOverlay slots (Hennadii Stepanov) Pull request description: Keeping the main window toolbar activated while the modal overlay is shown could create the appearance of the non-responsive GUI. Fixes #22. --- On master (ca055885c631de8ac0ffe24be6b02835dbcc039d): ![Screenshot from 2020-07-11 13-07-00](https://user-images.githubusercontent.com/32963518/87221791-7504e100-c377-11ea-9689-ddd4b21b98f9.png) With this PR: ![Screenshot from 2020-07-11 13-07-39](https://user-images.githubusercontent.com/32963518/87221803-8817b100-c377-11ea-92c8-3602dc4d2451.png) ACKs for top commit: harding: Tested ACK d0cc1f6df740e03ca0213a3754c3277b01ae2c05. Tested on Linux/X11 as much as I could given it's a pretty small change; seems like a nice improvement. I'm not experienced in Qt, but I don't see anything obviously problematic about the code. jonatack: ACK d0cc1f6 tested on Debian 5.7.6-1 (2020-06-24) x86_64 GNU/Linux LarryRuane: ACK d0cc1f6df740e03ca0213a3754c3277b01ae2c05 tested on Ubuntu 18.04.4 LTS Tree-SHA512: e371b34231c01e77118deb100e0f280ba1cdef54e317f7f7d6ac322598bda811bd1bfe3035e90d87f8267f4f5d2095d34a8136911159db63694fd1b1b11335a1 --- src/qt/bitcoingui.cpp | 22 +++++++++++++++++++++- src/qt/modaloverlay.cpp | 2 ++ src/qt/modaloverlay.h | 10 +++++++--- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index b892823ba519fd..6feb6871292db3 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -117,6 +117,8 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const NetworkStyle* networkStyle, Q_EMIT consoleShown(rpcConsole); } + modalOverlay = new ModalOverlay(enableWallet, this->centralWidget()); + // Accept D&D of URIs setAcceptDrops(true); @@ -210,7 +212,6 @@ BitcoinGUI::BitcoinGUI(interfaces::Node& node, const NetworkStyle* networkStyle, openOptionsDialogWithTab(OptionsDialog::TAB_NETWORK); }); - modalOverlay = new ModalOverlay(enableWallet, this->centralWidget()); connect(labelBlocksIcon, &GUIUtil::ClickableLabel::clicked, this, &BitcoinGUI::showModalOverlay); connect(progressBar, &GUIUtil::ClickableProgressBar::clicked, this, &BitcoinGUI::showModalOverlay); #ifdef ENABLE_WALLET @@ -346,6 +347,25 @@ void BitcoinGUI::stopConnectingAnimation() void BitcoinGUI::createActions() { + // there's no `setEnabled` for QActionGroup + // shoud call one-by-one? + /* + const QList buttons = tabGroup->buttons(); + for (QAbstractButton *button : buttons) { + button->setEnabled(false); + } + */ + connect(modalOverlay, &ModalOverlay::triggered, tabGroup, &QButtonGroup::setEnabled); + /* + connect(modalOverlay, &ModalOverlay::triggered, tabGroup, [=](QButtonGroup *group, bool hide) { + const QList buttons = group->buttons(); + for (QAbstractButton *button : buttons) { + button->setEnabled(hide); + } + }); + */ + + sendCoinsMenuAction = new QAction(tr("&Send"), this); sendCoinsMenuAction->setStatusTip(tr("Send coins to a Dash address")); sendCoinsMenuAction->setToolTip(sendCoinsMenuAction->statusTip()); diff --git a/src/qt/modaloverlay.cpp b/src/qt/modaloverlay.cpp index c3571686367c1f..c3d998c76699df 100644 --- a/src/qt/modaloverlay.cpp +++ b/src/qt/modaloverlay.cpp @@ -187,6 +187,8 @@ void ModalOverlay::showHide(bool hide, bool userRequested) if (!hide && foreverHidden) return; + Q_EMIT triggered(hide); + if (!isVisible() && !hide) setVisible(true); diff --git a/src/qt/modaloverlay.h b/src/qt/modaloverlay.h index 8425157b50b15b..2cc1126d09ee91 100644 --- a/src/qt/modaloverlay.h +++ b/src/qt/modaloverlay.h @@ -25,17 +25,21 @@ class ModalOverlay : public QWidget explicit ModalOverlay(bool enable_wallet, QWidget *parent); ~ModalOverlay(); -public Q_SLOTS: void tipUpdate(int count, const QDateTime& blockDate, double nVerificationProgress); void setKnownBestHeight(int count, const QDateTime& blockDate); - void toggleVisibility(); // will show or hide the modal layer void showHide(bool hide = false, bool userRequested = false); - void closeClicked(); void hideForever(); bool isLayerVisible() const { return layerIsVisible; } +public Q_SLOTS: + void toggleVisibility(); + void closeClicked(); + +Q_SIGNALS: + void triggered(bool hidden); + protected: bool eventFilter(QObject * obj, QEvent * ev) override; bool event(QEvent* ev) override;