forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user