aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp33
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectmanager.h1
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp2
-rw-r--r--src/plugins/coreplugin/helpmanager.cpp6
-rw-r--r--src/plugins/coreplugin/helpmanager.h6
-rw-r--r--src/plugins/coreplugin/helpmanager_implementation.h1
-rw-r--r--src/plugins/help/helpmanager.cpp6
-rw-r--r--src/plugins/help/helpmanager.h2
-rw-r--r--src/plugins/help/localhelpmanager.cpp63
-rw-r--r--src/plugins/help/localhelpmanager.h6
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