aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2024-04-30 13:59:03 +0200
committerEike Ziller <eike.ziller@qt.io>2024-05-06 09:46:29 +0000
commit3249b106e5eae2fcfa416c94d77aa3ffe31dc2cb (patch)
tree68a331646120f79be4ea92c8e7f79e11bfc47820
parent6656204b1efb76abda7fe6add98bbdeaa478e1f0 (diff)
Make it possible to add wizards paths via plugin meta data
That makes it easy with Lua plugins, and is useful on the C++ side as well. Change-Id: I660956bed47e4c1e27a001ad8999d6701cda86ee Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io> Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
-rw-r--r--doc/qtcreatordev/src/plugin-metadata.qdoc21
-rw-r--r--src/plugins/compilerexplorer/CompilerExplorer.json.in3
-rw-r--r--src/plugins/compilerexplorer/compilerexplorerplugin.cpp2
-rw-r--r--src/plugins/coreplugin/iwizardfactory.cpp11
-rw-r--r--src/plugins/fossil/Fossil.json.in4
-rw-r--r--src/plugins/fossil/constants.h3
-rw-r--r--src/plugins/fossil/fossilplugin.cpp1
-rw-r--r--src/plugins/haskell/Haskell.json.in3
-rw-r--r--src/plugins/haskell/haskellplugin.cpp2
-rw-r--r--src/plugins/lua/meta/qtc.lua2
-rw-r--r--src/plugins/mcusupport/McuSupport.json.in4
-rw-r--r--src/plugins/mcusupport/mcusupportplugin.cpp1
-rw-r--r--src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp28
-rw-r--r--src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h1
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp5
-rw-r--r--src/plugins/saferenderer/SafeRenderer.json.in4
-rw-r--r--src/plugins/saferenderer/saferenderer.cpp3
-rw-r--r--src/plugins/squish/Squish.json.in3
-rw-r--r--src/plugins/squish/squishplugin.cpp2
-rw-r--r--src/plugins/vcpkg/Vcpkg.json.in3
-rw-r--r--src/plugins/vcpkg/vcpkgplugin.cpp2
21 files changed, 76 insertions, 32 deletions
diff --git a/doc/qtcreatordev/src/plugin-metadata.qdoc b/doc/qtcreatordev/src/plugin-metadata.qdoc
index b233ef60bc..20d4073fd1 100644
--- a/doc/qtcreatordev/src/plugin-metadata.qdoc
+++ b/doc/qtcreatordev/src/plugin-metadata.qdoc
@@ -323,6 +323,27 @@
}
\endcode
+ \section2 Other Meta Data
+
+ \table
+ \header
+ \li Key
+ \li Value Type
+ \li Meaning
+ \row
+ \li Mimetypes
+ \li String or array of strings
+ \li Possibly multiple lines of
+ \l{https://www.freedesktop.org/wiki/Specifications/shared-mime-info-spec/}{XML MIME-info}
+ used for registering additional or adapting built-in MIME types.
+ \row
+ \li JsonWizardPaths
+ \li Array of strings
+ \li A list of paths relative to the plugin location or paths to the
+ \l{The Qt Resource System}{Qt resource system} that are searched for
+ \l{http://doc.qt.io/qtcreator/creator-project-wizards.html}{template-based wizards}.
+ \endtable
+
\section2 A Note on Plugin Versions
Plugin versions are in the form \c{x.y.z_n} where, \c x, \c y, \c z and \c n are
diff --git a/src/plugins/compilerexplorer/CompilerExplorer.json.in b/src/plugins/compilerexplorer/CompilerExplorer.json.in
index 108bd6a5df..db771bd9f9 100644
--- a/src/plugins/compilerexplorer/CompilerExplorer.json.in
+++ b/src/plugins/compilerexplorer/CompilerExplorer.json.in
@@ -26,5 +26,6 @@
" <glob pattern='*.qtce'/>",
" </mime-type>",
"</mime-info>"
- ]
+ ],
+ "JsonWizardPaths" : [":/compilerexplorer/wizard/"]
}
diff --git a/src/plugins/compilerexplorer/compilerexplorerplugin.cpp b/src/plugins/compilerexplorer/compilerexplorerplugin.cpp
index 1cfcec89d8..48920561b4 100644
--- a/src/plugins/compilerexplorer/compilerexplorerplugin.cpp
+++ b/src/plugins/compilerexplorer/compilerexplorerplugin.cpp
@@ -37,8 +37,6 @@ public:
FileIconProvider::registerIconForMimeType(QIcon(":/compilerexplorer/logos/ce.ico"),
"application/compiler-explorer");
- ProjectExplorer::JsonWizardFactory::addWizardPath(":/compilerexplorer/wizard/");
-
const Id menuId = "Tools.CompilerExplorer";
MenuBuilder(menuId)
.setTitle(Tr::tr("Compiler Explorer"))
diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp
index 09e551b215..dc7a6da3e5 100644
--- a/src/plugins/coreplugin/iwizardfactory.cpp
+++ b/src/plugins/coreplugin/iwizardfactory.cpp
@@ -127,6 +127,7 @@ QAction *s_inspectWizardAction = nullptr;
bool s_areFactoriesLoaded = false;
bool s_isWizardRunning = false;
QWidget *s_currentWizard = nullptr;
+static QSet<Id> s_plugins;
// NewItemDialog reopening data:
class NewItemDialogData
@@ -385,8 +386,7 @@ void IWizardFactory::destroyFeatureProvider()
void IWizardFactory::clearWizardFactories()
{
- if (!s_areFactoriesLoaded)
- return;
+ s_plugins.clear();
for (IWizardFactory *factory : std::as_const(s_allFactories))
ActionManager::unregisterAction(factory->m_action, actionId(factory));
@@ -399,16 +399,15 @@ void IWizardFactory::clearWizardFactories()
QSet<Id> IWizardFactory::pluginFeatures()
{
- static QSet<Id> plugins;
- if (plugins.isEmpty()) {
+ if (s_plugins.isEmpty()) {
// Implicitly create a feature for each plugin loaded:
const QVector<ExtensionSystem::PluginSpec *> pluginVector = ExtensionSystem::PluginManager::plugins();
for (const ExtensionSystem::PluginSpec *s : pluginVector) {
if (s->state() == ExtensionSystem::PluginSpec::Running)
- plugins.insert(Id::fromString(s->name()));
+ s_plugins.insert(Id::fromString(s->name()));
}
}
- return plugins;
+ return s_plugins;
}
QSet<Id> IWizardFactory::availableFeatures(Id platformId)
diff --git a/src/plugins/fossil/Fossil.json.in b/src/plugins/fossil/Fossil.json.in
index 61204143ba..d83238ccca 100644
--- a/src/plugins/fossil/Fossil.json.in
+++ b/src/plugins/fossil/Fossil.json.in
@@ -16,5 +16,7 @@
"Category" : "Version Control",
"Description" : "Fossil SCM integration.",
"Url" : "http://www.qt.io",
- ${IDE_PLUGIN_DEPENDENCIES}
+ ${IDE_PLUGIN_DEPENDENCIES},
+
+ "JsonWizardPaths" : [":/fossil/wizard"]
}
diff --git a/src/plugins/fossil/constants.h b/src/plugins/fossil/constants.h
index 558c8fc3ed..fe0fcca2f3 100644
--- a/src/plugins/fossil/constants.h
+++ b/src/plugins/fossil/constants.h
@@ -75,7 +75,4 @@ const char FSTATUS_UPDATED_BY_INTEGRATE[] = "Updated by Integrate";
const char FSTATUS_RENAMED[] = "Renamed";
const char FSTATUS_UNKNOWN[] = "Unknown";
-// Fossil Json Wizards
-const char WIZARD_PATH[] = ":/fossil/wizard";
-
} // Fossil::Constants
diff --git a/src/plugins/fossil/fossilplugin.cpp b/src/plugins/fossil/fossilplugin.cpp
index ff6fa0fa3f..d627d13fda 100644
--- a/src/plugins/fossil/fossilplugin.cpp
+++ b/src/plugins/fossil/fossilplugin.cpp
@@ -217,7 +217,6 @@ FossilPluginPrivate::FossilPluginPrivate()
m_commandLocator = new CommandLocator("Fossil", "fossil", "fossil", this);
m_commandLocator->setDescription(Tr::tr("Triggers a Fossil version control operation."));
- ProjectExplorer::JsonWizardFactory::addWizardPath(FilePath::fromString(Constants::WIZARD_PATH));
JsExpander::registerGlobalObject("Fossil", [] { return new FossilJsExtension; });
connect(&settings(), &AspectContainer::changed,
diff --git a/src/plugins/haskell/Haskell.json.in b/src/plugins/haskell/Haskell.json.in
index 9cdb34694a..7f99cdf3fe 100644
--- a/src/plugins/haskell/Haskell.json.in
+++ b/src/plugins/haskell/Haskell.json.in
@@ -19,5 +19,6 @@
" <glob pattern='*.cabal'/>",
" </mime-type>",
"</mime-info>"
- ]
+ ],
+ "JsonWizardPaths" : [ ":/haskell/share/wizards/" ]
}
diff --git a/src/plugins/haskell/haskellplugin.cpp b/src/plugins/haskell/haskellplugin.cpp
index f8c32dc288..1041bf4695 100644
--- a/src/plugins/haskell/haskellplugin.cpp
+++ b/src/plugins/haskell/haskellplugin.cpp
@@ -39,8 +39,6 @@ public:
Tr::tr("Haskell", "SnippetProvider"));
setupHaskellActions(this);
-
- ProjectExplorer::JsonWizardFactory::addWizardPath(":/haskell/share/wizards/");
}
};
diff --git a/src/plugins/lua/meta/qtc.lua b/src/plugins/lua/meta/qtc.lua
index 8d9d858d50..bfcfd457eb 100644
--- a/src/plugins/lua/meta/qtc.lua
+++ b/src/plugins/lua/meta/qtc.lua
@@ -21,6 +21,8 @@ Qtc = {}
---@field DisabledByDefault? boolean Whether the plugin is disabled by default or not. ( Default: true )
---@field setup function The setup function of the plugin.
---@field hooks? Hooks The hooks of the plugin.
+---@field Mimetypes? string XML MIME-info for registering additional or adapting built-in MIME types.
+---@field JsonWizardPaths? string[] A list of paths relative to the plugin location or paths to the Qt resource system that are searched for template-based wizards.
QtcPlugin = {}
---@class QtcPluginDependency
diff --git a/src/plugins/mcusupport/McuSupport.json.in b/src/plugins/mcusupport/McuSupport.json.in
index 94586c932e..bac0409ee7 100644
--- a/src/plugins/mcusupport/McuSupport.json.in
+++ b/src/plugins/mcusupport/McuSupport.json.in
@@ -16,5 +16,7 @@
"Category" : "Device Support",
"Description" : "Helper for MCU related projects.",
"Url" : "http://www.qt.io",
- ${IDE_PLUGIN_DEPENDENCIES}
+ ${IDE_PLUGIN_DEPENDENCIES},
+
+ "JsonWizardPaths" : [":/mcusupport/wizards/"]
}
diff --git a/src/plugins/mcusupport/mcusupportplugin.cpp b/src/plugins/mcusupport/mcusupportplugin.cpp
index d9a4aeeeb5..938dcb233a 100644
--- a/src/plugins/mcusupport/mcusupportplugin.cpp
+++ b/src/plugins/mcusupport/mcusupportplugin.cpp
@@ -262,7 +262,6 @@ void McuSupportPlugin::initialize()
dd->m_options.registerQchFiles();
dd->m_options.registerExamples();
- ProjectExplorer::JsonWizardFactory::addWizardPath(":/mcusupport/wizards/");
#if defined(WITH_TESTS) && defined(GOOGLE_TEST_IS_FOUND)
addTest<Test::McuSupportTest>();
diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp
index be3288149d..e84ef955b8 100644
--- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp
+++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp
@@ -16,6 +16,7 @@
#include <coreplugin/messagemanager.h>
#include <extensionsystem/pluginmanager.h>
+#include <extensionsystem/pluginspec.h>
#include <utils/algorithm.h>
#include <utils/environment.h>
@@ -28,6 +29,7 @@
#include <QDebug>
#include <QDir>
#include <QJSEngine>
+#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
@@ -35,6 +37,7 @@
#include <QUuid>
using namespace Utils;
+using namespace ExtensionSystem;
namespace ProjectExplorer {
@@ -564,12 +567,13 @@ static QStringList environmentTemplatesPaths()
return paths;
}
+static bool s_searchPathsInitialized = false;
+
FilePaths &JsonWizardFactory::searchPaths()
{
static FilePaths m_searchPaths;
- static bool searchPathsInitialized = false;
- if (!searchPathsInitialized) {
- searchPathsInitialized = true;
+ if (!s_searchPathsInitialized) {
+ s_searchPathsInitialized = true;
m_searchPaths = {Core::ICore::userResourcePath(WIZARD_PATH),
Core::ICore::resourcePath(WIZARD_PATH)};
for (const QString &environmentTemplateDirName : environmentTemplatesPaths())
@@ -577,11 +581,29 @@ FilePaths &JsonWizardFactory::searchPaths()
m_searchPaths << Utils::transform(
Core::ICore::settings()->value("Wizards/SearchPaths").toStringList(),
[](const QString &s) { return FilePath::fromUserInput(s); });
+ // add paths from enabled plugin meta data
+ for (PluginSpec *plugin : PluginManager::plugins()) {
+ if (plugin->state() == PluginSpec::Running) {
+ const auto base = FilePath::fromString(plugin->filePath()).parentDir();
+ const auto values = plugin->metaData().value("JsonWizardPaths").toArray();
+ for (const QJsonValue &v : values) {
+ const auto path = FilePath::fromString(v.toString());
+ if (!path.isEmpty() && !path.needsDevice()) {
+ m_searchPaths << base.resolvePath(path);
+ }
+ }
+ }
+ }
}
return m_searchPaths;
}
+void JsonWizardFactory::resetSearchPaths()
+{
+ s_searchPathsInitialized = false;
+}
+
void JsonWizardFactory::addWizardPath(const FilePath &path)
{
searchPaths().append(path);
diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h
index 412787827f..1ab133d5bd 100644
--- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h
+++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h
@@ -69,6 +69,7 @@ private:
const Utils::FilePath &baseDir,
QString *errorMessage);
static Utils::FilePaths &searchPaths();
+ static void resetSearchPaths();
static void setVerbose(int level);
static int verbose();
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 385c38405a..7ec216c138 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -827,6 +827,11 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
setupJsonWizardPages();
setupJsonWizardFileGenerator();
setupJsonWizardScannerGenerator();
+ // new plugins might add new paths via the plugin spec
+ connect(
+ PluginManager::instance(),
+ &PluginManager::pluginsChanged,
+ &JsonWizardFactory::resetSearchPaths);
dd->extendFolderNavigationWidgetFactory();
diff --git a/src/plugins/saferenderer/SafeRenderer.json.in b/src/plugins/saferenderer/SafeRenderer.json.in
index ae60bb3f02..0f569e539c 100644
--- a/src/plugins/saferenderer/SafeRenderer.json.in
+++ b/src/plugins/saferenderer/SafeRenderer.json.in
@@ -16,5 +16,7 @@
"Category" : "Device Support",
"Description" : "Helper plugin for Qt Safe Renderer projects.",
"Url" : "https://www.qt.io",
- ${IDE_PLUGIN_DEPENDENCIES}
+ ${IDE_PLUGIN_DEPENDENCIES},
+
+ "JsonWizardPaths" : [":/saferenderer/wizards/"]
}
diff --git a/src/plugins/saferenderer/saferenderer.cpp b/src/plugins/saferenderer/saferenderer.cpp
index 115b7c8728..d87ba118e1 100644
--- a/src/plugins/saferenderer/saferenderer.cpp
+++ b/src/plugins/saferenderer/saferenderer.cpp
@@ -20,9 +20,6 @@ bool SafeRendererPlugin::initialize(const QStringList &arguments, QString *error
Q_UNUSED(arguments)
Q_UNUSED(errorString)
- // Add Qt Creator project wizard path
- ProjectExplorer::JsonWizardFactory::addWizardPath(":/saferenderer/wizards/");
-
return true;
}
diff --git a/src/plugins/squish/Squish.json.in b/src/plugins/squish/Squish.json.in
index 64e4397aeb..faa56b6837 100644
--- a/src/plugins/squish/Squish.json.in
+++ b/src/plugins/squish/Squish.json.in
@@ -26,5 +26,6 @@ ${IDE_PLUGIN_DEPENDENCIES},
" <glob pattern='objects.map'/>",
" </mime-type>",
"</mime-info>"
-]
+],
+"JsonWizardPaths" : [":/squish/wizard/"]
}
diff --git a/src/plugins/squish/squishplugin.cpp b/src/plugins/squish/squishplugin.cpp
index 6608625c0b..4cc72fde73 100644
--- a/src/plugins/squish/squishplugin.cpp
+++ b/src/plugins/squish/squishplugin.cpp
@@ -68,8 +68,6 @@ private:
SquishServerSettingsDialog dialog;
dialog.exec();
});
-
- ProjectExplorer::JsonWizardFactory::addWizardPath(":/squish/wizard/");
}
bool initializeGlobalScripts()
diff --git a/src/plugins/vcpkg/Vcpkg.json.in b/src/plugins/vcpkg/Vcpkg.json.in
index 09fcaf06a7..a24d835d91 100644
--- a/src/plugins/vcpkg/Vcpkg.json.in
+++ b/src/plugins/vcpkg/Vcpkg.json.in
@@ -27,5 +27,6 @@
" <glob pattern='vcpkg.json' weight='71'/>",
" </mime-type>",
"</mime-info>"
- ]
+ ],
+ "JsonWizardPaths" : [":/vcpkg/wizards/"]
}
diff --git a/src/plugins/vcpkg/vcpkgplugin.cpp b/src/plugins/vcpkg/vcpkgplugin.cpp
index cc3abc097d..a849802653 100644
--- a/src/plugins/vcpkg/vcpkgplugin.cpp
+++ b/src/plugins/vcpkg/vcpkgplugin.cpp
@@ -21,8 +21,6 @@ class VcpkgPlugin final : public ExtensionSystem::IPlugin
public:
void initialize() final
{
- ProjectExplorer::JsonWizardFactory::addWizardPath(":/vcpkg/wizards/");
-
setupVcpkgManifestEditor();
#ifdef WITH_TESTS