diff --git a/src/plugins/coreplugin/basefilewizardfactory.cpp b/src/plugins/coreplugin/basefilewizardfactory.cpp index eb7700016e3..9234113dab9 100644 --- a/src/plugins/coreplugin/basefilewizardfactory.cpp +++ b/src/plugins/coreplugin/basefilewizardfactory.cpp @@ -180,9 +180,11 @@ void WizardEventLoop::rejected() \sa Core::Internal::WizardEventLoop */ -void BaseFileWizardFactory::runWizardImpl(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &extraValues) +Utils::Wizard *BaseFileWizardFactory::runWizardImpl(const QString &path, QWidget *parent, + const QString &platform, + const QVariantMap &extraValues) { - QTC_ASSERT(!path.isEmpty(), return); + QTC_ASSERT(!path.isEmpty(), return 0); QString errorMessage; // Compile extension pages, purge out unused ones @@ -220,7 +222,7 @@ void BaseFileWizardFactory::runWizardImpl(const QString &path, QWidget *parent, requiredFeatures(), dialogParameterFlags, extraValues))); - QTC_ASSERT(!wizard.isNull(), return); + QTC_ASSERT(!wizard.isNull(), return 0); ICore::registerWindow(wizard.data(), Context("Core.NewWizard")); GeneratedFiles files; @@ -251,14 +253,14 @@ void BaseFileWizardFactory::runWizardImpl(const QString &path, QWidget *parent, break; } if (files.empty()) - return; + return 0; // Compile result list and prompt for overwrite switch (promptOverwrite(&files, &errorMessage)) { case OverwriteCanceled: - return; + return 0; case OverwriteError: QMessageBox::critical(0, tr("Existing files"), errorMessage); - return; + return 0; case OverwriteOk: break; } @@ -272,7 +274,7 @@ void BaseFileWizardFactory::runWizardImpl(const QString &path, QWidget *parent, // Write if (!writeFiles(files, &errorMessage)) { QMessageBox::critical(parent, tr("File Generation Failure"), errorMessage); - return; + return 0; } bool removeOpenProjectAttribute = false; @@ -282,7 +284,7 @@ void BaseFileWizardFactory::runWizardImpl(const QString &path, QWidget *parent, if (!ex->processFiles(files, &remove, &errorMessage)) { if (!errorMessage.isEmpty()) QMessageBox::critical(parent, tr("File Generation Failure"), errorMessage); - return; + return 0; } removeOpenProjectAttribute |= remove; } @@ -298,6 +300,8 @@ void BaseFileWizardFactory::runWizardImpl(const QString &path, QWidget *parent, if (!postGenerateFiles(wizard.data(), files, &errorMessage)) if (!errorMessage.isEmpty()) QMessageBox::critical(0, tr("File Generation Failure"), errorMessage); + + return 0; } /*! diff --git a/src/plugins/coreplugin/basefilewizardfactory.h b/src/plugins/coreplugin/basefilewizardfactory.h index d4ff388ba8b..4ec9a2f213a 100644 --- a/src/plugins/coreplugin/basefilewizardfactory.h +++ b/src/plugins/coreplugin/basefilewizardfactory.h @@ -129,7 +129,8 @@ protected: private: // IWizard - void runWizardImpl(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &extraValues); + Utils::Wizard *runWizardImpl(const QString &path, QWidget *parent, const QString &platform, + const QVariantMap &extraValues) override; }; } // namespace Core diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp index ed816659374..93526fc9c62 100644 --- a/src/plugins/coreplugin/iwizardfactory.cpp +++ b/src/plugins/coreplugin/iwizardfactory.cpp @@ -39,6 +39,7 @@ #include #include +#include #include @@ -243,15 +244,25 @@ QString IWizardFactory::runPath(const QString &defaultPath) return path; } -void IWizardFactory::runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &variables) +Utils::Wizard *IWizardFactory::runWizard(const QString &path, QWidget *parent, const QString &platform, const QVariantMap &variables) { s_isWizardRunning = true; ICore::validateNewDialogIsRunning(); - runWizardImpl(path, parent, platform, variables); + Utils::Wizard *wizard = runWizardImpl(path, parent, platform, variables); - s_isWizardRunning = false; - ICore::validateNewDialogIsRunning(); + if (wizard) { + connect(wizard, &Utils::Wizard::finished, [wizard]() { + s_isWizardRunning = false; + ICore::validateNewDialogIsRunning(); + wizard->deleteLater(); + }); + Core::ICore::registerWindow(wizard, Core::Context("Core.NewWizard")); + } else { + s_isWizardRunning = false; + ICore::validateNewDialogIsRunning(); + } + return wizard; } bool IWizardFactory::isAvailable(const QString &platformName) const diff --git a/src/plugins/coreplugin/iwizardfactory.h b/src/plugins/coreplugin/iwizardfactory.h index 00ccbef69fa..3782671ef08 100644 --- a/src/plugins/coreplugin/iwizardfactory.h +++ b/src/plugins/coreplugin/iwizardfactory.h @@ -42,6 +42,8 @@ QT_FORWARD_DECLARE_CLASS(QAction) +namespace Utils { class Wizard; } + namespace Core { namespace Internal { class CorePlugin; } @@ -89,8 +91,8 @@ public: QString runPath(const QString &defaultPath); // Does bookkeeping and the calls runWizardImpl. Please implement that. - virtual void runWizard(const QString &path, QWidget *parent, const QString &platform, - const QVariantMap &variables); + virtual Utils::Wizard *runWizard(const QString &path, QWidget *parent, const QString &platform, + const QVariantMap &variables); virtual bool isAvailable(const QString &platformName) const; QStringList supportedPlatforms() const; @@ -113,8 +115,8 @@ protected: FeatureSet pluginFeatures() const; FeatureSet availableFeatures(const QString &platformName) const; - virtual void runWizardImpl(const QString &path, QWidget *parent, const QString &platform, - const QVariantMap &variables) = 0; + virtual Utils::Wizard *runWizardImpl(const QString &path, QWidget *parent, const QString &platform, + const QVariantMap &variables) = 0; private: static void initialize(); diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp index ad04824d8ca..79c5590434d 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.cpp @@ -356,52 +356,53 @@ void JsonWizardFactory::registerGeneratorFactory(JsonWizardGeneratorFactory *fac JsonWizardFactory::~JsonWizardFactory() { } -void JsonWizardFactory::runWizardImpl(const QString &path, QWidget *parent, const QString &platform, - const QVariantMap &variables) +Utils::Wizard *JsonWizardFactory::runWizardImpl(const QString &path, QWidget *parent, + const QString &platform, + const QVariantMap &variables) { - JsonWizard wizard(parent); - wizard.setWindowIcon(icon()); - wizard.setWindowTitle(displayName()); + auto wizard = new JsonWizard(parent); + wizard->setWindowIcon(icon()); + wizard->setWindowTitle(displayName()); - wizard.setValue(QStringLiteral("WizardDir"), m_wizardDir); + wizard->setValue(QStringLiteral("WizardDir"), m_wizardDir); Core::FeatureSet tmp = requiredFeatures(); tmp.remove(pluginFeatures()); - wizard.setValue(QStringLiteral("RequiredFeatures"), tmp.toStringList()); + wizard->setValue(QStringLiteral("RequiredFeatures"), tmp.toStringList()); tmp = m_preferredFeatures; tmp.remove(pluginFeatures()); - wizard.setValue(QStringLiteral("PreferredFeatures"), tmp.toStringList()); + wizard->setValue(QStringLiteral("PreferredFeatures"), tmp.toStringList()); - wizard.setValue(QStringLiteral("Features"), availableFeatures(platform).toStringList()); - wizard.setValue(QStringLiteral("Plugins"), pluginFeatures().toStringList()); + wizard->setValue(QStringLiteral("Features"), availableFeatures(platform).toStringList()); + wizard->setValue(QStringLiteral("Plugins"), pluginFeatures().toStringList()); // Add data to wizard: for (auto i = variables.constBegin(); i != variables.constEnd(); ++i) - wizard.setProperty(i.key().toUtf8(), i.value()); + wizard->setValue(i.key(), i.value()); - wizard.setValue(QStringLiteral("InitialPath"), path); - wizard.setValue(QStringLiteral("Platform"), platform); + wizard->setValue(QStringLiteral("InitialPath"), path); + wizard->setValue(QStringLiteral("Platform"), platform); QString kindStr = QLatin1String(Core::Constants::WIZARD_KIND_UNKNOWN); if (kind() == IWizardFactory::FileWizard) kindStr = QLatin1String(Core::Constants::WIZARD_KIND_FILE); else if (kind() == IWizardFactory::ProjectWizard) kindStr = QLatin1String(Core::Constants::WIZARD_KIND_PROJECT); - wizard.setValue(QStringLiteral("kind"), kindStr); + wizard->setValue(QStringLiteral("kind"), kindStr); - wizard.setValue(QStringLiteral("trDescription"), description()); - wizard.setValue(QStringLiteral("trDisplayName"), displayName()); - wizard.setValue(QStringLiteral("trCategory"), displayCategory()); - wizard.setValue(QStringLiteral("category"), category()); - wizard.setValue(QStringLiteral("id"), id().toString()); + wizard->setValue(QStringLiteral("trDescription"), description()); + wizard->setValue(QStringLiteral("trDisplayName"), displayName()); + wizard->setValue(QStringLiteral("trCategory"), displayCategory()); + wizard->setValue(QStringLiteral("category"), category()); + wizard->setValue(QStringLiteral("id"), id().toString()); for (auto i = m_options.constBegin(); i != m_options.constEnd(); ++i) - wizard.setValue(i.key(), i.value()); + wizard->setValue(i.key(), i.value()); bool havePage = false; foreach (const Page &data, m_pages) { QTC_ASSERT(data.isValid(), continue); - if (!JsonWizard::boolFromVariant(data.enabled, wizard.expander())) + if (!JsonWizard::boolFromVariant(data.enabled, wizard->expander())) continue; havePage = true; @@ -410,7 +411,7 @@ void JsonWizardFactory::runWizardImpl(const QString &path, QWidget *parent, cons return f->canCreate(data.typeId); }); QTC_ASSERT(factory, continue); - Utils::WizardPage *page = factory->create(&wizard, data.typeId, data.data); + Utils::WizardPage *page = factory->create(wizard, data.typeId, data.data); QTC_ASSERT(page, continue); page->setTitle(data.title); @@ -418,11 +419,11 @@ void JsonWizardFactory::runWizardImpl(const QString &path, QWidget *parent, cons page->setProperty(Utils::SHORT_TITLE_PROPERTY, data.shortTitle); if (data.index >= 0) { - wizard.setPage(data.index, page); - if (wizard.page(data.index) != page) // Failed to set page! + wizard->setPage(data.index, page); + if (wizard->page(data.index) != page) // Failed to set page! delete page; } else { - wizard.addPage(page); + wizard->addPage(page); } } @@ -436,15 +437,17 @@ void JsonWizardFactory::runWizardImpl(const QString &path, QWidget *parent, cons JsonWizardGenerator *gen = factory->create(data.typeId, data.data, path, platform, variables); QTC_ASSERT(gen, continue); - wizard.addGenerator(gen); + wizard->addGenerator(gen); } - if (havePage) { - Core::ICore::registerWindow(&wizard, Core::Context("Core.NewJSONWizard")); - wizard.exec(); - } else { - wizard.accept(); + if (!havePage) { + wizard->accept(); + wizard->deleteLater(); + return 0; } + + wizard->show(); + return wizard; } QList JsonWizardFactory::objectOrList(const QVariant &data, QString *errorMessage) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h index 8d5efeefd34..736cad6e3bb 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h +++ b/src/plugins/projectexplorer/jsonwizard/jsonwizardfactory.h @@ -93,8 +93,8 @@ public: bool isAvailable(const QString &platformName) const override; private: - void runWizardImpl(const QString &path, QWidget *parent, const QString &platform, - const QVariantMap &variables); + Utils::Wizard *runWizardImpl(const QString &path, QWidget *parent, const QString &platform, + const QVariantMap &variables) override; // Create all wizards. As other plugins might register factories for derived // classes. Called when the new file dialog is shown for the first time.