From 89a3723bdc5d563f036c1a579c3d3539cc8fc6e7 Mon Sep 17 00:00:00 2001 From: Jonas Schnelli Date: Mon, 5 Dec 2016 09:26:43 +0100 Subject: [PATCH] [Qt] Show ModalOverlay by pressing the progress bar, disabled show() in sync mode --- src/qt/bitcoingui.cpp | 6 +++--- src/qt/guiutil.cpp | 7 ++++++- src/qt/guiutil.h | 43 +++++++++++++++++++++++++++-------------- src/qt/modaloverlay.cpp | 7 +++++++ src/qt/modaloverlay.h | 2 ++ 5 files changed, 46 insertions(+), 19 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 54ed867de..651ff8429 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -251,6 +250,7 @@ BitcoinGUI::BitcoinGUI(const PlatformStyle *_platformStyle, const NetworkStyle * if(enableWallet) { connect(walletFrame, SIGNAL(requestedSyncWarningInfo()), this, SLOT(showModalOverlay())); connect(labelBlocksIcon, SIGNAL(clicked(QPoint)), this, SLOT(showModalOverlay())); + connect(progressBar, SIGNAL(clicked(QPoint)), this, SLOT(showModalOverlay())); } #endif } @@ -1138,8 +1138,8 @@ void BitcoinGUI::setTrayIconVisible(bool fHideTrayIcon) void BitcoinGUI::showModalOverlay() { - if (modalOverlay) - modalOverlay->showHide(false, true); + if (modalOverlay && (progressBar->isVisible() || modalOverlay->isLayerVisible())) + modalOverlay->toggleVisibility(); } static bool ThreadSafeMessageBox(BitcoinGUI *gui, const std::string& message, const std::string& caption, unsigned int style) diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 4806e4143..3feb781db 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -988,7 +988,12 @@ QString formateNiceTimeOffset(qint64 secs) return timeBehindText; } -void ClickableLabel::mousePressEvent(QMouseEvent *event) +void ClickableLabel::mouseReleaseEvent(QMouseEvent *event) +{ + Q_EMIT clicked(event->pos()); +} + +void ClickableProgressBar::mouseReleaseEvent(QMouseEvent *event) { Q_EMIT clicked(event->pos()); } diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 9a17d24f0..4ea2aa36e 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -202,20 +202,6 @@ namespace GUIUtil QString formateNiceTimeOffset(qint64 secs); -#if defined(Q_OS_MAC) && QT_VERSION >= 0x050000 - // workaround for Qt OSX Bug: - // https://bugreports.qt-project.org/browse/QTBUG-15631 - // QProgressBar uses around 10% CPU even when app is in background - class ProgressBar : public QProgressBar - { - bool event(QEvent *e) { - return (e->type() != QEvent::StyleAnimationUpdate) ? QProgressBar::event(e) : false; - } - }; -#else - typedef QProgressBar ProgressBar; -#endif - class ClickableLabel : public QLabel { Q_OBJECT @@ -226,8 +212,35 @@ namespace GUIUtil */ void clicked(const QPoint& point); protected: - void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + }; + + class ClickableProgressBar : public QProgressBar + { + Q_OBJECT + + Q_SIGNALS: + /** Emitted when the progressbar is clicked. The relative mouse coordinates of the click are + * passed to the signal. + */ + void clicked(const QPoint& point); + protected: + void mouseReleaseEvent(QMouseEvent *event); + }; + +#if defined(Q_OS_MAC) && QT_VERSION >= 0x050000 + // workaround for Qt OSX Bug: + // https://bugreports.qt-project.org/browse/QTBUG-15631 + // QProgressBar uses around 10% CPU even when app is in background + class ProgressBar : public ClickableProgressBar + { + bool event(QEvent *e) { + return (e->type() != QEvent::StyleAnimationUpdate) ? QProgressBar::event(e) : false; + } }; +#else + typedef ClickableProgressBar ProgressBar; +#endif } // namespace GUIUtil diff --git a/src/qt/modaloverlay.cpp b/src/qt/modaloverlay.cpp index 1a843a07a..3e8282e63 100644 --- a/src/qt/modaloverlay.cpp +++ b/src/qt/modaloverlay.cpp @@ -137,6 +137,13 @@ void ModalOverlay::tipUpdate(int count, const QDateTime& blockDate, double nVeri } } +void ModalOverlay::toggleVisibility() +{ + showHide(layerIsVisible, true); + if (!layerIsVisible) + userClosed = true; +} + void ModalOverlay::showHide(bool hide, bool userRequested) { if ( (layerIsVisible && !hide) || (!layerIsVisible && hide) || (!hide && userClosed && !userRequested)) diff --git a/src/qt/modaloverlay.h b/src/qt/modaloverlay.h index 66c0aa78c..70d37b87a 100644 --- a/src/qt/modaloverlay.h +++ b/src/qt/modaloverlay.h @@ -25,9 +25,11 @@ 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(); + bool isLayerVisible() { return layerIsVisible; } protected: bool eventFilter(QObject * obj, QEvent * ev);