diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp index d9fbf599e05543a0694bad660126932419ef472f..51fb4d61215f1290c512a82f4fd76f9362dc2338 100644 --- a/src/plugins/coreplugin/iwizardfactory.cpp +++ b/src/plugins/coreplugin/iwizardfactory.cpp @@ -158,6 +158,49 @@ QList s_factoryCreators; QAction *s_inspectWizardAction = 0; bool s_areFactoriesLoaded = false; bool s_isWizardRunning = false; + +// NewItemDialog reopening data: +class NewItemDialogData +{ +public: + void setData(const QString t, const QList f, + const QString &dl, const QVariantMap &ev) + { + QTC_ASSERT(!hasData(), return); + + QTC_ASSERT(!t.isEmpty(), return); + QTC_ASSERT(!f.isEmpty(), return); + + title = t; + factories = f; + defaultLocation = dl; + extraVariables = ev; + } + + bool hasData() const { return !factories.isEmpty(); } + + void clear() { + title.clear(); + factories.clear(); + defaultLocation.clear(); + extraVariables.clear(); + } + + void reopen() { + if (!hasData()) + return; + ICore::showNewItemDialog(title, factories, defaultLocation, extraVariables); + clear(); + } + +private: + QString title; + QList factories; + QString defaultLocation; + QVariantMap extraVariables; +}; + +NewItemDialogData s_reopenData; } /* A utility to find all wizards supporting a view mode and matching a predicate */ @@ -249,6 +292,8 @@ QString IWizardFactory::runPath(const QString &defaultPath) Utils::Wizard *IWizardFactory::runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &variables) { + QTC_ASSERT(!s_isWizardRunning, return 0); + s_isWizardRunning = true; ICore::validateNewItemDialogIsRunning(); @@ -259,11 +304,16 @@ Utils::Wizard *IWizardFactory::runWizard(const QString &path, QWidget *parent, c connect(m_action, &QAction::triggered, wizard, [wizard]() { ICore::raiseWindow(wizard); }); connect(s_inspectWizardAction, &QAction::triggered, wizard, [wizard]() { wizard->showVariables(); }); - connect(wizard, &Utils::Wizard::finished, [wizard]() { + connect(wizard, &Utils::Wizard::finished, this, [wizard](int result) { + if (result != QDialog::Accepted) + s_reopenData.clear(); + wizard->deleteLater(); + }); + connect(wizard, &QObject::destroyed, this, [wizard]() { s_isWizardRunning = false; s_inspectWizardAction->setEnabled(false); ICore::validateNewItemDialogIsRunning(); - wizard->deleteLater(); + s_reopenData.reopen(); }); s_inspectWizardAction->setEnabled(true); wizard->show(); @@ -271,6 +321,7 @@ Utils::Wizard *IWizardFactory::runWizard(const QString &path, QWidget *parent, c } else { s_isWizardRunning = false; ICore::validateNewItemDialogIsRunning(); + s_reopenData.reopen(); } return wizard; } @@ -331,6 +382,14 @@ bool IWizardFactory::isWizardRunning() return s_isWizardRunning; } +void IWizardFactory::requestNewItemDialog(const QString &title, + const QList &factories, + const QString &defaultLocation, + const QVariantMap &extraVariables) +{ + s_reopenData.setData(title, factories, defaultLocation, extraVariables); +} + void IWizardFactory::destroyFeatureProvider() { qDeleteAll(s_providerList); diff --git a/src/plugins/coreplugin/iwizardfactory.h b/src/plugins/coreplugin/iwizardfactory.h index 79644e9b072ff3c1f5dab59b485d1e82fa6043ea..eef809cd53fbd8516762365b01597878355b1c0a 100644 --- a/src/plugins/coreplugin/iwizardfactory.h +++ b/src/plugins/coreplugin/iwizardfactory.h @@ -109,6 +109,11 @@ public: static bool isWizardRunning(); + static void requestNewItemDialog(const QString &title, + const QList &factories, + const QString &defaultLocation, + const QVariantMap &extraVariables); + protected: FeatureSet pluginFeatures() const; FeatureSet availableFeatures(const QString &platformName) const; diff --git a/src/plugins/qmakeprojectmanager/wizards/subdirsprojectwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/subdirsprojectwizard.cpp index 3741e3c10cfc30184b0e25581e07e4504612f72c..ef736b93519b1277f1f50b4522e5cc66751acd0b 100644 --- a/src/plugins/qmakeprojectmanager/wizards/subdirsprojectwizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/subdirsprojectwizard.cpp @@ -92,10 +92,9 @@ bool SubdirsProjectWizard::postGenerateFiles(const QWizard *w, const Core::Gener QVariantMap map; map.insert(QLatin1String(ProjectExplorer::Constants::PREFERRED_PROJECT_NODE), profileName); map.insert(QLatin1String(ProjectExplorer::Constants::PROJECT_KIT_IDS), QVariant::fromValue(wizard->selectedKits())); - Core::ICore::showNewItemDialog(tr("New Subproject", "Title of dialog"), - Core::IWizardFactory::wizardFactoriesOfKind(Core::IWizardFactory::ProjectWizard), - wizard->parameters().projectPath(), - map); + IWizardFactory::requestNewItemDialog(tr("New Subproject", "Title of dialog"), + Core::IWizardFactory::wizardFactoriesOfKind(Core::IWizardFactory::ProjectWizard), + wizard->parameters().projectPath(), map); } else { return false; }