From 334c76fd31f98d95dff94f059da90a118c4ea6be Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 15 Feb 2019 15:30:52 +0100 Subject: [PATCH] Help viewer: Add option for scroll wheel zooming Fixes: QTCREATORBUG-14154 Change-Id: Ia6c4aedb78954614477f0228ba82c4dc476a2525 Reviewed-by: Leena Miettinen Reviewed-by: David Schulz --- src/plugins/help/generalsettingspage.cpp | 9 ++++++++ src/plugins/help/generalsettingspage.h | 1 + src/plugins/help/generalsettingspage.ui | 7 ++++++ src/plugins/help/helpplugin.cpp | 3 +++ src/plugins/help/helpviewer.cpp | 20 +++++++++++++++++ src/plugins/help/helpviewer.h | 6 ++++++ src/plugins/help/localhelpmanager.cpp | 12 +++++++++++ src/plugins/help/localhelpmanager.h | 4 ++++ src/plugins/help/textbrowserhelpviewer.cpp | 10 --------- src/plugins/help/textbrowserhelpviewer.h | 1 - src/plugins/help/webenginehelpviewer.cpp | 25 ++++++++++++++++++++++ src/plugins/help/webenginehelpviewer.h | 3 +++ 12 files changed, 90 insertions(+), 11 deletions(-) diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index fc8fa3d3215..39033b7bff8 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -119,6 +119,9 @@ QWidget *GeneralSettingsPage::widget() m_returnOnClose = LocalHelpManager::returnOnClose(); m_ui->m_returnOnClose->setChecked(m_returnOnClose); + + m_scrollWheelZoomingEnabled = LocalHelpManager::isScrollWheelZoomingEnabled(); + m_ui->scrollWheelZooming->setChecked(m_scrollWheelZoomingEnabled); } return m_widget; } @@ -159,6 +162,12 @@ void GeneralSettingsPage::apply() m_returnOnClose = close; LocalHelpManager::setReturnOnClose(m_returnOnClose); } + + const bool zoom = m_ui->scrollWheelZooming->isChecked(); + if (m_scrollWheelZoomingEnabled != zoom) { + m_scrollWheelZoomingEnabled = zoom; + LocalHelpManager::setScrollWheelZoomingEnabled(m_scrollWheelZoomingEnabled); + } } void GeneralSettingsPage::setCurrentPage() diff --git a/src/plugins/help/generalsettingspage.h b/src/plugins/help/generalsettingspage.h index 38040390277..3845881c3be 100644 --- a/src/plugins/help/generalsettingspage.h +++ b/src/plugins/help/generalsettingspage.h @@ -69,6 +69,7 @@ private: int m_startOption; bool m_returnOnClose; + bool m_scrollWheelZoomingEnabled; QPointer m_widget; Ui::GeneralSettingsPage *m_ui = nullptr; diff --git a/src/plugins/help/generalsettingspage.ui b/src/plugins/help/generalsettingspage.ui index e303d50f6e9..afca6739cbd 100644 --- a/src/plugins/help/generalsettingspage.ui +++ b/src/plugins/help/generalsettingspage.ui @@ -288,6 +288,13 @@ Behaviour + + + + Enable scroll wheel zooming + + + diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 7703541670e..7abdee2c7c7 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -495,6 +495,9 @@ HelpViewer *HelpPlugin::createHelpViewer(qreal zoom) // initialize zoom viewer->setScale(zoom); + viewer->setScrollWheelZoomingEnabled(LocalHelpManager::isScrollWheelZoomingEnabled()); + connect(LocalHelpManager::instance(), &LocalHelpManager::scrollWheelZoomingEnabledChanged, + viewer, &HelpViewer::setScrollWheelZoomingEnabled); // add find support auto agg = new Aggregation::Aggregate; diff --git a/src/plugins/help/helpviewer.cpp b/src/plugins/help/helpviewer.cpp index 1c40bbd111b..d667c3b26cd 100644 --- a/src/plugins/help/helpviewer.cpp +++ b/src/plugins/help/helpviewer.cpp @@ -91,6 +91,16 @@ HelpViewer::~HelpViewer() restoreOverrideCursor(); } +void HelpViewer::setScrollWheelZoomingEnabled(bool enabled) +{ + m_scrollWheelZoomingEnabled = enabled; +} + +bool HelpViewer::isScrollWheelZoomingEnabled() const +{ + return m_scrollWheelZoomingEnabled; +} + void HelpViewer::setActionVisible(Action action, bool visible) { if (visible) @@ -162,6 +172,16 @@ void HelpViewer::home() setSource(LocalHelpManager::homePage()); } +void HelpViewer::wheelEvent(QWheelEvent *event) +{ + if (m_scrollWheelZoomingEnabled && event->modifiers() == Qt::ControlModifier) { + event->accept(); + event->delta() > 0 ? scaleUp() : scaleDown(); + } else { + QWidget::wheelEvent(event); + } +} + void HelpViewer::slotLoadStarted() { ++m_loadOverrideStack; diff --git a/src/plugins/help/helpviewer.h b/src/plugins/help/helpviewer.h index 0a24fb7222d..d502d7c6640 100644 --- a/src/plugins/help/helpviewer.h +++ b/src/plugins/help/helpviewer.h @@ -57,6 +57,9 @@ public: virtual qreal scale() const = 0; virtual void setScale(qreal scale) = 0; + void setScrollWheelZoomingEnabled(bool enabled); + bool isScrollWheelZoomingEnabled() const; + virtual QString title() const = 0; virtual QUrl source() const = 0; @@ -105,12 +108,15 @@ signals: void externalPageRequested(const QUrl &url); protected: + void wheelEvent(QWheelEvent *event) override; + void slotLoadStarted(); void slotLoadFinished(); void restoreOverrideCursor(); Actions m_visibleActions; + bool m_scrollWheelZoomingEnabled = true; int m_loadOverrideStack = 0; }; diff --git a/src/plugins/help/localhelpmanager.cpp b/src/plugins/help/localhelpmanager.cpp index 3f698f2f284..140aa4a9350 100644 --- a/src/plugins/help/localhelpmanager.cpp +++ b/src/plugins/help/localhelpmanager.cpp @@ -65,6 +65,7 @@ static const char kFontSizeKey[] = "Help/FallbackFontSize"; static const char kStartOptionKey[] = "Help/StartOption"; static const char kContextHelpOptionKey[] = "Help/ContextHelpOption"; static const char kReturnOnCloseKey[] = "Help/ReturnOnClose"; +static const char kUseScrollWheelZooming[] = "Help/UseScrollWheelZooming"; static const char kLastShownPagesKey[] = "Help/LastShownPages"; static const char kLastShownPagesZoomKey[] = "Help/LastShownPagesZoom"; static const char kLastSelectedTabKey[] = "Help/LastSelectedTab"; @@ -225,6 +226,17 @@ void LocalHelpManager::setReturnOnClose(bool returnOnClose) emit m_instance->returnOnCloseChanged(); } +bool LocalHelpManager::isScrollWheelZoomingEnabled() +{ + return Core::ICore::settings()->value(kUseScrollWheelZooming, true).toBool(); +} + +void LocalHelpManager::setScrollWheelZoomingEnabled(bool enabled) +{ + Core::ICore::settings()->setValue(kUseScrollWheelZooming, enabled); + emit m_instance->scrollWheelZoomingEnabledChanged(enabled); +} + QStringList LocalHelpManager::lastShownPages() { const QVariant value = Core::ICore::settings()->value(kLastShownPagesKey, QVariant()); diff --git a/src/plugins/help/localhelpmanager.h b/src/plugins/help/localhelpmanager.h index bc8cd3b94a1..7b330ade309 100644 --- a/src/plugins/help/localhelpmanager.h +++ b/src/plugins/help/localhelpmanager.h @@ -78,6 +78,9 @@ public: static bool returnOnClose(); static void setReturnOnClose(bool returnOnClose); + static bool isScrollWheelZoomingEnabled(); + static void setScrollWheelZoomingEnabled(bool enabled); + static QStringList lastShownPages(); static void setLastShownPages(const QStringList &pages); @@ -106,6 +109,7 @@ signals: void filterIndexChanged(int index); void fallbackFontChanged(const QFont &font); void returnOnCloseChanged(); + void scrollWheelZoomingEnabledChanged(bool enabled); private: static bool m_guiNeedsSetup; diff --git a/src/plugins/help/textbrowserhelpviewer.cpp b/src/plugins/help/textbrowserhelpviewer.cpp index d729535fa38..02afab8d4de 100644 --- a/src/plugins/help/textbrowserhelpviewer.cpp +++ b/src/plugins/help/textbrowserhelpviewer.cpp @@ -406,16 +406,6 @@ bool TextBrowserHelpWidget::eventFilter(QObject *obj, QEvent *event) return QTextBrowser::eventFilter(obj, event); } -void TextBrowserHelpWidget::wheelEvent(QWheelEvent *e) -{ - if (e->modifiers() == Qt::ControlModifier) { - e->accept(); - e->delta() > 0 ? scaleUp() : scaleDown(); - } else { - QTextBrowser::wheelEvent(e); - } -} - void TextBrowserHelpWidget::mousePressEvent(QMouseEvent *e) { if (Utils::HostOsInfo::isLinuxHost() && m_parent->handleForwardBackwardMouseButtons(e)) diff --git a/src/plugins/help/textbrowserhelpviewer.h b/src/plugins/help/textbrowserhelpviewer.h index 3e046a8771e..52d5b7ce2b1 100644 --- a/src/plugins/help/textbrowserhelpviewer.h +++ b/src/plugins/help/textbrowserhelpviewer.h @@ -98,7 +98,6 @@ public: protected: void contextMenuEvent(QContextMenuEvent *event) override; bool eventFilter(QObject *obj, QEvent *event) override; - void wheelEvent(QWheelEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; diff --git a/src/plugins/help/webenginehelpviewer.cpp b/src/plugins/help/webenginehelpviewer.cpp index 60773b91fef..197f356d79e 100644 --- a/src/plugins/help/webenginehelpviewer.cpp +++ b/src/plugins/help/webenginehelpviewer.cpp @@ -292,6 +292,31 @@ WebView::WebView(WebEngineHelpViewer *viewer) { } +bool WebView::event(QEvent *ev) +{ + // work around QTBUG-43602 + if (ev->type() == QEvent::ChildAdded) { + auto ce = static_cast(ev); + ce->child()->installEventFilter(this); + } else if (ev->type() == QEvent::ChildRemoved) { + auto ce = static_cast(ev); + ce->child()->removeEventFilter(this); + } + return QWebEngineView::event(ev); +} + +bool WebView::eventFilter(QObject *src, QEvent *e) +{ + Q_UNUSED(src) + // work around QTBUG-43602 + if (m_viewer->isScrollWheelZoomingEnabled() && e->type() == QEvent::Wheel) { + auto we = static_cast(e); + if (we->modifiers() == Qt::ControlModifier) + return true; + } + return false; +} + void WebView::contextMenuEvent(QContextMenuEvent *event) { QMenu *menu = page()->createStandardContextMenu(); diff --git a/src/plugins/help/webenginehelpviewer.h b/src/plugins/help/webenginehelpviewer.h index cffe26af219..f781889108a 100644 --- a/src/plugins/help/webenginehelpviewer.h +++ b/src/plugins/help/webenginehelpviewer.h @@ -53,6 +53,9 @@ class WebView : public QWebEngineView public: explicit WebView(WebEngineHelpViewer *viewer); + bool event(QEvent *ev) override; + bool eventFilter(QObject *src, QEvent *e) override; + protected: void contextMenuEvent(QContextMenuEvent *event) override;