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 <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2020-03-11 15:34:43 +01:00
parent 9594612e5e
commit be9d5fa0d9
3 changed files with 23 additions and 11 deletions

View File

@@ -753,6 +753,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
ProjectTree *tree = &dd->m_projectTree; ProjectTree *tree = &dd->m_projectTree;
connect(tree, &ProjectTree::currentProjectChanged, connect(tree, &ProjectTree::currentProjectChanged,
dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); dd, &ProjectExplorerPluginPrivate::updateContextMenuActions);
connect(tree, &ProjectTree::nodeActionsChanged,
dd, &ProjectExplorerPluginPrivate::updateContextMenuActions);
connect(tree, &ProjectTree::currentNodeChanged, connect(tree, &ProjectTree::currentNodeChanged,
dd, &ProjectExplorerPluginPrivate::updateContextMenuActions); dd, &ProjectExplorerPluginPrivate::updateContextMenuActions);
connect(tree, &ProjectTree::currentProjectChanged, connect(tree, &ProjectTree::currentProjectChanged,
@@ -3249,20 +3251,28 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions()
return currentNode->supportsAction(action, currentNode); 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()) { if (currentNode->asFolderNode()) {
// Also handles ProjectNode // Also handles ProjectNode
m_addNewFileAction->setEnabled(supports(AddNewFile) m_addNewFileAction->setEnabled(canEditProject && supports(AddNewFile)
&& !ICore::isNewItemDialogRunning()); && !ICore::isNewItemDialogRunning());
m_addNewSubprojectAction->setEnabled(currentNode->isProjectNodeType() m_addNewSubprojectAction->setEnabled(canEditProject && currentNode->isProjectNodeType()
&& supports(AddSubProject) && supports(AddSubProject)
&& !ICore::isNewItemDialogRunning()); && !ICore::isNewItemDialogRunning());
m_addExistingProjectsAction->setEnabled(currentNode->isProjectNodeType() m_addExistingProjectsAction->setEnabled(canEditProject
&& currentNode->isProjectNodeType()
&& supports(AddExistingProject)); && supports(AddExistingProject));
m_removeProjectAction->setEnabled(currentNode->isProjectNodeType() m_removeProjectAction->setEnabled(canEditProject && currentNode->isProjectNodeType()
&& supports(RemoveSubProject)); && supports(RemoveSubProject));
m_addExistingFilesAction->setEnabled(supports(AddExistingFile)); m_addExistingFilesAction->setEnabled(canEditProject && supports(AddExistingFile));
m_addExistingDirectoryAction->setEnabled(supports(AddExistingDirectory)); m_addExistingDirectoryAction->setEnabled(canEditProject
m_renameFileAction->setEnabled(supports(Rename)); && supports(AddExistingDirectory));
m_renameFileAction->setEnabled(canEditProject && supports(Rename));
} else if (auto fileNode = currentNode->asFileNode()) { } else if (auto fileNode = currentNode->asFileNode()) {
// Enable and show remove / delete in magic ways: // Enable and show remove / delete in magic ways:
// If both are disabled show Remove // If both are disabled show Remove
@@ -3270,20 +3280,20 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions()
// If only removeFile is enabled only show it // If only removeFile is enabled only show it
// If only deleteFile is enable only show it // If only deleteFile is enable only show it
bool isTypeProject = fileNode->fileType() == FileType::Project; bool isTypeProject = fileNode->fileType() == FileType::Project;
bool enableRemove = !isTypeProject && supports(RemoveFile); bool enableRemove = canEditProject && !isTypeProject && supports(RemoveFile);
m_removeFileAction->setEnabled(enableRemove); m_removeFileAction->setEnabled(enableRemove);
bool enableDelete = !isTypeProject && supports(EraseFile); bool enableDelete = canEditProject && !isTypeProject && supports(EraseFile);
m_deleteFileAction->setEnabled(enableDelete); m_deleteFileAction->setEnabled(enableDelete);
m_deleteFileAction->setVisible(enableDelete); m_deleteFileAction->setVisible(enableDelete);
m_removeFileAction->setVisible(!enableDelete || enableRemove); m_removeFileAction->setVisible(!enableDelete || enableRemove);
m_renameFileAction->setEnabled(!isTypeProject && supports(Rename)); m_renameFileAction->setEnabled(canEditProject && !isTypeProject && supports(Rename));
const bool currentNodeIsTextFile = isTextFile( const bool currentNodeIsTextFile = isTextFile(
currentNode->filePath().toString()); currentNode->filePath().toString());
m_diffFileAction->setEnabled(DiffService::instance() m_diffFileAction->setEnabled(DiffService::instance()
&& currentNodeIsTextFile && TextEditor::TextDocument::currentTextDocument()); && currentNodeIsTextFile && TextEditor::TextDocument::currentTextDocument());
const bool canDuplicate = supports(AddNewFile) const bool canDuplicate = canEditProject && supports(AddNewFile)
&& currentNode->asFileNode()->fileType() != FileType::Project; && currentNode->asFileNode()->fileType() != FileType::Project;
m_duplicateFileAction->setVisible(canDuplicate); m_duplicateFileAction->setVisible(canDuplicate);
m_duplicateFileAction->setEnabled(canDuplicate); m_duplicateFileAction->setEnabled(canDuplicate);

View File

@@ -370,6 +370,7 @@ void FlatModel::handleProjectAdded(Project *project)
this, [this, project]() { this, [this, project]() {
if (nodeForProject(project)) if (nodeForProject(project))
parsingStateChanged(project); parsingStateChanged(project);
emit ProjectTree::instance()->nodeActionsChanged();
}); });
addOrRebuildProjectModel(project); addOrRebuildProjectModel(project);
} }

View File

@@ -95,6 +95,7 @@ public:
signals: signals:
void currentProjectChanged(ProjectExplorer::Project *project); void currentProjectChanged(ProjectExplorer::Project *project);
void currentNodeChanged(); void currentNodeChanged();
void nodeActionsChanged();
// Emitted whenever the model needs to send a update signal. // Emitted whenever the model needs to send a update signal.
void subtreeChanged(ProjectExplorer::FolderNode *node); void subtreeChanged(ProjectExplorer::FolderNode *node);