From be9d5fa0d9524b6d0968f5a8f271d12a355b7294 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 11 Mar 2020 15:34:43 +0100 Subject: [PATCH] Disable project-editing actions when parsing is scheduled For the purpose of enabling context menu actions such as adding or removing files, there is no difference between "parsing" and "parse scheduled". Task-number: QTCREATORBUG-22508 Change-Id: I484a9257b4e4aeb6e0ff089c58be513e9fd7a9fd Reviewed-by: hjk --- .../projectexplorer/projectexplorer.cpp | 32 ++++++++++++------- src/plugins/projectexplorer/projectmodels.cpp | 1 + src/plugins/projectexplorer/projecttree.h | 1 + 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 440acf9cf09..bc2ee5e055d 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -753,6 +753,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er ProjectTree *tree = &dd->m_projectTree; connect(tree, &ProjectTree::currentProjectChanged, dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); + connect(tree, &ProjectTree::nodeActionsChanged, + dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); connect(tree, &ProjectTree::currentNodeChanged, dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); connect(tree, &ProjectTree::currentProjectChanged, @@ -3249,20 +3251,28 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions() return currentNode->supportsAction(action, currentNode); }; + bool canEditProject = true; + if (project && project->activeTarget()) { + const BuildSystem * const bs = project->activeTarget()->buildSystem(); + if (bs->isParsing() || bs->isWaitingForParse()) + canEditProject = false; + } if (currentNode->asFolderNode()) { // Also handles ProjectNode - m_addNewFileAction->setEnabled(supports(AddNewFile) + m_addNewFileAction->setEnabled(canEditProject && supports(AddNewFile) && !ICore::isNewItemDialogRunning()); - m_addNewSubprojectAction->setEnabled(currentNode->isProjectNodeType() + m_addNewSubprojectAction->setEnabled(canEditProject && currentNode->isProjectNodeType() && supports(AddSubProject) && !ICore::isNewItemDialogRunning()); - m_addExistingProjectsAction->setEnabled(currentNode->isProjectNodeType() + m_addExistingProjectsAction->setEnabled(canEditProject + && currentNode->isProjectNodeType() && supports(AddExistingProject)); - m_removeProjectAction->setEnabled(currentNode->isProjectNodeType() + m_removeProjectAction->setEnabled(canEditProject && currentNode->isProjectNodeType() && supports(RemoveSubProject)); - m_addExistingFilesAction->setEnabled(supports(AddExistingFile)); - m_addExistingDirectoryAction->setEnabled(supports(AddExistingDirectory)); - m_renameFileAction->setEnabled(supports(Rename)); + m_addExistingFilesAction->setEnabled(canEditProject && supports(AddExistingFile)); + m_addExistingDirectoryAction->setEnabled(canEditProject + && supports(AddExistingDirectory)); + m_renameFileAction->setEnabled(canEditProject && supports(Rename)); } else if (auto fileNode = currentNode->asFileNode()) { // Enable and show remove / delete in magic ways: // If both are disabled show Remove @@ -3270,20 +3280,20 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions() // If only removeFile is enabled only show it // If only deleteFile is enable only show it bool isTypeProject = fileNode->fileType() == FileType::Project; - bool enableRemove = !isTypeProject && supports(RemoveFile); + bool enableRemove = canEditProject && !isTypeProject && supports(RemoveFile); m_removeFileAction->setEnabled(enableRemove); - bool enableDelete = !isTypeProject && supports(EraseFile); + bool enableDelete = canEditProject && !isTypeProject && supports(EraseFile); m_deleteFileAction->setEnabled(enableDelete); m_deleteFileAction->setVisible(enableDelete); m_removeFileAction->setVisible(!enableDelete || enableRemove); - m_renameFileAction->setEnabled(!isTypeProject && supports(Rename)); + m_renameFileAction->setEnabled(canEditProject && !isTypeProject && supports(Rename)); const bool currentNodeIsTextFile = isTextFile( currentNode->filePath().toString()); m_diffFileAction->setEnabled(DiffService::instance() && currentNodeIsTextFile && TextEditor::TextDocument::currentTextDocument()); - const bool canDuplicate = supports(AddNewFile) + const bool canDuplicate = canEditProject && supports(AddNewFile) && currentNode->asFileNode()->fileType() != FileType::Project; m_duplicateFileAction->setVisible(canDuplicate); m_duplicateFileAction->setEnabled(canDuplicate); diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index 8a47245d1b3..43dc4ee4122 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -370,6 +370,7 @@ void FlatModel::handleProjectAdded(Project *project) this, [this, project]() { if (nodeForProject(project)) parsingStateChanged(project); + emit ProjectTree::instance()->nodeActionsChanged(); }); addOrRebuildProjectModel(project); } diff --git a/src/plugins/projectexplorer/projecttree.h b/src/plugins/projectexplorer/projecttree.h index bedcb45862d..f8d024976ac 100644 --- a/src/plugins/projectexplorer/projecttree.h +++ b/src/plugins/projectexplorer/projecttree.h @@ -95,6 +95,7 @@ public: signals: void currentProjectChanged(ProjectExplorer::Project *project); void currentNodeChanged(); + void nodeActionsChanged(); // Emitted whenever the model needs to send a update signal. void subtreeChanged(ProjectExplorer::FolderNode *node);