diff --git a/src/plugins/coreplugin/dialogs/newdialog.cpp b/src/plugins/coreplugin/dialogs/newdialog.cpp index e3ddc0eab03..10cd14003a5 100644 --- a/src/plugins/coreplugin/dialogs/newdialog.cpp +++ b/src/plugins/coreplugin/dialogs/newdialog.cpp @@ -186,16 +186,16 @@ Q_DECLARE_METATYPE(WizardFactoryContainer) using namespace Core; using namespace Core::Internal; -bool NewDialog::m_isRunning = false; +QWidget *NewDialog::m_currentDialog = nullptr; NewDialog::NewDialog(QWidget *parent) : QDialog(parent), m_ui(new Ui::NewDialog), m_okButton(0) { - QTC_CHECK(!m_isRunning); + QTC_CHECK(m_currentDialog == nullptr); - m_isRunning = true; + m_currentDialog = this; setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowFlags(windowFlags()); @@ -339,9 +339,9 @@ Id NewDialog::selectedPlatform() const return Id::fromSetting(m_ui->comboBox->itemData(index)); } -bool NewDialog::isRunning() +QWidget *NewDialog::currentDialog() { - return m_isRunning; + return m_currentDialog; } bool NewDialog::event(QEvent *event) @@ -358,8 +358,8 @@ bool NewDialog::event(QEvent *event) NewDialog::~NewDialog() { - QTC_CHECK(m_isRunning); - m_isRunning = false; + QTC_CHECK(m_currentDialog != nullptr); + m_currentDialog = nullptr; delete m_ui; } diff --git a/src/plugins/coreplugin/dialogs/newdialog.h b/src/plugins/coreplugin/dialogs/newdialog.h index 13385b7f985..5d73546aa96 100644 --- a/src/plugins/coreplugin/dialogs/newdialog.h +++ b/src/plugins/coreplugin/dialogs/newdialog.h @@ -61,7 +61,7 @@ public: void showDialog(); Id selectedPlatform() const; - static bool isRunning(); + static QWidget *currentDialog(); protected: bool event(QEvent *); @@ -78,7 +78,7 @@ private: void addItem(QStandardItem *topLevelCategoryItem, IWizardFactory *factory); void saveState(); - static bool m_isRunning; + static QWidget *m_currentDialog; Ui::NewDialog *m_ui; QStandardItemModel *m_model; diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index df9a58d2972..ee810e5756a 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -307,7 +307,14 @@ ICore *ICore::instance() bool ICore::isNewItemDialogRunning() { - return NewDialog::isRunning() || IWizardFactory::isWizardRunning(); + return NewDialog::currentDialog() || IWizardFactory::isWizardRunning(); +} + +QWidget *ICore::newItemDialog() +{ + if (NewDialog::currentDialog()) + return NewDialog::currentDialog(); + return IWizardFactory::currentWizard(); } ICore::ICore(MainWindow *mainwindow) @@ -336,12 +343,12 @@ void ICore::showNewItemDialog(const QString &title, { QTC_ASSERT(!isNewItemDialogRunning(), return); auto newDialog = new NewDialog(dialogParent()); - connect(newDialog, &QObject::destroyed, m_instance, &ICore::validateNewItemDialogIsRunning); + connect(newDialog, &QObject::destroyed, m_instance, &ICore::updateNewItemDialogState); newDialog->setWizardFactories(factories, defaultLocation, extraVariables); newDialog->setWindowTitle(title); newDialog->showDialog(); - validateNewItemDialogIsRunning(); + updateNewItemDialogState(); } bool ICore::showOptionsDialog(const Id page, QWidget *parent) @@ -610,13 +617,15 @@ void ICore::appendAboutInformation(const QString &line) m_mainwindow->appendAboutInformation(line); } -void ICore::validateNewItemDialogIsRunning() +void ICore::updateNewItemDialogState() { static bool wasRunning = false; - if (wasRunning == isNewItemDialogRunning()) + static QWidget *previousDialog = nullptr; + if (wasRunning == isNewItemDialogRunning() && previousDialog == newItemDialog()) return; wasRunning = isNewItemDialogRunning(); - emit instance()->newItemDialogRunningChanged(); + previousDialog = newItemDialog(); + emit instance()->newItemDialogStateChanged(); } } // namespace Core diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h index 8292e841f60..b2d789b6d8d 100644 --- a/src/plugins/coreplugin/icore.h +++ b/src/plugins/coreplugin/icore.h @@ -72,6 +72,7 @@ public: static ICore *instance(); static bool isNewItemDialogRunning(); + static QWidget *newItemDialog(); static void showNewItemDialog(const QString &title, const QList &factories, const QString &defaultLocation = QString(), @@ -138,7 +139,7 @@ public slots: signals: void coreAboutToOpen(); void coreOpened(); - void newItemDialogRunningChanged(); + void newItemDialogStateChanged(); void saveSettingsRequested(); void optionsDialogRequested(); void coreAboutToClose(); @@ -151,7 +152,7 @@ public: static void appendAboutInformation(const QString &line); private: - static void validateNewItemDialogIsRunning(); + static void updateNewItemDialogState(); }; } // namespace Core diff --git a/src/plugins/coreplugin/iwizardfactory.cpp b/src/plugins/coreplugin/iwizardfactory.cpp index 8d2c1e949de..72cda1a63f8 100644 --- a/src/plugins/coreplugin/iwizardfactory.cpp +++ b/src/plugins/coreplugin/iwizardfactory.cpp @@ -153,6 +153,7 @@ QList s_factoryCreators; QAction *s_inspectWizardAction = 0; bool s_areFactoriesLoaded = false; bool s_isWizardRunning = false; +QWidget *s_currentWizard = nullptr; // NewItemDialog reopening data: class NewItemDialogData @@ -271,11 +272,12 @@ Utils::Wizard *IWizardFactory::runWizard(const QString &path, QWidget *parent, I QTC_ASSERT(!s_isWizardRunning, return 0); s_isWizardRunning = true; - ICore::validateNewItemDialogIsRunning(); + ICore::updateNewItemDialogState(); Utils::Wizard *wizard = runWizardImpl(path, parent, platform, variables); if (wizard) { + s_currentWizard = wizard; // Connect while wizard exists: connect(m_action, &QAction::triggered, wizard, [wizard]() { ICore::raiseWindow(wizard); }); connect(s_inspectWizardAction, &QAction::triggered, @@ -287,8 +289,9 @@ Utils::Wizard *IWizardFactory::runWizard(const QString &path, QWidget *parent, I }); connect(wizard, &QObject::destroyed, this, [wizard]() { s_isWizardRunning = false; + s_currentWizard = nullptr; s_inspectWizardAction->setEnabled(false); - ICore::validateNewItemDialogIsRunning(); + ICore::updateNewItemDialogState(); s_reopenData.reopen(); }); s_inspectWizardAction->setEnabled(true); @@ -296,7 +299,7 @@ Utils::Wizard *IWizardFactory::runWizard(const QString &path, QWidget *parent, I Core::ICore::registerWindow(wizard, Core::Context("Core.NewWizard")); } else { s_isWizardRunning = false; - ICore::validateNewItemDialogIsRunning(); + ICore::updateNewItemDialogState(); s_reopenData.reopen(); } return wizard; @@ -357,6 +360,11 @@ bool IWizardFactory::isWizardRunning() return s_isWizardRunning; } +QWidget *IWizardFactory::currentWizard() +{ + return s_currentWizard; +} + void IWizardFactory::requestNewItemDialog(const QString &title, const QList &factories, const QString &defaultLocation, @@ -413,7 +421,7 @@ void IWizardFactory::initialize() ActionManager::registerAction(resetAction, "Wizard.Factory.Reset"); connect(resetAction, &QAction::triggered, &IWizardFactory::clearWizardFactories); - connect(ICore::instance(), &ICore::newItemDialogRunningChanged, resetAction, + connect(ICore::instance(), &ICore::newItemDialogStateChanged, resetAction, [resetAction]() { resetAction->setEnabled(!ICore::isNewItemDialogRunning()); }); s_inspectWizardAction = new QAction(tr("Inspect Wizard State"), ActionManager::instance()); diff --git a/src/plugins/coreplugin/iwizardfactory.h b/src/plugins/coreplugin/iwizardfactory.h index bee5aa8d65c..30b6cb164a2 100644 --- a/src/plugins/coreplugin/iwizardfactory.h +++ b/src/plugins/coreplugin/iwizardfactory.h @@ -101,6 +101,7 @@ public: static void registerFeatureProvider(IFeatureProvider *provider); static bool isWizardRunning(); + static QWidget *currentWizard(); static void requestNewItemDialog(const QString &title, const QList &factories, diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 54d54808ba2..6d8ba333b1a 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -513,11 +513,12 @@ void MainWindow::registerDefaultActions() cmd->setDefaultKeySequence(QKeySequence::New); mfile->addAction(cmd, Constants::G_FILE_NEW); connect(m_newAction, &QAction::triggered, this, [this]() { - ICore::showNewItemDialog(tr("New File or Project", "Title of dialog"), - IWizardFactory::allWizardFactories(), QString()); - }); - connect(ICore::instance(), &ICore::newItemDialogRunningChanged, m_newAction, [this]() { - m_newAction->setEnabled(!ICore::isNewItemDialogRunning()); + if (!ICore::isNewItemDialogRunning()) { + ICore::showNewItemDialog(tr("New File or Project", "Title of dialog"), + IWizardFactory::allWizardFactories(), QString()); + } else { + ICore::raiseWindow(ICore::newItemDialog()); + } }); // Open Action diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index d6f522a4acd..bb9d466d84f 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -229,7 +229,6 @@ public: void handleUnloadProject(); void unloadProjectContextMenu(); void closeAllProjects(); - void newProject(); void showSessionManager(); void updateSessionMenu(); void setSession(QAction *action); @@ -406,11 +405,6 @@ ProjectExplorerPlugin *ProjectExplorerPlugin::instance() return m_instance; } -static void updateActions() -{ - dd->updateActions(); -} - bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *error) { Q_UNUSED(error); @@ -490,8 +484,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er dd, &ProjectExplorerPluginPrivate::startupProjectChanged); connect(sessionManager, &SessionManager::projectDisplayNameChanged, dd, &ProjectExplorerPluginPrivate::projectDisplayNameChanged); - connect(sessionManager, &SessionManager::dependencyChanged, updateActions); - connect(sessionManager, &SessionManager::sessionLoaded, updateActions); + connect(sessionManager, &SessionManager::dependencyChanged, + dd, &ProjectExplorerPluginPrivate::updateActions); + connect(sessionManager, &SessionManager::sessionLoaded, + dd, &ProjectExplorerPluginPrivate::updateActions); connect(sessionManager, &SessionManager::sessionLoaded, dd, &ProjectExplorerPluginPrivate::updateWelcomePage); @@ -500,7 +496,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); connect(tree, &ProjectTree::currentNodeChanged, dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); - connect(tree, &ProjectTree::currentProjectChanged, updateActions); + connect(tree, &ProjectTree::currentProjectChanged, + dd, &ProjectExplorerPluginPrivate::updateActions); addAutoReleasedObject(new CustomWizardMetaFactory(IWizardFactory::ProjectWizard)); addAutoReleasedObject(new CustomWizardMetaFactory(IWizardFactory::FileWizard)); @@ -1120,7 +1117,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er connect(dd->m_sessionManagerAction, &QAction::triggered, dd, &ProjectExplorerPluginPrivate::showSessionManager); connect(dd->m_newAction, &QAction::triggered, - dd, &ProjectExplorerPluginPrivate::newProject); + dd, &ProjectExplorerPlugin::openNewProjectDialog); connect(dd->m_loadAction, &QAction::triggered, dd, &ProjectExplorerPluginPrivate::loadAction); connect(dd->m_buildProjectOnlyAction, &QAction::triggered, @@ -1217,8 +1214,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er connect(buildManager, &BuildManager::buildQueueFinished, dd, &ProjectExplorerPluginPrivate::buildQueueFinished, Qt::QueuedConnection); - connect(ICore::instance(), &ICore::newItemDialogRunningChanged, updateActions); - connect(ICore::instance(), &ICore::newItemDialogRunningChanged, + connect(ICore::instance(), &ICore::newItemDialogStateChanged, dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); dd->updateWelcomePage(); @@ -1411,7 +1407,7 @@ void ProjectExplorerPlugin::unloadProject(Project *project) dd->addToRecentProjects(document->filePath().toString(), project->displayName()); SessionManager::removeProject(project); - updateActions(); + dd->updateActions(); } void ProjectExplorerPluginPrivate::closeAllProjects() @@ -1509,12 +1505,15 @@ ExtensionSystem::IPlugin::ShutdownFlag ProjectExplorerPlugin::aboutToShutdown() return AsynchronousShutdown; } -void ProjectExplorerPluginPrivate::newProject() +void ProjectExplorerPlugin::openNewProjectDialog() { - ICore::showNewItemDialog(tr("New Project", "Title of dialog"), - Utils::filtered(IWizardFactory::allWizardFactories(), - [](IWizardFactory *f) { return !f->supportedProjectTypes().isEmpty(); })); - updateActions(); + if (!ICore::isNewItemDialogRunning()) { + ICore::showNewItemDialog(tr("New Project", "Title of dialog"), + Utils::filtered(IWizardFactory::allWizardFactories(), + [](IWizardFactory *f) { return !f->supportedProjectTypes().isEmpty(); })); + } else { + ICore::raiseWindow(ICore::newItemDialog()); + } } void ProjectExplorerPluginPrivate::showSessionManager() @@ -1719,7 +1718,7 @@ ProjectExplorerPlugin::OpenProjectResult ProjectExplorerPlugin::openProjects(con if (fileNames.size() > 1) SessionManager::reportProjectLoadingProgress(); } - updateActions(); + dd->updateActions(); bool switchToProjectsMode = Utils::anyOf(openedPro, &Project::needsConfiguration); @@ -2039,8 +2038,6 @@ QString ProjectExplorerPlugin::directoryFor(Node *node) void ProjectExplorerPluginPrivate::updateActions() { - m_newAction->setEnabled(!ICore::isNewItemDialogRunning()); - Project *project = SessionManager::startupProject(); Project *currentProject = ProjectTree::currentProject(); // for context menu actions diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 7aade8e988f..160c9666281 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -155,6 +155,7 @@ public: static QThreadPool *sharedThreadPool(); + static void openNewProjectDialog(); static void openOpenProjectDialog(); signals: diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index c0479c6978b..07794ef07c8 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -121,9 +121,7 @@ void ProjectWelcomePage::reloadWelcomeScreenData() void ProjectWelcomePage::newProject() { - Core::ICore::showNewItemDialog(tr("New Project"), - Utils::filtered(Core::IWizardFactory::allWizardFactories(), - [](Core::IWizardFactory *f) { return !f->supportedProjectTypes().isEmpty(); })); + ProjectExplorerPlugin::openNewProjectDialog(); } void ProjectWelcomePage::openProject()