From ea917a0aa677f807bb7d88f006f59432899cef3e Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 27 Oct 2022 13:05:18 +0200 Subject: [PATCH] ProjectExplorer: Improve UI for project-related closing actions - Do not hide, but just disable currently non-applicable actions. - Properly group the closing-related actions in the project context menu. This makes for more stable menu entries and reduces the chance for accidentally choosing the wrong one. Task-number: QTCREATORBUG-28211 Change-Id: I26ddc71839d124ec92212971f2facea82cf8d199 Reviewed-by: Reviewed-by: Alessandro Portale --- .../projectexplorer/projectexplorer.cpp | 21 +++++++++++-------- .../projectexplorerconstants.h | 1 + 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 9efea4ebb0e..f7f1cd7243c 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1015,6 +1015,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er mprojectContextMenu->appendGroup(Constants::G_PROJECT_REBUILD); mprojectContextMenu->appendGroup(Constants::G_FOLDER_LOCATIONS); mprojectContextMenu->appendGroup(Constants::G_PROJECT_FILES); + mprojectContextMenu->appendGroup(Constants::G_PROJECT_CLOSE); mprojectContextMenu->appendGroup(Constants::G_PROJECT_LAST); mprojectContextMenu->appendGroup(Constants::G_PROJECT_TREE); @@ -1082,6 +1083,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er msessionContextMenu->addSeparator(projectTreeContext, Constants::G_SESSION_FILES); mprojectContextMenu->addSeparator(projectTreeContext, Constants::G_PROJECT_FILES); + mprojectContextMenu->addSeparator(projectTreeContext, Constants::G_PROJECT_CLOSE); + mprojectContextMenu->addSeparator(projectTreeContext, Constants::G_PROJECT_LAST); msubProjectContextMenu->addSeparator(projectTreeContext, Constants::G_PROJECT_FILES); mfile->addSeparator(Core::Constants::G_FILE_PROJECT); mbuild->addSeparator(Constants::G_BUILD_ALLPROJECTS); @@ -1509,7 +1512,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er "ProjectExplorer.CloseAllFilesInProjectContextMenu"); cmd->setAttribute(Command::CA_UpdateText); cmd->setDescription(dd->m_closeProjectFilesActionContextMenu->text()); - mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_LAST); + mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_CLOSE); // unload project again, in right position dd->m_unloadActionContextMenu = new ParameterAction(tr("Close Project"), tr("Close Project \"%1\""), @@ -1517,14 +1520,14 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er cmd = ActionManager::registerAction(dd->m_unloadActionContextMenu, Constants::UNLOADCM); cmd->setAttribute(Command::CA_UpdateText); cmd->setDescription(dd->m_unloadActionContextMenu->text()); - mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_LAST); + mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_CLOSE); dd->m_unloadOthersActionContextMenu = new ParameterAction(tr("Close Other Projects"), tr("Close All Projects Except \"%1\""), ParameterAction::EnabledWithParameter, this); cmd = ActionManager::registerAction(dd->m_unloadOthersActionContextMenu, Constants::UNLOADOTHERSCM); cmd->setAttribute(Command::CA_UpdateText); cmd->setDescription(dd->m_unloadOthersActionContextMenu->text()); - mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_LAST); + mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_CLOSE); // file properties action dd->m_filePropertiesAction = new QAction(tr("Properties..."), this); @@ -2852,10 +2855,11 @@ void ProjectExplorerPluginPrivate::updateActions() const QString projectName = project ? project->displayName() : QString(); const QString projectNameContextMenu = currentProject ? currentProject->displayName() : QString(); - m_unloadAction->setParameter(projectName); + m_unloadAction->setParameter(SessionManager::projects().size() == 1 ? projectName : QString()); m_unloadActionContextMenu->setParameter(projectNameContextMenu); m_unloadOthersActionContextMenu->setParameter(projectNameContextMenu); - m_closeProjectFilesActionFileMenu->setParameter(projectName); + m_closeProjectFilesActionFileMenu->setParameter(SessionManager::projects().size() == 1 + ? projectName : QString()); m_closeProjectFilesActionContextMenu->setParameter(projectNameContextMenu); // mode bar build action @@ -2927,17 +2931,16 @@ void ProjectExplorerPluginPrivate::updateActions() // Session actions m_closeAllProjects->setEnabled(SessionManager::hasProjects()); - m_unloadAction->setVisible(SessionManager::projects().size() <= 1); + m_unloadAction->setEnabled(SessionManager::projects().size() <= 1); m_unloadAction->setEnabled(SessionManager::projects().size() == 1); m_unloadActionContextMenu->setEnabled(SessionManager::hasProjects()); - m_unloadOthersActionContextMenu->setVisible(SessionManager::projects().size() >= 2); - m_closeProjectFilesActionFileMenu->setVisible(SessionManager::projects().size() <= 1); + m_unloadOthersActionContextMenu->setEnabled(SessionManager::projects().size() >= 2); m_closeProjectFilesActionFileMenu->setEnabled(SessionManager::projects().size() == 1); m_closeProjectFilesActionContextMenu->setEnabled(SessionManager::hasProjects()); ActionContainer *aci = ActionManager::actionContainer(Constants::M_UNLOADPROJECTS); - aci->menu()->menuAction()->setVisible(SessionManager::projects().size() > 1); + aci->menu()->menuAction()->setEnabled(SessionManager::hasProjects()); m_buildSessionAction->setEnabled(buildSessionState.first); m_buildSessionForAllConfigsAction->setEnabled(buildSessionState.first); diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index ccdb0d44d3a..6c50b4893e8 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -60,6 +60,7 @@ const char G_PROJECT_BUILD[] = "Project.Group.Build"; const char G_PROJECT_REBUILD[] = "Project.Group.Rebuild"; const char G_PROJECT_RUN[] = "Project.Group.Run"; const char G_PROJECT_FILES[] = "Project.Group.Files"; +const char G_PROJECT_CLOSE[] = "Project.Group.Close"; const char G_PROJECT_TREE[] = "Project.Group.Tree"; const char G_PROJECT_LAST[] = "Project.Group.Last";