ProjectExplorer: Allow to close all files in a project

[ChangeLog] Users can now close all open files of a specific project

Fixes: QTCREATORBUG-15593
Change-Id: Icb755511ae682042433030c33671a214c448b8be
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2019-02-04 16:35:26 +01:00
parent a0969a3c09
commit 03f76770e1

View File

@@ -110,6 +110,7 @@
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
#include <coreplugin/actionmanager/command.h> #include <coreplugin/actionmanager/command.h>
#include <coreplugin/editormanager/documentmodel.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/findplaceholder.h> #include <coreplugin/findplaceholder.h>
#include <coreplugin/vcsmanager.h> #include <coreplugin/vcsmanager.h>
@@ -360,6 +361,7 @@ public:
void handleRenameFile(); void handleRenameFile();
void handleSetStartupProject(); void handleSetStartupProject();
void setStartupProject(ProjectExplorer::Project *project); void setStartupProject(ProjectExplorer::Project *project);
void closeAllFilesInProject(const Project *project);
void updateRecentProjectMenu(); void updateRecentProjectMenu();
void clearRecentProjects(); void clearRecentProjects();
@@ -441,6 +443,8 @@ public:
QAction *m_openFileAction; QAction *m_openFileAction;
QAction *m_projectTreeCollapseAllAction; QAction *m_projectTreeCollapseAllAction;
QAction *m_projectTreeExpandAllAction; QAction *m_projectTreeExpandAllAction;
Utils::ParameterAction *m_closeProjectFilesActionFileMenu;
Utils::ParameterAction *m_closeProjectFilesActionContextMenu;
QAction *m_searchOnFileSystem; QAction *m_searchOnFileSystem;
QAction *m_showInGraphicalShell; QAction *m_showInGraphicalShell;
QAction *m_openTerminalHere; QAction *m_openTerminalHere;
@@ -933,6 +937,15 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
cmd->setDescription(dd->m_unloadAction->text()); cmd->setDescription(dd->m_unloadAction->text());
mfile->addAction(cmd, Core::Constants::G_FILE_PROJECT); mfile->addAction(cmd, Core::Constants::G_FILE_PROJECT);
dd->m_closeProjectFilesActionFileMenu = new Utils::ParameterAction(
tr("Close All Files in Project"), tr("Close All Files in Project \"%1\""),
Utils::ParameterAction::AlwaysEnabled, this);
cmd = ActionManager::registerAction(dd->m_closeProjectFilesActionFileMenu,
"ProjectExplorer.CloseProjectFilesFileMenu");
cmd->setAttribute(Command::CA_UpdateText);
cmd->setDescription(dd->m_closeProjectFilesActionFileMenu->text());
mfile->addAction(cmd, Core::Constants::G_FILE_PROJECT);
ActionContainer *munload = ActionContainer *munload =
ActionManager::createMenu(Constants::M_UNLOADPROJECTS); ActionManager::createMenu(Constants::M_UNLOADPROJECTS);
munload->menu()->setTitle(tr("Close Pro&ject")); munload->menu()->setTitle(tr("Close Pro&ject"));
@@ -1140,6 +1153,15 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
cmd->setDescription(dd->m_unloadActionContextMenu->text()); cmd->setDescription(dd->m_unloadActionContextMenu->text());
mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_LAST); mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_LAST);
dd->m_closeProjectFilesActionContextMenu = new Utils::ParameterAction(
tr("Close All Files"), tr("Close All Files in Project \"%1\""),
Utils::ParameterAction::EnabledWithParameter, this);
cmd = ActionManager::registerAction(dd->m_closeProjectFilesActionContextMenu,
"ProjectExplorer.CloseAllFilesInProjectContextMenu");
cmd->setAttribute(Command::CA_UpdateText);
cmd->setDescription(dd->m_closeProjectFilesActionContextMenu->text());
mprojectContextMenu->addAction(cmd, Constants::G_PROJECT_LAST);
// file properties action // file properties action
dd->m_filePropertiesAction = new QAction(tr("Properties..."), this); dd->m_filePropertiesAction = new QAction(tr("Properties..."), this);
cmd = ActionManager::registerAction(dd->m_filePropertiesAction, Constants::FILEPROPERTIES, cmd = ActionManager::registerAction(dd->m_filePropertiesAction, Constants::FILEPROPERTIES,
@@ -1442,6 +1464,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
dd, &ProjectExplorerPluginPrivate::handleRenameFile); dd, &ProjectExplorerPluginPrivate::handleRenameFile);
connect(dd->m_setStartupProjectAction, &QAction::triggered, connect(dd->m_setStartupProjectAction, &QAction::triggered,
dd, &ProjectExplorerPluginPrivate::handleSetStartupProject); dd, &ProjectExplorerPluginPrivate::handleSetStartupProject);
connect(dd->m_closeProjectFilesActionFileMenu, &QAction::triggered,
dd, [] { dd->closeAllFilesInProject(SessionManager::projects().first()); });
connect(dd->m_closeProjectFilesActionContextMenu, &QAction::triggered,
dd, [] { dd->closeAllFilesInProject(ProjectTree::currentProject()); });
connect(dd->m_projectTreeCollapseAllAction, &QAction::triggered, connect(dd->m_projectTreeCollapseAllAction, &QAction::triggered,
ProjectTree::instance(), &ProjectTree::collapseAll); ProjectTree::instance(), &ProjectTree::collapseAll);
connect(dd->m_projectTreeExpandAllAction, &QAction::triggered, connect(dd->m_projectTreeExpandAllAction, &QAction::triggered,
@@ -1824,6 +1850,26 @@ void ProjectExplorerPluginPrivate::setStartupProject(Project *project)
updateActions(); updateActions();
} }
void ProjectExplorerPluginPrivate::closeAllFilesInProject(const Project *project)
{
QTC_ASSERT(project, return);
const Utils::FileNameList filesInProject = project->files(Project::AllFiles);
QList<IDocument *> openFiles = DocumentModel::openedDocuments();
Utils::erase(openFiles, [filesInProject](const IDocument *doc) {
return !filesInProject.contains(doc->filePath());
});
for (const Project * const otherProject : SessionManager::projects()) {
if (otherProject == project)
continue;
const Utils::FileNameList filesInOtherProject
= otherProject->files(Project::AllFiles);
Utils::erase(openFiles, [filesInOtherProject](const IDocument *doc) {
return filesInOtherProject.contains(doc->filePath());
});
}
EditorManager::closeDocuments(openFiles);
}
void ProjectExplorerPluginPrivate::savePersistentSettings() void ProjectExplorerPluginPrivate::savePersistentSettings()
{ {
if (dd->m_shuttingDown) if (dd->m_shuttingDown)
@@ -2332,6 +2378,8 @@ void ProjectExplorerPluginPrivate::updateActions()
m_unloadAction->setParameter(projectName); m_unloadAction->setParameter(projectName);
m_unloadActionContextMenu->setParameter(projectNameContextMenu); m_unloadActionContextMenu->setParameter(projectNameContextMenu);
m_closeProjectFilesActionFileMenu->setParameter(projectName);
m_closeProjectFilesActionContextMenu->setParameter(projectNameContextMenu);
// mode bar build action // mode bar build action
QAction * const buildAction = ActionManager::command(Constants::BUILD)->action(); QAction * const buildAction = ActionManager::command(Constants::BUILD)->action();
@@ -2390,6 +2438,9 @@ void ProjectExplorerPluginPrivate::updateActions()
m_unloadAction->setVisible(SessionManager::projects().size() <= 1); 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_unloadActionContextMenu->setEnabled(SessionManager::hasProjects());
m_closeProjectFilesActionFileMenu->setVisible(SessionManager::projects().size() <= 1);
m_closeProjectFilesActionFileMenu->setEnabled(SessionManager::projects().size() == 1);
m_closeProjectFilesActionContextMenu->setEnabled(SessionManager::hasProjects());
ActionContainer *aci = ActionContainer *aci =
ActionManager::actionContainer(Constants::M_UNLOADPROJECTS); ActionManager::actionContainer(Constants::M_UNLOADPROJECTS);