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