diff options
author | Eike Ziller <eike.ziller@qt.io> | 2024-04-30 13:59:03 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2024-05-06 09:46:29 +0000 |
commit | 3249b106e5eae2fcfa416c94d77aa3ffe31dc2cb (patch) | |
tree | 68a331646120f79be4ea92c8e7f79e11bfc47820 | |
parent | 6656204b1efb76abda7fe6add98bbdeaa478e1f0 (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>
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 |