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;
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);

View File

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

View File

@@ -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);