summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@theqtcompany.com>2015-05-22 17:16:36 +0200
committerTobias Hunger <tobias.hunger@theqtcompany.com>2015-05-26 11:47:53 +0000
commit25f2f8e1ee43c2656a9c273f541a3735a7841273 (patch)
tree1cf4d8c6765c3e29d232112fe38f54b1519797a8 /src/plugins
parentb5e3f2e57b38e0d3476da969b093aa36ebb61e3e (diff)
downloadqt-creator-25f2f8e1ee43c2656a9c273f541a3735a7841273.tar.gz
IWizardFactory: Create wizards with factoryCreators
Do not use the object pool to hold potential wizards. Register FactoryCreator functions with IWizardFactory instead and use those to create the wizards when necessary. This saves us a couple of cycles during startup since we can now delay construction of all wizards and it makes us more flexible wrt. managing the lifecycle of the wizard factories. Change-Id: I95d6a6dfcdf0fd995e1934a9fefcd96c6a676753 Reviewed-by: Eike Ziller <eike.ziller@theqtcompany.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/coreplugin/coreplugin.cpp2
-rw-r--r--src/plugins/coreplugin/icore.cpp5
-rw-r--r--src/plugins/coreplugin/icore.h3
-rw-r--r--src/plugins/coreplugin/iwizardfactory.cpp47
-rw-r--r--src/plugins/coreplugin/iwizardfactory.h6
-rw-r--r--src/plugins/designer/formeditorplugin.cpp31
-rw-r--r--src/plugins/genericprojectmanager/genericprojectplugin.cpp3
-rw-r--r--src/plugins/projectexplorer/customwizard/customwizard.cpp4
-rw-r--r--src/plugins/projectexplorer/customwizard/customwizard.h2
-rw-r--r--src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp4
-rw-r--r--src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h2
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp23
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp11
13 files changed, 85 insertions, 58 deletions
diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp
index ffa050e5a0..e4ce23df18 100644
--- a/src/plugins/coreplugin/coreplugin.cpp
+++ b/src/plugins/coreplugin/coreplugin.cpp
@@ -185,6 +185,8 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage)
InfoBar::initializeGloballySuppressed();
}
+ IWizardFactory::initialize();
+
// Make sure we respect the process's umask when creating new files
SaveFile::initializeUmask();
diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp
index dce4a74a21..3550d827bd 100644
--- a/src/plugins/coreplugin/icore.cpp
+++ b/src/plugins/coreplugin/icore.cpp
@@ -533,11 +533,6 @@ void ICore::openFiles(const QStringList &arguments, ICore::OpenFilesFlags flags)
m_mainwindow->openFiles(arguments, flags);
}
-void ICore::emitNewItemsDialogRequested()
-{
- emit m_instance->newItemsDialogRequested();
-}
-
void ICore::saveSettings()
{
emit m_instance->saveSettingsRequested();
diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h
index ffb45dcd7c..61df88c61b 100644
--- a/src/plugins/coreplugin/icore.h
+++ b/src/plugins/coreplugin/icore.h
@@ -123,15 +123,12 @@ public:
};
static void openFiles(const QStringList &fileNames, OpenFilesFlags flags = None);
- static void emitNewItemsDialogRequested();
-
public slots:
static void saveSettings();
signals:
void coreAboutToOpen();
void coreOpened();
- void newItemsDialogRequested();
void newItemDialogRunningChanged();
void saveSettingsRequested();
void optionsDialogRequested();
diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp
index 4262b4abc5..0feac766a1 100644
--- a/src/plugins/coreplugin/iwizardfactory.cpp
+++ b/src/plugins/coreplugin/iwizardfactory.cpp
@@ -147,16 +147,18 @@
using namespace Core;
+
namespace {
static QList<IFeatureProvider *> s_providerList;
+QList<IWizardFactory *> s_allFactories;
+QList<IWizardFactory::FactoryCreator> s_factoryCreators;
+bool s_areFactoriesLoaded = false;
}
/* A utility to find all wizards supporting a view mode and matching a predicate */
template <class Predicate>
QList<IWizardFactory*> findWizardFactories(Predicate predicate)
{
- // Hack: Trigger delayed creation of wizards
- ICore::emitNewItemsDialogRequested();
// Filter all wizards
const QList<IWizardFactory*> allFactories = IWizardFactory::allWizardFactories();
QList<IWizardFactory*> rc;
@@ -169,9 +171,33 @@ template <class Predicate>
QList<IWizardFactory*> IWizardFactory::allWizardFactories()
{
- // Hack: Trigger delayed creation of wizards
- ICore::emitNewItemsDialogRequested();
- return ExtensionSystem::PluginManager::getObjects<IWizardFactory>();
+ if (!s_areFactoriesLoaded) {
+ QTC_ASSERT(s_allFactories.isEmpty(), return s_allFactories);
+
+ s_areFactoriesLoaded = true;
+
+ QHash<Id, IWizardFactory *> sanityCheck;
+ foreach (const FactoryCreator &fc, s_factoryCreators) {
+ QList<IWizardFactory *> tmp = fc();
+ foreach (IWizardFactory *newFactory, tmp) {
+ QTC_ASSERT(newFactory, continue);
+ IWizardFactory *existingFactory = sanityCheck.value(newFactory->id());
+
+ QTC_ASSERT(existingFactory != newFactory, continue);
+ if (existingFactory) {
+ qWarning("%s", qPrintable(tr("Factory with id=\"%1\" already registered. Deleting.")
+ .arg(existingFactory->id().toString())));
+ delete newFactory;
+ continue;
+ }
+
+ sanityCheck.insert(newFactory->id(), newFactory);
+ s_allFactories << newFactory;
+ }
+ }
+ }
+
+ return s_allFactories;
}
// Utility to find all registered wizards of a certain kind
@@ -211,6 +237,11 @@ QStringList IWizardFactory::supportedPlatforms() const
return stringList;
}
+void IWizardFactory::registerFactoryCreator(const IWizardFactory::FactoryCreator &creator)
+{
+ s_factoryCreators << creator;
+}
+
QStringList IWizardFactory::allAvailablePlatforms()
{
QStringList platforms;
@@ -257,3 +288,9 @@ FeatureSet IWizardFactory::pluginFeatures() const
}
return plugins;
}
+
+void IWizardFactory::initialize()
+{
+ connect(ICore::instance(), &ICore::coreAboutToClose,
+ ICore::instance(), []() { qDeleteAll(s_allFactories); s_allFactories.clear(); });
+}
diff --git a/src/plugins/coreplugin/iwizardfactory.h b/src/plugins/coreplugin/iwizardfactory.h
index df5a4e8139..0d52a0e54a 100644
--- a/src/plugins/coreplugin/iwizardfactory.h
+++ b/src/plugins/coreplugin/iwizardfactory.h
@@ -38,6 +38,8 @@
#include <QObject>
#include <QString>
+#include <functional>
+
namespace Core {
namespace Internal { class CorePlugin; }
@@ -87,6 +89,9 @@ public:
bool isAvailable(const QString &platformName) const;
QStringList supportedPlatforms() const;
+ typedef std::function<QList<IWizardFactory *>()> FactoryCreator;
+ static void registerFactoryCreator(const FactoryCreator &creator);
+
// Utility to find all registered wizards
static QList<IWizardFactory*> allWizardFactories();
// Utility to find all registered wizards of a certain kind
@@ -100,6 +105,7 @@ protected:
FeatureSet pluginFeatures() const;
private:
+ static void initialize();
static void destroyFeatureProvider();
IWizardFactory::WizardKind m_kind;
diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp
index 58bade244a..97a3ec314d 100644
--- a/src/plugins/designer/formeditorplugin.cpp
+++ b/src/plugins/designer/formeditorplugin.cpp
@@ -85,7 +85,21 @@ bool FormEditorPlugin::initialize(const QStringList &arguments, QString *error)
{
Q_UNUSED(arguments)
- initializeTemplates();
+#ifdef CPP_ENABLED
+ IWizardFactory::registerFactoryCreator(
+ []() -> QList<IWizardFactory *> {
+ IWizardFactory *wizard = new FormClassWizard;
+ wizard->setWizardKind(IWizardFactory::FileWizard);
+ wizard->setCategory(QLatin1String(Core::Constants::WIZARD_CATEGORY_QT));
+ wizard->setDisplayCategory(QCoreApplication::translate("Core", Core::Constants::WIZARD_TR_CATEGORY_QT));
+ wizard->setDisplayName(tr("Qt Designer Form Class"));
+ wizard->setId("C.FormClass");
+ wizard->setDescription(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 QList<IWizardFactory *>() << wizard;
+ });
+#endif
ProjectExplorer::JsonWizardFactory::registerPageFactory(new Internal::FormPageFactory);
addAutoReleasedObject(new FormEditorFactory);
@@ -130,21 +144,6 @@ void FormEditorPlugin::extensionsInitialized()
//
////////////////////////////////////////////////////
-void FormEditorPlugin::initializeTemplates()
-{
-#ifdef CPP_ENABLED
- IWizardFactory *wizard = new FormClassWizard;
- wizard->setWizardKind(IWizardFactory::FileWizard);
- wizard->setCategory(QLatin1String(Core::Constants::WIZARD_CATEGORY_QT));
- wizard->setDisplayCategory(QCoreApplication::translate("Core", Core::Constants::WIZARD_TR_CATEGORY_QT));
- wizard->setDisplayName(tr("Qt Designer Form Class"));
- wizard->setId("C.FormClass");
- wizard->setDescription(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."));
- addAutoReleasedObject(wizard);
-#endif
-}
-
// Find out current existing editor file
static QString currentFile()
{
diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.cpp b/src/plugins/genericprojectmanager/genericprojectplugin.cpp
index 2b784b2434..2a595b4d26 100644
--- a/src/plugins/genericprojectmanager/genericprojectplugin.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectplugin.cpp
@@ -70,9 +70,10 @@ bool GenericProjectPlugin::initialize(const QStringList &, QString *errorMessage
addAutoReleasedObject(new Manager);
addAutoReleasedObject(new ProjectFilesFactory);
addAutoReleasedObject(new GenericMakeStepFactory);
- addAutoReleasedObject(new GenericProjectWizard);
addAutoReleasedObject(new GenericBuildConfigurationFactory);
+ IWizardFactory::registerFactoryCreator([]() { return QList<IWizardFactory *>() << new GenericProjectWizard; });
+
ActionContainer *mproject =
ActionManager::actionContainer(ProjectExplorer::Constants::M_PROJECTCONTEXT);
diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp
index bccd1d35d7..2336f57f92 100644
--- a/src/plugins/projectexplorer/customwizard/customwizard.cpp
+++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp
@@ -356,9 +356,9 @@ CustomWizard *CustomWizard::createWizard(const CustomProjectWizard::CustomWizard
containing valid configuration files and parse them into wizards.
*/
-QList<CustomWizard*> CustomWizard::createWizards()
+QList<Core::IWizardFactory *> CustomWizard::createWizards()
{
- QList<CustomWizard*> rc;
+ QList<Core::IWizardFactory *> rc;
QString errorMessage;
QString verboseLog;
const QString templateDirName = Core::ICore::resourcePath() +
diff --git a/src/plugins/projectexplorer/customwizard/customwizard.h b/src/plugins/projectexplorer/customwizard/customwizard.h
index f31b956b1f..6974ad9be2 100644
--- a/src/plugins/projectexplorer/customwizard/customwizard.h
+++ b/src/plugins/projectexplorer/customwizard/customwizard.h
@@ -102,7 +102,7 @@ public:
// Create all wizards. As other plugins might register factories for derived
// classes, call it in extensionsInitialized().
- static QList<CustomWizard*> createWizards();
+ static QList<IWizardFactory *> createWizards();
static void setVerbose(int);
static int verbose();
diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp
index e889bd040a..ce23bc51f8 100644
--- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp
+++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp
@@ -205,13 +205,13 @@ static JsonWizardFactory::Page parsePage(const QVariant &value, QString *errorMe
return p;
}
-QList<JsonWizardFactory *> JsonWizardFactory::createWizardFactories()
+QList<Core::IWizardFactory *> JsonWizardFactory::createWizardFactories()
{
QString errorMessage;
QString verboseLog;
const QString wizardFileName = QLatin1String(WIZARD_FILE);
- QList <JsonWizardFactory *> result;
+ QList <Core::IWizardFactory *> result;
foreach (const Utils::FileName &path, searchPaths()) {
if (path.isEmpty())
continue;
diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h
index ff7389d088..5098930bfb 100644
--- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h
+++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h
@@ -95,7 +95,7 @@ public:
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 QList<JsonWizardFactory *> createWizardFactories();
+ static QList<IWizardFactory *> createWizardFactories();
static JsonWizardFactory *createWizardFactory(const QVariantMap &data, const QDir &baseDir,
QString *errorMessage);
static QList<Utils::FileName> &searchPaths();
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 609b24bd56..18e3e63cfe 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -284,7 +284,6 @@ public:
void slotUpdateRunActions();
void currentModeChanged(Core::IMode *mode, Core::IMode *oldMode);
- void loadCustomWizards();
void updateWelcomePage();
@@ -490,8 +489,12 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
addAutoReleasedObject(new TaskHub);
- connect(ICore::instance(), &ICore::newItemsDialogRequested,
- dd, &ProjectExplorerPluginPrivate::loadCustomWizards);
+ IWizardFactory::registerFactoryCreator([]() -> QList<IWizardFactory *> {
+ QList<IWizardFactory *> result;
+ result << CustomWizard::createWizards();
+ result << JsonWizardFactory::createWizardFactories();
+ return result;
+ });
dd->m_welcomePage = new ProjectWelcomePage;
connect(dd->m_welcomePage, &ProjectWelcomePage::manageSessions,
@@ -1504,20 +1507,6 @@ void ProjectExplorerPlugin::extensionsInitialized()
dd->m_kitManager->restoreKits();
}
-void ProjectExplorerPluginPrivate::loadCustomWizards()
-{
- // Add custom wizards, for which other plugins might have registered
- // class factories
- static bool firstTime = true;
- if (firstTime) {
- firstTime = false;
- foreach (IWizardFactory *cpw, CustomWizard::createWizards())
- m_instance->addAutoReleasedObject(cpw);
- foreach (IWizardFactory *cpw, JsonWizardFactory::createWizardFactories())
- m_instance->addAutoReleasedObject(cpw);
- }
-}
-
void ProjectExplorerPluginPrivate::updateRunWithoutDeployMenu()
{
m_runWithoutDeployAction->setVisible(m_projectExplorerSettings.deployBeforeRun);
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
index c402e2f2f7..9500d0d6d9 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
@@ -106,11 +106,12 @@ bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString
ProjectExplorer::KitManager::registerKitInformation(new QmakeKitInformation);
- addAutoReleasedObject(new SubdirsProjectWizard);
- addAutoReleasedObject(new GuiAppWizard);
- addAutoReleasedObject(new LibraryWizard);
- addAutoReleasedObject(new TestWizard);
- addAutoReleasedObject(new CustomWidgetWizard);
+ IWizardFactory::registerFactoryCreator([]() {
+ QList<IWizardFactory *> result;
+ result << new SubdirsProjectWizard << new GuiAppWizard << new LibraryWizard
+ << new TestWizard << new CustomWidgetWizard;
+ return result;
+ });
addAutoReleasedObject(new CustomWizardMetaFactory<CustomQmakeProjectWizard>
(QLatin1String("qmakeproject"), IWizardFactory::ProjectWizard));