ProjectExplorer: add rescan action to workspace project context menu

Change-Id: I7a823853c3681da5ec5019a3f66bd98aa1c81cb2
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
David Schulz
2024-06-20 15:14:41 +02:00
parent 94663d0db7
commit 805c687dbc

View File

@@ -32,7 +32,7 @@ const QLatin1StringView WORKSPACE_PROJECT_RUNCONFIG_ID{"WorkspaceProject.RunConf
const QLatin1StringView PROJECT_NAME_KEY{"project.name"}; const QLatin1StringView PROJECT_NAME_KEY{"project.name"};
const QLatin1StringView FILES_EXCLUDE_KEY{"files.exclude"}; const QLatin1StringView FILES_EXCLUDE_KEY{"files.exclude"};
const QLatin1StringView EXCLUDE_ACTION_ID{"ProjectExplorer.ExcludeFromWorkspace"}; const QLatin1StringView EXCLUDE_ACTION_ID{"ProjectExplorer.ExcludeFromWorkspace"};
const QLatin1StringView RESCAN_ACTION_ID{"ProjectExplorer.RescanWorkspace"};
using namespace Utils; using namespace Utils;
using namespace Core; using namespace Core;
@@ -308,29 +308,61 @@ void setupWorkspaceProject(QObject *guard)
ProjectManager::registerProjectType<WorkspaceProject>(FOLDER_MIMETYPE); ProjectManager::registerProjectType<WorkspaceProject>(FOLDER_MIMETYPE);
ProjectManager::registerProjectType<WorkspaceProject>(WORKSPACE_MIMETYPE); ProjectManager::registerProjectType<WorkspaceProject>(WORKSPACE_MIMETYPE);
QAction *excludeAction = nullptr;
ActionBuilder(guard, Id::fromString(EXCLUDE_ACTION_ID))
.setContext(Id::fromString(WORKSPACE_PROJECT_ID))
.setText(Tr::tr("Exclude from Project"))
.addToContainer(Constants::M_FOLDERCONTEXT, Constants::G_FOLDER_OTHER)
.addToContainer(Constants::M_FILECONTEXT, Constants::G_FILE_OTHER)
.bindContextAction(&excludeAction)
.setCommandAttribute(Command::CA_Hide)
.addOnTriggered(guard, [] {
Node *node = ProjectTree::currentNode();
QTC_ASSERT(node, return);
const auto project = qobject_cast<WorkspaceProject *>(node->getProject());
QTC_ASSERT(project, return);
project->excludeNode(node);
});
QAction *rescanAction = nullptr;
ActionBuilder(guard, Id::fromString(RESCAN_ACTION_ID))
.setContext(Id::fromString(WORKSPACE_PROJECT_ID))
.setText(Tr::tr("Rescan Workspace"))
.addToContainer(Constants::M_PROJECTCONTEXT, Constants::G_PROJECT_REBUILD)
.bindContextAction(&rescanAction)
.setCommandAttribute(Command::CA_Hide)
.addOnTriggered(guard, [] {
Node *node = ProjectTree::currentNode();
QTC_ASSERT(node, return);
const auto project = qobject_cast<WorkspaceProject *>(node->getProject());
QTC_ASSERT(project, return);
if (auto target = project->activeTarget()) {
if (target->buildSystem())
target->buildSystem()->triggerParsing();
}
});
QObject::connect( QObject::connect(
ProjectTree::instance(), ProjectTree::instance(),
&ProjectTree::aboutToShowContextMenu, &ProjectTree::aboutToShowContextMenu,
ProjectExplorerPlugin::instance(), ProjectExplorerPlugin::instance(),
[](Node *node) { [excludeAction, rescanAction](Node *node) {
const bool enabled = node && node->isEnabled() const bool visible = node && qobject_cast<WorkspaceProject *>(node->getProject());
&& qobject_cast<WorkspaceProject *>(node->getProject()); excludeAction->setVisible(visible);
ActionManager::command(Id::fromString(EXCLUDE_ACTION_ID))->action()->setEnabled(enabled); rescanAction->setVisible(visible);
if (visible) {
excludeAction->setEnabled(node->isEnabled());
bool enableRescan = false;
if (Project *project = node->getProject()) {
if (Target *target = project->activeTarget()) {
if (BuildSystem *buildSystem = target->buildSystem())
enableRescan = !buildSystem->isParsing();
}
}
rescanAction->setEnabled(enableRescan);
}
}); });
ActionBuilder excludeAction(guard, Id::fromString(EXCLUDE_ACTION_ID));
excludeAction.setContext(Id::fromString(WORKSPACE_PROJECT_ID));
excludeAction.setText(Tr::tr("Exclude from Project"));
excludeAction.addToContainer(Constants::M_FOLDERCONTEXT, Constants::G_FOLDER_OTHER);
excludeAction.addToContainer(Constants::M_FILECONTEXT, Constants::G_FILE_OTHER);
excludeAction.addOnTriggered([] {
Node *node = ProjectTree::currentNode();
QTC_ASSERT(node, return);
const auto project = qobject_cast<WorkspaceProject *>(node->getProject());
QTC_ASSERT(project, return);
project->excludeNode(node);
});
static WorkspaceProjectRunConfigurationFactory theRunConfigurationFactory; static WorkspaceProjectRunConfigurationFactory theRunConfigurationFactory;
static WorkspaceProjectRunWorkerFactory theRunWorkerFactory; static WorkspaceProjectRunWorkerFactory theRunWorkerFactory;
} }