diff options
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp | 33 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakeprojectmanager.h | 1 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/helpmanager.cpp | 6 | ||||
-rw-r--r-- | src/plugins/coreplugin/helpmanager.h | 6 | ||||
-rw-r--r-- | src/plugins/coreplugin/helpmanager_implementation.h | 1 | ||||
-rw-r--r-- | src/plugins/help/helpmanager.cpp | 6 | ||||
-rw-r--r-- | src/plugins/help/helpmanager.h | 2 | ||||
-rw-r--r-- | src/plugins/help/localhelpmanager.cpp | 63 | ||||
-rw-r--r-- | src/plugins/help/localhelpmanager.h | 6 |
10 files changed, 107 insertions, 19 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index 9730c957fbf..7a80db87dd7 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -18,6 +18,7 @@ #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/ieditor.h> #include <coreplugin/icore.h> +#include <coreplugin/helpmanager.h> #include <coreplugin/messagemanager.h> #include <coreplugin/modemanager.h> @@ -41,6 +42,7 @@ #include <utils/checkablemessagebox.h> #include <utils/utilsicons.h> +#include <QDesktopServices> #include <QMessageBox> using namespace Core; @@ -55,6 +57,9 @@ class CMakeManager final : public QObject public: CMakeManager(); + static bool isCMakeUrl(const QUrl &url); + static void openCMakeUrl(const QUrl &url); + private: void updateCmakeActions(Node *node); void clearCMakeCache(BuildSystem *buildSystem); @@ -80,6 +85,29 @@ private: bool m_canDebugCMake = false; }; +bool CMakeManager::isCMakeUrl(const QUrl &url) +{ + const QString address = url.toString(); + return address.startsWith("qthelp://org.cmake."); +} + +void CMakeManager::openCMakeUrl(const QUrl &url) +{ + QString urlPrefix = "https://cmake.org/cmake/help/"; + + QRegularExpression version("^.*\\.([0-9])\\.([0-9]+)\\.[0-9]+$"); + auto match = version.match(url.authority()); + if (match.hasMatch()) + urlPrefix.append(QString("v%1.%2").arg(match.captured(1)).arg(match.captured(2))); + else + urlPrefix.append("latest"); + + const QString address = url.toString(); + const QString doc("/doc"); + QDesktopServices::openUrl( + QUrl(urlPrefix + address.mid(address.lastIndexOf(doc) + doc.length()))); +} + CMakeManager::CMakeManager() { namespace PEC = ProjectExplorer::Constants; @@ -458,4 +486,9 @@ void setupCMakeManager() static CMakeManager theCMakeManager; } +void setupOnlineHelpManager() +{ + Core::HelpManager::addOnlineHelpHandler({CMakeManager::isCMakeUrl, CMakeManager::openCMakeUrl}); +} + } // CMakeProjectManager::Internal diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h index ba3a025f130..42e6a1c4e31 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h @@ -6,5 +6,6 @@ namespace CMakeProjectManager::Internal { void setupCMakeManager(); +void setupOnlineHelpManager(); } // CMakeProjectManager::Internal diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp index 9c2a23dc061..f91c1438d24 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp @@ -105,6 +105,8 @@ class CMakeProjectPlugin final : public ExtensionSystem::IPlugin { // Delay the restoration to allow the devices to load first. QTimer::singleShot(0, this, [] { CMakeToolManager::restoreCMakeTools(); }); + + setupOnlineHelpManager(); } void updateContextActions(ProjectExplorer::Node *node) diff --git a/src/plugins/coreplugin/helpmanager.cpp b/src/plugins/coreplugin/helpmanager.cpp index 01fc7eff478..9f694c28025 100644 --- a/src/plugins/coreplugin/helpmanager.cpp +++ b/src/plugins/coreplugin/helpmanager.cpp @@ -103,5 +103,11 @@ void setBlockedDocumentation(const QStringList &fileNames) m_instance->setBlockedDocumentation(fileNames); } +void addOnlineHelpHandler(const OnlineHelpHandler &handler) +{ + if (checkInstance()) + m_instance->addOnlineHelpHandler(handler); +} + } // HelpManager } // Core diff --git a/src/plugins/coreplugin/helpmanager.h b/src/plugins/coreplugin/helpmanager.h index 55d449e696b..2d24116d234 100644 --- a/src/plugins/coreplugin/helpmanager.h +++ b/src/plugins/coreplugin/helpmanager.h @@ -48,5 +48,11 @@ CORE_EXPORT QByteArray fileData(const QUrl &url); CORE_EXPORT void showHelpUrl(const QUrl &url, HelpViewerLocation location = HelpModeAlways); CORE_EXPORT void showHelpUrl(const QString &url, HelpViewerLocation location = HelpModeAlways); +struct CORE_EXPORT OnlineHelpHandler { + std::function<bool(QUrl)> handlesUrl; + std::function<void(QUrl)> openUrl; +}; +CORE_EXPORT void addOnlineHelpHandler(const OnlineHelpHandler &handler); + } // HelpManager } // Core diff --git a/src/plugins/coreplugin/helpmanager_implementation.h b/src/plugins/coreplugin/helpmanager_implementation.h index 798a5a340ed..d3b097f1f82 100644 --- a/src/plugins/coreplugin/helpmanager_implementation.h +++ b/src/plugins/coreplugin/helpmanager_implementation.h @@ -23,6 +23,7 @@ public: virtual QMultiMap<QString, QUrl> linksForKeyword(const QString &keyword) = 0; virtual QByteArray fileData(const QUrl &url) = 0; virtual void showHelpUrl(const QUrl &url, HelpViewerLocation location = HelpModeAlways) = 0; + virtual void addOnlineHelpHandler(const OnlineHelpHandler &handler) = 0; }; } // HelpManager diff --git a/src/plugins/help/helpmanager.cpp b/src/plugins/help/helpmanager.cpp index 1c87253fc73..eee8f8fcd47 100644 --- a/src/plugins/help/helpmanager.cpp +++ b/src/plugins/help/helpmanager.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "helpmanager.h" +#include "localhelpmanager.h" #include "helptr.h" @@ -282,6 +283,11 @@ void HelpManager::showHelpUrl(const QUrl &url, Core::HelpManager::HelpViewerLoca emit m_instance->helpRequested(url, location); } +void HelpManager::addOnlineHelpHandler(const Core::HelpManager::OnlineHelpHandler &handler) +{ + LocalHelpManager::addOnlineHelpHandler(handler); +} + QStringList HelpManager::registeredNamespaces() { QTC_ASSERT(!d->m_needsSetup, return {}); diff --git a/src/plugins/help/helpmanager.h b/src/plugins/help/helpmanager.h index 5f0efe56200..8842586315f 100644 --- a/src/plugins/help/helpmanager.h +++ b/src/plugins/help/helpmanager.h @@ -57,6 +57,8 @@ public: const QUrl &url, Core::HelpManager::HelpViewerLocation location = Core::HelpManager::HelpModeAlways) override; + void addOnlineHelpHandler(const Core::HelpManager::OnlineHelpHandler &handler) override; + static void setupHelpManager(); signals: diff --git a/src/plugins/help/localhelpmanager.cpp b/src/plugins/help/localhelpmanager.cpp index 4bca01bf79c..5b6dd115983 100644 --- a/src/plugins/help/localhelpmanager.cpp +++ b/src/plugins/help/localhelpmanager.cpp @@ -53,6 +53,8 @@ QHelpEngine* LocalHelpManager::m_guiEngine = nullptr; QMutex LocalHelpManager::m_bkmarkMutex; BookmarkManager* LocalHelpManager::m_bookmarkManager = nullptr; +QList<Core::HelpManager::OnlineHelpHandler> LocalHelpManager::m_onlineHelpHandlerList; + const char kHelpHomePageKey[] = "Help/HomePage"; const char kFontFamilyKey[] = "Help/FallbackFontFamily"; const char kFontStyleNameKey[] = "Help/FallbackFontStyleName"; @@ -96,6 +98,8 @@ LocalHelpManager::LocalHelpManager(QObject *parent) { m_instance = this; qRegisterMetaType<Help::Internal::LocalHelpManager::HelpData>("Help::Internal::LocalHelpManager::HelpData"); + + addOnlineHelpHandler({LocalHelpManager::isQtUrl, LocalHelpManager::openQtUrl}); } LocalHelpManager::~LocalHelpManager() @@ -508,43 +512,64 @@ QHelpFilterEngine *LocalHelpManager::filterEngine() bool LocalHelpManager::canOpenOnlineHelp(const QUrl &url) { + return Utils::anyOf( + m_onlineHelpHandlerList, [url](const Core::HelpManager::OnlineHelpHandler &handler) { + return handler.handlesUrl(url); + }); +} + +bool LocalHelpManager::isQtUrl(const QUrl &url) +{ const QString address = url.toString(); return address.startsWith("qthelp://org.qt-project.") || address.startsWith("qthelp://com.nokia.") || address.startsWith("qthelp://com.trolltech."); } -bool LocalHelpManager::openOnlineHelp(const QUrl &url) +void LocalHelpManager::openQtUrl(const QUrl &url) { static const QString unversionedLocalDomainName = QString("org.qt-project.%1").arg(Utils::appInfo().id); - if (canOpenOnlineHelp(url)) { - QString urlPrefix = "http://doc.qt.io/"; - if (url.authority().startsWith(unversionedLocalDomainName)) { - urlPrefix.append(Utils::appInfo().id); + QString urlPrefix = "http://doc.qt.io/"; + if (url.authority().startsWith(unversionedLocalDomainName)) { + urlPrefix.append(Utils::appInfo().id); + } else { + const auto host = url.host(); + const auto dot = host.lastIndexOf('.'); + if (dot < 0) { + urlPrefix.append("qt-5"); } else { - const auto host = url.host(); - const auto dot = host.lastIndexOf('.'); - if (dot < 0) { - urlPrefix.append("qt-5"); + const auto version = host.mid(dot + 1); + if (version.startsWith('6')) { + urlPrefix.append("qt-6"); } else { - const auto version = host.mid(dot + 1); - if (version.startsWith('6')) { - urlPrefix.append("qt-6"); - } else { - urlPrefix.append("qt-5"); - } + urlPrefix.append("qt-5"); } } - const QString address = url.toString(); - QDesktopServices::openUrl(QUrl(urlPrefix + address.mid(address.lastIndexOf(QLatin1Char('/'))))); - return true; } - return false; + const QString address = url.toString(); + QDesktopServices::openUrl(QUrl(urlPrefix + address.mid(address.lastIndexOf(QLatin1Char('/'))))); +} + +bool LocalHelpManager::openOnlineHelp(const QUrl &url) +{ + return Utils::anyOf( + m_onlineHelpHandlerList, [url](const Core::HelpManager::OnlineHelpHandler &handler) { + if (handler.handlesUrl(url)) { + handler.openUrl(url); + return true; + } + return false; + }); } QMultiMap<QString, QUrl> LocalHelpManager::linksForKeyword(const QString &keyword) { return HelpManager::linksForKeyword(&LocalHelpManager::helpEngine(), keyword, std::nullopt); } + +void LocalHelpManager::addOnlineHelpHandler(const Core::HelpManager::OnlineHelpHandler &handler) +{ + LocalHelpManager::m_onlineHelpHandlerList.push_back(handler); +} diff --git a/src/plugins/help/localhelpmanager.h b/src/plugins/help/localhelpmanager.h index 5195e7f1b70..13a30555c12 100644 --- a/src/plugins/help/localhelpmanager.h +++ b/src/plugins/help/localhelpmanager.h @@ -101,9 +101,13 @@ public: static bool canOpenOnlineHelp(const QUrl &url); static bool openOnlineHelp(const QUrl &url); + static bool isQtUrl(const QUrl &url); + static void openQtUrl(const QUrl &url); static QMultiMap<QString, QUrl> linksForKeyword(const QString &keyword); + static void addOnlineHelpHandler(const Core::HelpManager::OnlineHelpHandler &handler); + signals: void fallbackFontChanged(const QFont &font); void fontZoomChanged(int percentage); @@ -121,6 +125,8 @@ private: static QMutex m_bkmarkMutex; static BookmarkManager *m_bookmarkManager; + + static QList<Core::HelpManager::OnlineHelpHandler> m_onlineHelpHandlerList; }; } // Internal |