aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Adam <[email protected]>2022-02-07 15:37:36 +0100
committerCristian Adam <[email protected]>2024-05-23 12:50:27 +0000
commit6eaa9f099a29a3e8d252fe20b534647e61f2d8b2 (patch)
treed405f58babd5c8f532346591685dcd0f35e143d5
parent44afba52549e0830c832d23426f13825adc6f20b (diff)
Help: Allow open online documentation for CMake
Qt Creator opens by default the offline documentation of CMake. But the user can click on the "Globe" to go to the online version of the documentation. Change-Id: I0b3a6bceb13784b232b539f1c04bd09aa3a11034 Reviewed-by: Eike Ziller <[email protected]>
-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