From 1f81f63b56f8681a97e31d17a15594fbe002dab9 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 16 Jul 2019 15:55:03 +0200 Subject: [PATCH] GenericProjectManager: Allow users to remove directories from a project ... via the project context menu. Fixes: QTCREATORBUG-16575 Change-Id: I02650a8ef70ffe22c6a42a5450588be4506af925 Reviewed-by: Christian Stenger --- .../genericprojectmanager/genericproject.h | 3 ++ .../genericprojectplugin.cpp | 31 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h index d914ddc1495..213bd60471d 100644 --- a/src/plugins/genericprojectmanager/genericproject.h +++ b/src/plugins/genericprojectmanager/genericproject.h @@ -26,6 +26,7 @@ #pragma once #include +#include namespace CppTools { class CppProjectUpdater; } namespace Utils { class FileSystemWatcher; } @@ -46,6 +47,8 @@ public: bool setFiles(const QStringList &filePaths); bool renameFile(const QString &filePath, const QString &newFilePath); + Utils::FilePath filesFilePath() const { return Utils::FilePath::fromString(m_filesFileName); } + enum RefreshOptions { Files = 0x01, Configuration = 0x02, diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.cpp b/src/plugins/genericprojectmanager/genericprojectplugin.cpp index 73183ffb139..668ddd37c4b 100644 --- a/src/plugins/genericprojectmanager/genericprojectplugin.cpp +++ b/src/plugins/genericprojectmanager/genericprojectplugin.cpp @@ -39,16 +39,21 @@ #include #include +#include #include #include +#include #include #include +#include #include using namespace Core; using namespace ProjectExplorer; +using namespace Utils; +namespace PEC = ProjectExplorer::Constants; namespace GenericProjectManager { namespace Internal { @@ -85,13 +90,12 @@ GenericProjectPluginPrivate::GenericProjectPluginPrivate() IWizardFactory::registerFactoryCreator([] { return QList{new GenericProjectWizard}; }); - ActionContainer *mproject = - ActionManager::actionContainer(ProjectExplorer::Constants::M_PROJECTCONTEXT); + ActionContainer *mproject = ActionManager::actionContainer(PEC::M_PROJECTCONTEXT); Command *command = ActionManager::registerAction(&editFilesAction, "GenericProjectManager.EditFiles", Context(Constants::GENERICPROJECT_ID)); command->setAttribute(Command::CA_Hide); - mproject->addAction(command, ProjectExplorer::Constants::G_PROJECT_FILES); + mproject->addAction(command, PEC::G_PROJECT_FILES); connect(&editFilesAction, &QAction::triggered, this, [] { auto genericProject = qobject_cast(ProjectTree::currentProject()); @@ -101,7 +105,26 @@ GenericProjectPluginPrivate::GenericProjectPluginPrivate() genericProject->files(Project::AllFiles), ICore::mainWindow()); if (sfd.exec() == QDialog::Accepted) - genericProject->setFiles(Utils::transform(sfd.selectedFiles(), &Utils::FilePath::toString)); + genericProject->setFiles(transform(sfd.selectedFiles(), &FilePath::toString)); + }); + + + const auto removeDirAction = new QAction(tr("Remove Directory"), this); + Command * const cmd = ActionManager::registerAction(removeDirAction, "GenericProject.RemoveDir", + Context(PEC::C_PROJECT_TREE)); + ActionManager::actionContainer(PEC::M_FOLDERCONTEXT)->addAction(cmd, PEC::G_FOLDER_OTHER); + connect(removeDirAction, &QAction::triggered, this, [] { + const auto folderNode = ProjectTree::currentNode()->asFolderNode(); + QTC_ASSERT(folderNode, return); + const auto project = qobject_cast(folderNode->getProject()); + QTC_ASSERT(project, return); + const QStringList filesToRemove = transform( + folderNode->findNodes([](const Node *node) { return node->asFileNode(); }), + [](const Node *node) { return node->filePath().toString();}); + if (!project->removeFiles(filesToRemove)) { + TaskHub::addTask(Task::Error, tr("Project files list update failed."), + PEC::TASK_CATEGORY_BUILDSYSTEM, project->filesFilePath()); + } }); }