From b60fd77fc128133f408d67beda814c55e8364d3e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 16 Nov 2023 14:53:44 +0100 Subject: [PATCH] Fix clearing the list of wizard factories Clearing the list of wizard factories did not result in updating the available JSON wizards. The JSON wizard paths were scanned only once at startup. Instead partially revert back to before 1cf6b031cfdf7344eb2ce6a403aa1029b7b8f75e and let the JSON "factory creator" parse the directories and return a list of wizard factories. Change-Id: Ifc253479973be801c5323588800bb264610187b6 Reviewed-by: Alessandro Portale Reviewed-by: --- src/plugins/coreplugin/iwizardfactory.cpp | 55 +++++++++++-------- src/plugins/coreplugin/iwizardfactory.h | 3 +- src/plugins/designer/formeditorplugin.cpp | 2 +- .../jsonwizard/jsonwizardfactory.cpp | 18 ++++-- .../jsonwizard/jsonwizardfactory.h | 2 +- .../projectexplorer/projectexplorer.cpp | 3 +- 6 files changed, 50 insertions(+), 33 deletions(-) diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp index 1851de352ea..d3c30057f08 100644 --- a/src/plugins/coreplugin/iwizardfactory.cpp +++ b/src/plugins/coreplugin/iwizardfactory.cpp @@ -186,33 +186,35 @@ QList IWizardFactory::allWizardFactories() QHash sanityCheck; for (const FactoryCreator &fc : std::as_const(s_factoryCreators)) { - IWizardFactory *newFactory = fc(); - // skip factories referencing wizard page generators provided by plugins not loaded - if (!newFactory) - continue; - IWizardFactory *existingFactory = sanityCheck.value(newFactory->id()); + for (IWizardFactory *newFactory : fc()) { + if (!newFactory) // should not happen, but maybe something went wrong + continue; + IWizardFactory *existingFactory = sanityCheck.value(newFactory->id()); - QTC_ASSERT(existingFactory != newFactory, continue); - if (existingFactory) { - qWarning("%s", qPrintable(Tr::tr("Factory with id=\"%1\" already registered. Deleting.") - .arg(existingFactory->id().toString()))); - delete newFactory; - continue; - } - - QTC_ASSERT(!newFactory->m_action, continue); - newFactory->m_action = new QAction(newFactory->displayName(), newFactory); - ActionManager::registerAction(newFactory->m_action, actionId(newFactory)); - - connect(newFactory->m_action, &QAction::triggered, newFactory, [newFactory] { - if (!ICore::isNewItemDialogRunning()) { - FilePath path = newFactory->runPath({}); - newFactory->runWizard(path, ICore::dialogParent(), Id(), QVariantMap()); + QTC_ASSERT(existingFactory != newFactory, continue); + if (existingFactory) { + qWarning("%s", + qPrintable( + Tr::tr("Factory with id=\"%1\" already registered. Deleting.") + .arg(existingFactory->id().toString()))); + delete newFactory; + continue; } - }); - sanityCheck.insert(newFactory->id(), newFactory); - s_allFactories << newFactory; + QTC_ASSERT(!newFactory->m_action, continue); + newFactory->m_action = new QAction(newFactory->displayName(), newFactory); + ActionManager::registerAction(newFactory->m_action, actionId(newFactory)); + + connect(newFactory->m_action, &QAction::triggered, newFactory, [newFactory] { + if (!ICore::isNewItemDialogRunning()) { + FilePath path = newFactory->runPath({}); + newFactory->runWizard(path, ICore::dialogParent(), Id(), QVariantMap()); + } + }); + + sanityCheck.insert(newFactory->id(), newFactory); + s_allFactories << newFactory; + } } } @@ -322,6 +324,11 @@ void IWizardFactory::registerFactoryCreator(const IWizardFactory::FactoryCreator s_factoryCreators << creator; } +void IWizardFactory::registerFactoryCreator(const std::function &creator) +{ + s_factoryCreators << [creator] { return QList({creator()}); }; +} + QSet IWizardFactory::allAvailablePlatforms() { QSet platforms; diff --git a/src/plugins/coreplugin/iwizardfactory.h b/src/plugins/coreplugin/iwizardfactory.h index e9771f7aa1d..97b47ac3d3a 100644 --- a/src/plugins/coreplugin/iwizardfactory.h +++ b/src/plugins/coreplugin/iwizardfactory.h @@ -77,8 +77,9 @@ public: virtual bool isAvailable(Utils::Id platformId) const; QSet supportedPlatforms() const; - using FactoryCreator = std::function; + using FactoryCreator = std::function()>; static void registerFactoryCreator(const FactoryCreator &creator); + static void registerFactoryCreator(const std::function &creator); // Utility to find all registered wizards static QList allWizardFactories(); diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp index 0f9c77b0b44..afbca7010bd 100644 --- a/src/plugins/designer/formeditorplugin.cpp +++ b/src/plugins/designer/formeditorplugin.cpp @@ -100,7 +100,7 @@ bool FormEditorPlugin::initialize([[maybe_unused]] const QStringList &arguments, wizard->setDescription(Tr::tr("Creates a Qt Designer form along with a matching class (C++ header and source file) " "for implementation purposes. You can add the form and class to an existing Qt Widget Project.")); - return wizard; + return {wizard}; }); #endif diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index 4d364362fd1..c8299be8e85 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -402,8 +402,9 @@ JsonWizardFactory::Page JsonWizardFactory::parsePage(const QVariant &value, QStr //FIXME: loadDefaultValues() has an almost identical loop. Make the loop return the results instead of //internal processing and create a separate function for it. Then process the results in //loadDefaultValues() and loadDefaultValues() -void JsonWizardFactory::createWizardFactories() +QList JsonWizardFactory::createWizardFactories() { + QList result; QString verboseLog; const QString wizardFileName = QLatin1String("wizard.json"); @@ -465,10 +466,16 @@ void JsonWizardFactory::createWizardFactories() continue; } - IWizardFactory::registerFactoryCreator([data, currentFile] { - QString errorMessage; - return createWizardFactory(data, currentFile.parentDir(), &errorMessage); - }); + QString errorMessage; + JsonWizardFactory *factory = createWizardFactory(data, + currentFile.parentDir(), + &errorMessage); + if (!factory) { + verboseLog.append(tr("* Failed to create: %1\n").arg(errorMessage)); + continue; + } + + result << factory; } } @@ -476,6 +483,7 @@ void JsonWizardFactory::createWizardFactories() qWarning("%s", qPrintable(verboseLog)); Core::MessageManager::writeDisrupting(verboseLog); } + return result; } JsonWizardFactory *JsonWizardFactory::createWizardFactory(const QVariantMap &data, diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h index 118b20330f2..c72808db66b 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h @@ -63,7 +63,7 @@ private: // Create all wizards. As other plugins might register factories for derived // classes. Called when the new file dialog is shown for the first time. - static void createWizardFactories(); + static QList createWizardFactories(); static JsonWizardFactory *createWizardFactory(const QVariantMap &data, const Utils::FilePath &baseDir, QString *errorMessage); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index f2143cc1549..e88d4225414 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -2042,7 +2042,8 @@ void ProjectExplorerPluginPrivate::closeAllProjects() void ProjectExplorerPlugin::extensionsInitialized() { CustomWizard::createWizards(); - JsonWizardFactory::createWizardFactories(); + IWizardFactory::registerFactoryCreator( + [] { return JsonWizardFactory::createWizardFactories(); }); // Register factories for all project managers