diff --git a/src/plugins/help/helpplugin.cpp b/src/plugins/help/helpplugin.cpp index 37e9eba60f6..ba2e42ab7f6 100644 --- a/src/plugins/help/helpplugin.cpp +++ b/src/plugins/help/helpplugin.cpp @@ -42,19 +42,8 @@ #include "remotehelpfilter.h" #include "searchwidget.h" #include "searchtaskhandler.h" -#include "textbrowserhelpviewer.h" #include "topicchooser.h" -#ifdef QTC_LITEHTML_HELPVIEWER -#include "litehtmlhelpviewer.h" -#endif -#ifdef QTC_MAC_NATIVE_HELPVIEWER -#include "macwebkithelpviewer.h" -#endif -#ifdef QTC_WEBENGINE_HELPVIEWER -#include "webenginehelpviewer.h" -#endif - #include #include #include @@ -452,47 +441,9 @@ HelpViewer *HelpPluginPrivate::externalHelpViewer() HelpViewer *HelpPlugin::createHelpViewer(qreal zoom) { - // check for backends - using ViewerFactory = std::function; - using ViewerFactoryItem = QPair; // id -> factory - QVector factories; -#ifdef QTC_LITEHTML_HELPVIEWER - factories.append(qMakePair(QByteArray("litehtml"), [] { return new LiteHtmlHelpViewer(); })); -#endif -#ifdef QTC_WEBENGINE_HELPVIEWER - factories.append( - qMakePair(QByteArray("qtwebengine"), []() { return new WebEngineHelpViewer(); })); -#endif - factories.append( - qMakePair(QByteArray("textbrowser"), []() { return new TextBrowserHelpViewer(); })); - -#ifdef QTC_MAC_NATIVE_HELPVIEWER - // default setting -#ifdef QTC_MAC_NATIVE_HELPVIEWER_DEFAULT - factories.prepend(qMakePair(QByteArray("native"), []() { return new MacWebKitHelpViewer(); })); -#else - factories.append(qMakePair(QByteArray("native"), []() { return new MacWebKitHelpViewer(); })); -#endif -#endif - - HelpViewer *viewer = nullptr; - - // check requested backend - const QByteArray backend = qgetenv("QTC_HELPVIEWER_BACKEND"); - if (!backend.isEmpty()) { - const int pos = Utils::indexOf(factories, [backend](const ViewerFactoryItem &item) { - return backend == item.first; - }); - if (pos == -1) { - qWarning("Help viewer backend \"%s\" not found, using default.", backend.constData()); - } else { - viewer = factories.at(pos).second(); - } - } - - if (!viewer) - viewer = factories.first().second(); - QTC_ASSERT(viewer, return nullptr); + const HelpViewerFactory factory = LocalHelpManager::viewerBackend(); + QTC_ASSERT(factory.create, return nullptr); + HelpViewer *viewer = factory.create(); // initialize font viewer->setViewerFont(LocalHelpManager::fallbackFont()); diff --git a/src/plugins/help/localhelpmanager.cpp b/src/plugins/help/localhelpmanager.cpp index 828af819844..2358b6a8c07 100644 --- a/src/plugins/help/localhelpmanager.cpp +++ b/src/plugins/help/localhelpmanager.cpp @@ -29,6 +29,17 @@ #include "helpconstants.h" #include "helpmanager.h" #include "helpviewer.h" +#include "textbrowserhelpviewer.h" + +#ifdef QTC_WEBENGINE_HELPVIEWER +#include "webenginehelpviewer.h" +#endif +#ifdef QTC_LITEHTML_HELPVIEWER +#include "litehtmlhelpviewer.h" +#endif +#ifdef QTC_MAC_NATIVE_HELPVIEWER +#include "macwebkithelpviewer.h" +#endif #include #include @@ -276,6 +287,46 @@ void LocalHelpManager::setLastSelectedTab(int index) Core::ICore::settings()->setValue(kLastSelectedTabKey, index); } +QByteArray LocalHelpManager::defaultViewerBackend() +{ + const QByteArray backend = qgetenv("QTC_HELPVIEWER_BACKEND"); + if (Utils::contains(viewerBackends(), Utils::equal(&HelpViewerFactory::id, backend))) + return backend; + else if (!backend.isEmpty()) + qWarning("Help viewer backend \"%s\" not found, using default.", backend.constData()); +#ifdef QTC_WEBENGINE_HELPVIEWER + return "qtwebengine"; +#else + return "textbrowser"; +#endif +} + +QVector LocalHelpManager::viewerBackends() +{ + QVector result; +#ifdef QTC_WEBENGINE_HELPVIEWER + result.append({"qtwebengine", tr("QtWebEngine"), []() { return new WebEngineHelpViewer; }}); +#endif +#ifdef QTC_LITEHTML_HELPVIEWER + result.append({"litehtml", tr("litehtml"), []() { return new LiteHtmlHelpViewer; }}); +#endif +#ifdef QTC_MAC_NATIVE_HELPVIEWER + result.append({"native", tr("WebKit"), []() { return new MacWebKitHelpViewer; }}); +#endif + result.append({"textbrowser", 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; +} + void LocalHelpManager::setupGuiHelpEngine() { if (m_needsCollectionFile) { diff --git a/src/plugins/help/localhelpmanager.h b/src/plugins/help/localhelpmanager.h index 8e4e8ce0036..afbcc2a4c9f 100644 --- a/src/plugins/help/localhelpmanager.h +++ b/src/plugins/help/localhelpmanager.h @@ -26,6 +26,7 @@ #pragma once #include +#include #include #include @@ -33,6 +34,8 @@ #include #include +#include + QT_FORWARD_DECLARE_CLASS(QHelpEngine) class BookmarkManager; @@ -40,6 +43,15 @@ class BookmarkManager; namespace Help { namespace Internal { +class HelpViewer; + +struct HelpViewerFactory +{ + QByteArray id; + QString displayName; + std::function create; +}; + class LocalHelpManager : public QObject { Q_OBJECT @@ -90,6 +102,10 @@ public: static int lastSelectedTab(); static void setLastSelectedTab(int index); + static QByteArray defaultViewerBackend(); + static QVector viewerBackends(); + static HelpViewerFactory viewerBackend(); + static void setupGuiHelpEngine(); static void setEngineNeedsUpdate();