diff --git a/src/plugins/help/generalsettingspage.cpp b/src/plugins/help/generalsettingspage.cpp index 3b3e3668585..93538efc099 100644 --- a/src/plugins/help/generalsettingspage.cpp +++ b/src/plugins/help/generalsettingspage.cpp @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -122,6 +123,21 @@ QWidget *GeneralSettingsPage::widget() m_scrollWheelZoomingEnabled = LocalHelpManager::isScrollWheelZoomingEnabled(); m_ui->scrollWheelZooming->setChecked(m_scrollWheelZoomingEnabled); + + const QString tooltip = tr("Change takes effect after reloading help pages."); + m_ui->viewerBackendLabel->setToolTip(tooltip); + m_ui->viewerBackend->setToolTip(tooltip); + m_ui->viewerBackend->addItem(tr("Default (%1)", "Default viewer backend") + .arg(LocalHelpManager::defaultViewerBackend().displayName)); + const QByteArray currentBackend = LocalHelpManager::viewerBackendId(); + const QVector backends = LocalHelpManager::viewerBackends(); + for (const HelpViewerFactory &f : backends) { + m_ui->viewerBackend->addItem(f.displayName, f.id); + if (f.id == currentBackend) + m_ui->viewerBackend->setCurrentIndex(m_ui->viewerBackend->count() - 1); + } + if (backends.size() == 1) + m_ui->viewerBackend->setEnabled(false); } return m_widget; } @@ -168,6 +184,9 @@ void GeneralSettingsPage::apply() m_scrollWheelZoomingEnabled = zoom; LocalHelpManager::setScrollWheelZoomingEnabled(m_scrollWheelZoomingEnabled); } + + const QByteArray viewerBackendId = m_ui->viewerBackend->currentData().toByteArray(); + LocalHelpManager::setViewerBackendId(viewerBackendId); } void GeneralSettingsPage::setCurrentPage() diff --git a/src/plugins/help/generalsettingspage.ui b/src/plugins/help/generalsettingspage.ui index afca6739cbd..ecfb37674a9 100644 --- a/src/plugins/help/generalsettingspage.ui +++ b/src/plugins/help/generalsettingspage.ui @@ -305,6 +305,33 @@ + + + + + + Viewer backend: + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -337,6 +364,15 @@ + + + + 255 + 0 + 0 + + + @@ -348,6 +384,15 @@ + + + + 255 + 0 + 0 + + + @@ -359,6 +404,15 @@ + + + + 255 + 0 + 0 + + + diff --git a/src/plugins/help/helpwidget.cpp b/src/plugins/help/helpwidget.cpp index bd22e41c599..f1c33e32aa4 100644 --- a/src/plugins/help/helpwidget.cpp +++ b/src/plugins/help/helpwidget.cpp @@ -300,13 +300,15 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget advancedMenu->addAction(cmd, Core::Constants::G_EDIT_FONT); } + auto openButton = new QToolButton; + openButton->setIcon(Utils::Icons::SPLIT_HORIZONTAL_TOOLBAR.icon()); + openButton->setPopupMode(QToolButton::InstantPopup); + openButton->setProperty("noArrow", true); + layout->addWidget(openButton); + auto openMenu = new QMenu(openButton); + openButton->setMenu(openMenu); + if (style != ExternalWindow) { - auto openButton = new QToolButton; - openButton->setIcon(Utils::Icons::SPLIT_HORIZONTAL_TOOLBAR.icon()); - openButton->setPopupMode(QToolButton::InstantPopup); - openButton->setProperty("noArrow", true); - layout->addWidget(openButton); - auto openMenu = new QMenu(openButton); if (m_switchToHelp) openMenu->addAction(m_switchToHelp); if (style == ModeWidget) { @@ -324,7 +326,7 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget emit closeButtonClicked(); } }); - openButton->setMenu(openMenu); + openMenu->addSeparator(); const Utils::Icon &icon = style == ModeWidget ? Utils::Icons::CLOSE_TOOLBAR : Utils::Icons::CLOSE_SPLIT_RIGHT; @@ -335,6 +337,15 @@ HelpWidget::HelpWidget(const Core::Context &context, WidgetStyle style, QWidget layout->addWidget(button); } + QAction *reload = openMenu->addAction(tr("Reload")); + connect(reload, &QAction::triggered, this, [this]() { + const int index = m_viewerStack->currentIndex(); + HelpViewer *previous = currentViewer(); + insertViewer(index, previous->source(), previous->scale()); + removeViewerAt(index + 1); + setCurrentIndex(index); + }); + if (style != ModeWidget) { addViewer({}); setCurrentIndex(0); @@ -516,9 +527,14 @@ void HelpWidget::setCurrentIndex(int index) HelpViewer *HelpWidget::addViewer(const QUrl &url, qreal zoom) { - m_model.beginInsertRows(QModelIndex(), viewerCount(), viewerCount()); + return insertViewer(m_viewerStack->count(), url, zoom); +} + +HelpViewer *HelpWidget::insertViewer(int index, const QUrl &url, qreal zoom) +{ + m_model.beginInsertRows({}, index, index); HelpViewer *viewer = HelpPlugin::createHelpViewer(zoom); - m_viewerStack->addWidget(viewer); + m_viewerStack->insertWidget(index, viewer); viewer->setFocus(Qt::OtherFocusReason); viewer->setActionVisible(HelpViewer::Action::NewPage, m_style == ModeWidget); viewer->setActionVisible(HelpViewer::Action::ExternalWindow, m_style != ExternalWindow); diff --git a/src/plugins/help/helpwidget.h b/src/plugins/help/helpwidget.h index 7c69dd3b636..69e19ae33f0 100644 --- a/src/plugins/help/helpwidget.h +++ b/src/plugins/help/helpwidget.h @@ -114,7 +114,7 @@ signals: private: int indexOf(HelpViewer *viewer) const; - + HelpViewer *insertViewer(int index, const QUrl &url, qreal zoom); void updateBackMenu(); void updateForwardMenu(); void updateWindowTitle(); diff --git a/src/plugins/help/localhelpmanager.cpp b/src/plugins/help/localhelpmanager.cpp index 2358b6a8c07..fb9609eec6e 100644 --- a/src/plugins/help/localhelpmanager.cpp +++ b/src/plugins/help/localhelpmanager.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -81,6 +82,10 @@ static const char kUseScrollWheelZooming[] = "Help/UseScrollWheelZooming"; static const char kLastShownPagesKey[] = "Help/LastShownPages"; static const char kLastShownPagesZoomKey[] = "Help/LastShownPagesZoom"; static const char kLastSelectedTabKey[] = "Help/LastSelectedTab"; +static const char kViewerBackend[] = "Help/ViewerBackend"; + +static const char kQtWebEngineBackend[] = "qtwebengine"; +static const char kTextBrowserBackend[] = "textbrowser"; static const int kDefaultFallbackFontSize = 14; @@ -287,25 +292,39 @@ void LocalHelpManager::setLastSelectedTab(int index) Core::ICore::settings()->setValue(kLastSelectedTabKey, index); } -QByteArray LocalHelpManager::defaultViewerBackend() +static Utils::optional backendForId(const QByteArray &id) +{ + const QVector factories = LocalHelpManager::viewerBackends(); + const auto backend = std::find_if(std::begin(factories), + std::end(factories), + Utils::equal(&HelpViewerFactory::id, id)); + if (backend != std::end(factories)) + return *backend; + return {}; +} + +HelpViewerFactory LocalHelpManager::defaultViewerBackend() { const QByteArray backend = qgetenv("QTC_HELPVIEWER_BACKEND"); - if (Utils::contains(viewerBackends(), Utils::equal(&HelpViewerFactory::id, backend))) - return backend; - else if (!backend.isEmpty()) + if (!backend.isEmpty()) { + const Utils::optional factory = backendForId(backend); + if (factory) + return *factory; + } + if (!backend.isEmpty()) qWarning("Help viewer backend \"%s\" not found, using default.", backend.constData()); -#ifdef QTC_WEBENGINE_HELPVIEWER - return "qtwebengine"; -#else - return "textbrowser"; -#endif + const Utils::optional factory = backendForId(kQtWebEngineBackend); + if (factory) + return *factory; + return backendForId(kTextBrowserBackend).value_or(HelpViewerFactory()); } QVector LocalHelpManager::viewerBackends() { QVector result; #ifdef QTC_WEBENGINE_HELPVIEWER - result.append({"qtwebengine", tr("QtWebEngine"), []() { return new WebEngineHelpViewer; }}); + result.append( + {kQtWebEngineBackend, tr("QtWebEngine"), []() { return new WebEngineHelpViewer; }}); #endif #ifdef QTC_LITEHTML_HELPVIEWER result.append({"litehtml", tr("litehtml"), []() { return new LiteHtmlHelpViewer; }}); @@ -313,18 +332,30 @@ QVector LocalHelpManager::viewerBackends() #ifdef QTC_MAC_NATIVE_HELPVIEWER result.append({"native", tr("WebKit"), []() { return new MacWebKitHelpViewer; }}); #endif - result.append({"textbrowser", tr("QTextBrowser"), []() { return new TextBrowserHelpViewer; }}); + result.append( + {kTextBrowserBackend, tr("QTextBrowser"), []() { return new TextBrowserHelpViewer; }}); return result; } HelpViewerFactory LocalHelpManager::viewerBackend() { - const QVector factories = viewerBackends(); - const auto backend = std::find_if(std::begin(factories), - std::end(factories), - Utils::equal(&HelpViewerFactory::id, defaultViewerBackend())); - QTC_ASSERT(backend != std::end(factories), return {}); - return *backend; + const QByteArray id = Core::ICore::settings()->value(kViewerBackend).toByteArray(); + if (!id.isEmpty()) + return backendForId(id).value_or(defaultViewerBackend()); + return defaultViewerBackend(); +} + +void LocalHelpManager::setViewerBackendId(const QByteArray &id) +{ + if (id.isEmpty()) + Core::ICore::settings()->remove(kViewerBackend); + else + Core::ICore::settings()->setValue(kViewerBackend, id); +} + +QByteArray LocalHelpManager::viewerBackendId() +{ + return Core::ICore::settings()->value(kViewerBackend).toByteArray(); } void LocalHelpManager::setupGuiHelpEngine() diff --git a/src/plugins/help/localhelpmanager.h b/src/plugins/help/localhelpmanager.h index afbcc2a4c9f..f75de12fcaf 100644 --- a/src/plugins/help/localhelpmanager.h +++ b/src/plugins/help/localhelpmanager.h @@ -26,7 +26,6 @@ #pragma once #include -#include #include #include @@ -102,9 +101,11 @@ public: static int lastSelectedTab(); static void setLastSelectedTab(int index); - static QByteArray defaultViewerBackend(); + static HelpViewerFactory defaultViewerBackend(); static QVector viewerBackends(); static HelpViewerFactory viewerBackend(); + static void setViewerBackendId(const QByteArray &id); + static QByteArray viewerBackendId(); static void setupGuiHelpEngine(); static void setEngineNeedsUpdate();