summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjk <hjk@qt.io>2017-03-15 15:46:48 +0100
committerhjk <hjk@qt.io>2017-04-05 12:47:03 +0000
commitbd5e2faa756f1c852a0d7ae019561413e5278cc3 (patch)
treee1d0680c4e5e5fa9aeb6db14ecbc48c6d67ceae8
parent8410c0bbad626c8ca38a161968c71a09ffb47df7 (diff)
downloadqt-creator-bd5e2faa756f1c852a0d7ae019561413e5278cc3.tar.gz
ProjectNodes: Handle supported actions one-by-one
Getting the full list for a node can get quite expensive e.g. in cases of recursive calls of QMakeProjectManager::findPriFile. However, the FlatModel needs to decide quickly on whether an item is editable to potentially allow renaming. So split up QList<Actions> supportedActions() into individual bool supportsAction(action) calls and make sure Rename is not on the critical path. Task-number: QTCREATORBUG-17953 Change-Id: I31841847f8aa7d7b94c63d76ce71efb1c930fa69 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
-rw-r--r--src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp6
-rw-r--r--src/plugins/autotoolsprojectmanager/autotoolsprojectnode.h1
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp24
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectnodes.h6
-rw-r--r--src/plugins/genericprojectmanager/genericprojectnodes.cpp14
-rw-r--r--src/plugins/genericprojectmanager/genericprojectnodes.h3
-rw-r--r--src/plugins/nim/project/nimprojectnode.cpp18
-rw-r--r--src/plugins/nim/project/nimprojectnode.h2
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp38
-rw-r--r--src/plugins/projectexplorer/projectmodels.cpp2
-rw-r--r--src/plugins/projectexplorer/projectnodes.cpp32
-rw-r--r--src/plugins/projectexplorer/projectnodes.h7
-rw-r--r--src/plugins/projectexplorer/projectwizardpage.cpp6
-rw-r--r--src/plugins/pythoneditor/pythoneditorplugin.cpp11
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.cpp43
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.h10
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.cpp43
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.h2
-rw-r--r--src/plugins/qmldesigner/documentmanager.cpp2
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectnodes.cpp14
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectnodes.h12
-rw-r--r--src/plugins/resourceeditor/resourceeditorplugin.cpp4
-rw-r--r--src/plugins/resourceeditor/resourcenode.cpp67
-rw-r--r--src/plugins/resourceeditor/resourcenode.h6
24 files changed, 162 insertions, 211 deletions
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp b/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp
index e98246ed52..793d63a762 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.cpp
@@ -42,9 +42,3 @@ bool AutotoolsProjectNode::showInSimpleTree() const
{
return true;
}
-
-QList<ProjectAction> AutotoolsProjectNode::supportedActions(Node *node) const
-{
- Q_UNUSED(node);
- return QList<ProjectAction>();
-}
diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.h b/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.h
index 088e007a4a..a60479eb8c 100644
--- a/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.h
+++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectnode.h
@@ -51,7 +51,6 @@ public:
AutotoolsProjectNode(const Utils::FileName &projectDirectory);
bool showInSimpleTree() const override;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
};
} // namespace Internal
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp
index 21b491e299..79337e0440 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.cpp
@@ -56,12 +56,6 @@ bool CMakeInputsNode::showInSimpleTree() const
return false;
}
-QList<ProjectExplorer::ProjectAction> CMakeInputsNode::supportedActions(ProjectExplorer::Node *node) const
-{
- Q_UNUSED(node);
- return QList<ProjectExplorer::ProjectAction>();
-}
-
CMakeListsNode::CMakeListsNode(const Utils::FileName &cmakeListPath) :
ProjectExplorer::ProjectNode(cmakeListPath)
{
@@ -80,12 +74,6 @@ bool CMakeListsNode::showInSimpleTree() const
return false;
}
-QList<ProjectExplorer::ProjectAction> CMakeListsNode::supportedActions(ProjectExplorer::Node *node) const
-{
- Q_UNUSED(node);
- return QList<ProjectExplorer::ProjectAction>();
-}
-
CMakeProjectNode::CMakeProjectNode(const Utils::FileName &directory) :
ProjectExplorer::ProjectNode(directory)
{
@@ -103,12 +91,6 @@ QString CMakeProjectNode::tooltip() const
return QString();
}
-QList<ProjectExplorer::ProjectAction> CMakeProjectNode::supportedActions(ProjectExplorer::Node *node) const
-{
- Q_UNUSED(node);
- return QList<ProjectExplorer::ProjectAction>();
-}
-
CMakeTargetNode::CMakeTargetNode(const Utils::FileName &directory) :
ProjectExplorer::ProjectNode(directory)
{
@@ -126,12 +108,6 @@ QString CMakeTargetNode::tooltip() const
return m_tooltip;
}
-QList<ProjectExplorer::ProjectAction> CMakeTargetNode::supportedActions(ProjectExplorer::Node *node) const
-{
- Q_UNUSED(node);
- return QList<ProjectExplorer::ProjectAction>();
-}
-
void CMakeTargetNode::setTargetInformation(const QList<Utils::FileName> &artifacts,
const QString &type)
{
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.h b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.h
index ca1fedd6e8..d4160c7762 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectnodes.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectnodes.h
@@ -28,8 +28,6 @@
#include <projectexplorer/projectnodes.h>
namespace CMakeProjectManager {
-class CMakeProject;
-
namespace Internal {
class CMakeInputsNode : public ProjectExplorer::ProjectNode
@@ -40,7 +38,6 @@ public:
static Utils::FileName inputsPathFromCMakeListsPath(const Utils::FileName &cmakeLists);
bool showInSimpleTree() const final;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const final;
};
class CMakeListsNode : public ProjectExplorer::ProjectNode
@@ -49,7 +46,6 @@ public:
CMakeListsNode(const Utils::FileName &cmakeListPath);
bool showInSimpleTree() const final;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const final;
};
class CMakeProjectNode : public ProjectExplorer::ProjectNode
@@ -59,7 +55,6 @@ public:
bool showInSimpleTree() const final;
QString tooltip() const final;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const final;
};
class CMakeTargetNode : public ProjectExplorer::ProjectNode
@@ -71,7 +66,6 @@ public:
bool showInSimpleTree() const final;
QString tooltip() const final;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const final;
private:
QString m_tooltip;
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
index bdd7b71cdf..271e8a25bd 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
@@ -78,16 +78,14 @@ bool GenericProjectNode::showInSimpleTree() const
return true;
}
-QList<ProjectAction> GenericProjectNode::supportedActions(Node *node) const
+bool GenericProjectNode::supportsAction(ProjectAction action, Node *node) const
{
Q_UNUSED(node);
- return {
- AddNewFile,
- AddExistingFile,
- AddExistingDirectory,
- RemoveFile,
- Rename
- };
+ return action == AddNewFile
+ || action == AddExistingFile
+ || action == AddExistingDirectory
+ || action == RemoveFile
+ || action == Rename;
}
bool GenericProjectNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.h b/src/plugins/genericprojectmanager/genericprojectnodes.h
index 3c51d75fa4..8106764262 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.h
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.h
@@ -44,8 +44,7 @@ public:
explicit GenericProjectNode(GenericProject *project);
bool showInSimpleTree() const override;
-
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const override;
bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0) override;
bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0) override;
diff --git a/src/plugins/nim/project/nimprojectnode.cpp b/src/plugins/nim/project/nimprojectnode.cpp
index 5c22cea185..223c6f950d 100644
--- a/src/plugins/nim/project/nimprojectnode.cpp
+++ b/src/plugins/nim/project/nimprojectnode.cpp
@@ -37,23 +37,19 @@ NimProjectNode::NimProjectNode(NimProject &project,
, m_project(project)
{}
-QList<ProjectAction> NimProjectNode::supportedActions(Node *node) const
+bool NimProjectNode::supportsAction(ProjectAction action, Node *node) const
{
- static const QList<ProjectAction> fileActions = {ProjectAction::Rename,
- ProjectAction::RemoveFile
- };
- static const QList<ProjectAction> folderActions = {ProjectAction::AddNewFile,
- ProjectAction::RemoveFile,
- ProjectAction::AddExistingFile
- };
switch (node->nodeType()) {
case NodeType::File:
- return fileActions;
+ return action == ProjectAction::Rename
+ || action == ProjectAction::RemoveFile;
case NodeType::Folder:
case NodeType::Project:
- return folderActions;
+ return action == ProjectAction::AddNewFile
+ || action == ProjectAction::RemoveFile
+ || action == ProjectAction::AddExistingFile;
default:
- return ProjectNode::supportedActions(node);
+ return ProjectNode::supportsAction(action, node);
}
}
diff --git a/src/plugins/nim/project/nimprojectnode.h b/src/plugins/nim/project/nimprojectnode.h
index ba4dd63415..05270846f9 100644
--- a/src/plugins/nim/project/nimprojectnode.h
+++ b/src/plugins/nim/project/nimprojectnode.h
@@ -38,7 +38,7 @@ class NimProjectNode : public ProjectExplorer::ProjectNode
public:
NimProjectNode(NimProject &project, const Utils::FileName &projectFilePath);
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const override;
bool addFiles(const QStringList &filePaths, QStringList *) override;
bool removeFiles(const QStringList &filePaths, QStringList *) override;
bool deleteFiles(const QStringList &) override;
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 2b0eee0548..0d47cffeb9 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -2938,8 +2938,6 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions()
Node *currentNode = ProjectTree::currentNode();
if (currentNode && currentNode->managingProject()) {
- QList<ProjectAction> actions = currentNode->supportedActions(currentNode);
-
ProjectNode *pn;
if (ContainerNode *cn = currentNode->asContainerNode())
pn = cn->rootProjectNode();
@@ -2967,56 +2965,61 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions()
}
}
}
+
+ auto supports = [currentNode](ProjectAction action) {
+ return currentNode->supportsAction(action, currentNode);
+ };
+
if (currentNode->asFolderNode()) {
// Also handles ProjectNode
- m_addNewFileAction->setEnabled(actions.contains(AddNewFile)
+ m_addNewFileAction->setEnabled(currentNode->supportsAction(AddNewFile, currentNode)
&& !ICore::isNewItemDialogRunning());
m_addNewSubprojectAction->setEnabled(currentNode->nodeType() == NodeType::Project
- && actions.contains(AddSubProject)
+ && supports(AddSubProject)
&& !ICore::isNewItemDialogRunning());
m_removeProjectAction->setEnabled(currentNode->nodeType() == NodeType::Project
- && actions.contains(RemoveSubProject));
- m_addExistingFilesAction->setEnabled(actions.contains(AddExistingFile));
- m_addExistingDirectoryAction->setEnabled(actions.contains(AddExistingDirectory));
- m_renameFileAction->setEnabled(actions.contains(Rename));
+ && supports(RemoveSubProject));
+ m_addExistingFilesAction->setEnabled(supports(AddExistingFile));
+ m_addExistingDirectoryAction->setEnabled(supports(AddExistingDirectory));
+ m_renameFileAction->setEnabled(supports(Rename));
} else if (currentNode->asFileNode()) {
// Enable and show remove / delete in magic ways:
// If both are disabled show Remove
// If both are enabled show both (can't happen atm)
// If only removeFile is enabled only show it
// If only deleteFile is enable only show it
- bool enableRemove = actions.contains(RemoveFile);
+ bool enableRemove = supports(RemoveFile);
m_removeFileAction->setEnabled(enableRemove);
- bool enableDelete = actions.contains(EraseFile);
+ bool enableDelete = supports(EraseFile);
m_deleteFileAction->setEnabled(enableDelete);
m_deleteFileAction->setVisible(enableDelete);
m_removeFileAction->setVisible(!enableDelete || enableRemove);
- m_renameFileAction->setEnabled(actions.contains(Rename));
+ m_renameFileAction->setEnabled(supports(Rename));
const bool currentNodeIsTextFile = isTextFile(
ProjectTree::currentNode()->filePath().toString());
m_diffFileAction->setEnabled(isDiffServiceAvailable()
&& currentNodeIsTextFile && TextEditor::TextDocument::currentTextDocument());
- m_duplicateFileAction->setVisible(actions.contains(DuplicateFile));
- m_duplicateFileAction->setEnabled(actions.contains(DuplicateFile));
+ m_duplicateFileAction->setVisible(supports(DuplicateFile));
+ m_duplicateFileAction->setEnabled(supports(DuplicateFile));
EditorManager::populateOpenWithMenu(m_openWithMenu,
ProjectTree::currentNode()->filePath().toString());
}
- if (actions.contains(HidePathActions)) {
+ if (supports(HidePathActions)) {
m_openTerminalHere->setVisible(false);
m_showInGraphicalShell->setVisible(false);
m_searchOnFileSystem->setVisible(false);
}
- if (actions.contains(HideFileActions)) {
+ if (supports(HideFileActions)) {
m_deleteFileAction->setVisible(false);
m_removeFileAction->setVisible(false);
}
- if (actions.contains(HideFolderActions)) {
+ if (supports(HideFolderActions)) {
m_addNewFileAction->setVisible(false);
m_addNewSubprojectAction->setVisible(false);
m_removeProjectAction->setVisible(false);
@@ -3052,8 +3055,7 @@ void ProjectExplorerPluginPrivate::addNewSubproject()
QString location = directoryFor(currentNode);
if (currentNode->nodeType() == NodeType::Project
- && currentNode->supportedActions(
- currentNode).contains(AddSubProject)) {
+ && currentNode->supportsAction(AddSubProject, currentNode)) {
QVariantMap map;
map.insert(QLatin1String(Constants::PREFERRED_PROJECT_NODE), QVariant::fromValue(currentNode));
Project *project = ProjectTree::currentProject();
diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp
index d9b7a80d41..a733c9ae17 100644
--- a/src/plugins/projectexplorer/projectmodels.cpp
+++ b/src/plugins/projectexplorer/projectmodels.cpp
@@ -145,7 +145,7 @@ Qt::ItemFlags FlatModel::flags(const QModelIndex &index) const
if (Node *node = nodeForIndex(index)) {
if (!node->asProjectNode()) {
// either folder or file node
- if (node->supportedActions(node).contains(Rename))
+ if (node->supportsAction(Rename, node))
f = f | Qt::ItemIsEditable;
}
}
diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp
index 45c78f72ca..e57caa415e 100644
--- a/src/plugins/projectexplorer/projectnodes.cpp
+++ b/src/plugins/projectexplorer/projectnodes.cpp
@@ -215,14 +215,9 @@ bool Node::isEnabled() const
return parent ? parent->isEnabled() : true;
}
-QList<ProjectAction> Node::supportedActions(Node *node) const
+bool Node::supportsAction(ProjectAction, Node *) const
{
- if (FolderNode *folder = parentFolderNode()) {
- QList<ProjectAction> list = folder->supportedActions(node);
- list.append(InheritedFromParent);
- return list;
- }
- return {};
+ return false;
}
void Node::setEnabled(bool enabled)
@@ -364,6 +359,14 @@ QList<FileNode *> FileNode::scanForFiles(const Utils::FileName &directory,
return scanForFilesRecursively(directory, factory, visited, future, 0.0, 1000000.0);
}
+bool FileNode::supportsAction(ProjectAction action, Node *node) const
+{
+ if (action == InheritedFromParent)
+ return true;
+ FolderNode *parentFolder = parentFolderNode();
+ return parentFolder && parentFolder->supportsAction(action, node);
+}
+
/*!
\class ProjectExplorer::FolderNode
@@ -593,6 +596,14 @@ QString FolderNode::addFileFilter() const
return parentFolderNode()->addFileFilter();
}
+bool FolderNode::supportsAction(ProjectAction action, Node *node) const
+{
+ if (action == InheritedFromParent)
+ return true;
+ FolderNode *parentFolder = parentFolderNode();
+ return parentFolder && parentFolder->supportsAction(action, node);
+}
+
bool FolderNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
{
ProjectNode *pn = managingProject();
@@ -812,11 +823,10 @@ QString ContainerNode::displayName() const
return name;
}
-QList<ProjectAction> ContainerNode::supportedActions(Node *node) const
+bool ContainerNode::supportsAction(ProjectAction action, Node *node) const
{
- if (Node *rootNode = m_project->rootProjectNode())
- return rootNode->supportedActions(node);
- return {};
+ Node *rootNode = m_project->rootProjectNode();
+ return rootNode && rootNode->supportsAction(action, node);
}
ProjectNode *ContainerNode::rootProjectNode() const
diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h
index 4ed5b4eb56..efb94d7079 100644
--- a/src/plugins/projectexplorer/projectnodes.h
+++ b/src/plugins/projectexplorer/projectnodes.h
@@ -130,7 +130,7 @@ public:
virtual QString tooltip() const;
bool isEnabled() const;
- virtual QList<ProjectAction> supportedActions(Node *node) const;
+ virtual bool supportsAction(ProjectAction action, Node *node) const;
void setEnabled(bool enabled);
void setAbsoluteFilePathAndLine(const Utils::FileName &filePath, int line);
@@ -179,6 +179,7 @@ public:
static QList<FileNode *> scanForFiles(const Utils::FileName &directory,
const std::function<FileNode *(const Utils::FileName &fileName)> factory,
QFutureInterface<QList<FileNode *>> *future = nullptr);
+ bool supportsAction(ProjectAction action, Node *node) const override;
private:
FileType m_fileType;
@@ -225,6 +226,8 @@ public:
virtual QString addFileFilter() const;
+ bool supportsAction(ProjectAction action, Node *node) const override;
+
virtual bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0);
virtual bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0);
virtual bool deleteFiles(const QStringList &filePaths);
@@ -309,7 +312,7 @@ public:
ContainerNode(Project *project);
QString displayName() const final;
- QList<ProjectAction> supportedActions(Node *node) const final;
+ bool supportsAction(ProjectAction action, Node *node) const final;
ContainerNode *asContainerNode() final { return this; }
const ContainerNode *asContainerNode() const final { return this; }
diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp
index 88756a3599..951f2b10fd 100644
--- a/src/plugins/projectexplorer/projectwizardpage.cpp
+++ b/src/plugins/projectexplorer/projectwizardpage.cpp
@@ -240,8 +240,7 @@ static inline AddNewTree *buildAddProjectTree(ProjectNode *root, const QString &
}
}
- const QList<ProjectAction> &list = root->supportedActions(root);
- if (list.contains(AddSubProject) && !list.contains(InheritedFromParent)) {
+ if (root->supportsAction(AddSubProject, root) && !root->supportsAction(InheritedFromParent, root)) {
if (projectPath.isEmpty() || root->canAddSubProject(projectPath)) {
FolderNode::AddNewInformation info = root->addNewInformation(QStringList() << projectPath, contextNode);
auto item = new AddNewTree(root, children, info);
@@ -265,8 +264,7 @@ static inline AddNewTree *buildAddFilesTree(FolderNode *root, const QStringList
children.append(child);
}
- const QList<ProjectAction> &list = root->supportedActions(root);
- if (list.contains(AddNewFile) && !list.contains(InheritedFromParent)) {
+ if (root->supportsAction(AddNewFile, root) && !root->supportsAction(InheritedFromParent, root)) {
FolderNode::AddNewInformation info = root->addNewInformation(files, contextNode);
auto item = new AddNewTree(root, children, info);
selector->inspect(item, root == contextNode);
diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp
index 1e97696fb3..f28818d5b2 100644
--- a/src/plugins/pythoneditor/pythoneditorplugin.cpp
+++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp
@@ -122,11 +122,7 @@ public:
PythonProjectNode(PythonProject *project);
bool showInSimpleTree() const override;
-
- QList<ProjectAction> supportedActions(Node *node) const override;
-
QString addFileFilter() const override;
-
bool renameFile(const QString &filePath, const QString &newFilePath) override;
private:
@@ -655,13 +651,6 @@ bool PythonProjectNode::showInSimpleTree() const
return true;
}
-QList<ProjectAction> PythonProjectNode::supportedActions(Node *node) const
-{
- Q_UNUSED(node);
- //return { AddNewFile, AddExistingFile, AddExistingDirectory, RemoveFile, Rename };
- return {};
-}
-
QString PythonProjectNode::addFileFilter() const
{
return QLatin1String("*.py");
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp
index 45c7dcf111..262145ec6d 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.cpp
+++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp
@@ -45,6 +45,8 @@
#include <QIcon>
#include <QStyle>
+using namespace ProjectExplorer;
+
// ----------------------------------------------------------------------
// Helpers:
// ----------------------------------------------------------------------
@@ -223,26 +225,23 @@ public:
};
-static QList<ProjectExplorer::ProjectAction> supportedNodeActions(ProjectExplorer::Node *node,
- bool managesFiles)
+static bool supportsNodeAction(ProjectAction action, Node *node)
{
- QList<ProjectExplorer::ProjectAction> actions;
const QbsProject * const project = parentQbsProjectNode(node)->project();
if (!project->isProjectEditable())
- return actions;
- if (managesFiles)
- actions << ProjectExplorer::AddNewFile << ProjectExplorer::AddExistingFile;
+ return false;
auto equalsNodeFilePath = [node](const QString &str)
{
return str == node->filePath().toString();
};
- if (node->nodeType() == ProjectExplorer::NodeType::File
- && !Utils::contains(project->qbsProject().buildSystemFiles(), equalsNodeFilePath)) {
- actions << ProjectExplorer::RemoveFile << ProjectExplorer::Rename;
+ if (action == RemoveFile || action == Rename) {
+ if (node->nodeType() == ProjectExplorer::NodeType::File)
+ return !Utils::contains(project->qbsProject().buildSystemFiles(), equalsNodeFilePath);
}
- return actions;
+
+ return false;
}
// ----------------------------------------------------------------------
@@ -271,9 +270,9 @@ QbsFolderNode::QbsFolderNode(const Utils::FileName &folderPath, ProjectExplorer:
{
}
-QList<ProjectExplorer::ProjectAction> QbsFolderNode::supportedActions(ProjectExplorer::Node *node) const
+bool QbsFolderNode::supportsAction(ProjectAction action, Node *node) const
{
- return supportedNodeActions(node, false);
+ return supportsNodeAction(action, node);
}
// ---------------------------------------------------------------------------
@@ -289,12 +288,6 @@ bool QbsBaseProjectNode::showInSimpleTree() const
return false;
}
-QList<ProjectExplorer::ProjectAction> QbsBaseProjectNode::supportedActions(ProjectExplorer::Node *node) const
-{
- Q_UNUSED(node);
- return QList<ProjectExplorer::ProjectAction>();
-}
-
// --------------------------------------------------------------------
// QbsGroupNode:
// --------------------------------------------------------------------
@@ -309,9 +302,12 @@ QbsGroupNode::QbsGroupNode(const qbs::GroupData &grp, const QString &productPath
m_qbsGroupData = grp;
}
-QList<ProjectExplorer::ProjectAction> QbsGroupNode::supportedActions(ProjectExplorer::Node *node) const
+bool QbsGroupNode::supportsAction(ProjectAction action, Node *node) const
{
- return supportedNodeActions(node, true);
+ if (action == AddNewFile || action == AddExistingFile)
+ return true;
+
+ return supportsNodeAction(action, node);
}
bool QbsGroupNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
@@ -388,9 +384,12 @@ bool QbsProductNode::showInSimpleTree() const
return true;
}
-QList<ProjectExplorer::ProjectAction> QbsProductNode::supportedActions(ProjectExplorer::Node *node) const
+bool QbsProductNode::supportsAction(ProjectAction action, Node *node) const
{
- return supportedNodeActions(node, true);
+ if (action == AddNewFile || action == AddExistingFile)
+ return true;
+
+ return supportsNodeAction(action, node);
}
bool QbsProductNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h
index 313fa2a6ff..904851bc81 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.h
+++ b/src/plugins/qbsprojectmanager/qbsnodes.h
@@ -55,7 +55,7 @@ public:
const QString &displayName);
private:
- QList<ProjectExplorer::ProjectAction> supportedActions(ProjectExplorer::Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const final;
};
// ---------------------------------------------------------------------------
@@ -70,10 +70,6 @@ public:
explicit QbsBaseProjectNode(const Utils::FileName &absoluteFilePath);
bool showInSimpleTree() const override;
-
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
-private:
- friend class QbsGroupNode;
};
// --------------------------------------------------------------------
@@ -85,7 +81,7 @@ class QbsGroupNode : public QbsBaseProjectNode
public:
QbsGroupNode(const qbs::GroupData &grp, const QString &productPath);
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const final;
bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0) override;
bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0) override;
bool renameFile(const QString &filePath, const QString &newFilePath) override;
@@ -107,7 +103,7 @@ public:
explicit QbsProductNode(const qbs::ProductData &prd);
bool showInSimpleTree() const override;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const final;
bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0) override;
bool removeFiles(const QStringList &filePaths, QStringList *notRemoved = 0) override;
bool renameFile(const QString &filePath, const QString &newFilePath) override;
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
index b2ea316330..98c0cae52e 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
@@ -74,9 +74,13 @@ QmakeProFileNode *QmakePriFileNode::proFileNode() const
return m_qmakeProFileNode;
}
-QList<ProjectAction> QmakePriFileNode::supportedActions(Node *node) const
+bool QmakePriFileNode::supportsAction(ProjectAction action, Node *node) const
{
- QList<ProjectAction> actions;
+ if (action == Rename || action == DuplicateFile) {
+ FileNode *fileNode = node->asFileNode();
+ return (fileNode && fileNode->fileType() != FileType::Project)
+ || dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(node);
+ }
const FolderNode *folderNode = this;
const QmakeProFileNode *proFileNode;
@@ -93,12 +97,12 @@ QList<ProjectAction> QmakePriFileNode::supportedActions(Node *node) const
// TODO: Some of the file types don't make much sense for aux
// projects (e.g. cpp). It'd be nice if the "add" action could
// work on a subset of the file types according to project type.
-
- actions << AddNewFile;
- if (pro && pro->knowsFile(node->filePath()))
- actions << EraseFile;
- else
- actions << RemoveFile;
+ if (action == AddNewFile)
+ return true;
+ if (action == EraseFile)
+ return pro && pro->knowsFile(node->filePath());
+ if (action == RemoveFile)
+ return !(pro && pro->knowsFile(node->filePath()));
bool addExistingFiles = true;
if (node->nodeType() == NodeType::VirtualFolder) {
@@ -115,31 +119,26 @@ QList<ProjectAction> QmakePriFileNode::supportedActions(Node *node) const
addExistingFiles = addExistingFiles && !deploysFolder(node->filePath().toString());
- if (addExistingFiles)
- actions << AddExistingFile << AddExistingDirectory;
+ if (action == AddExistingFile || action == AddExistingDirectory)
+ return addExistingFiles;
break;
}
case ProjectType::SubDirsTemplate:
- actions << AddSubProject << RemoveSubProject;
+ if (action == AddSubProject || action == RemoveSubProject)
+ return true;
break;
default:
break;
}
- FileNode *fileNode = node->asFileNode();
- if ((fileNode && fileNode->fileType() != FileType::Project)
- || dynamic_cast<ResourceEditor::ResourceTopLevelNode *>(node)) {
- actions << Rename;
- actions << DuplicateFile;
+ if (action == HasSubProjectRunConfigurations) {
+ Target *target = m_project->activeTarget();
+ QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(target);
+ return factory && !factory->runConfigurationsForNode(target, node).isEmpty();
}
- Target *target = m_project->activeTarget();
- QmakeRunConfigurationFactory *factory = QmakeRunConfigurationFactory::find(target);
- if (factory && !factory->runConfigurationsForNode(target, node).isEmpty())
- actions << HasSubProjectRunConfigurations;
-
- return actions;
+ return false;
}
bool QmakePriFileNode::canAddSubProject(const QString &proFilePath) const
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h
index b04751809a..719e42a05a 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.h
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.h
@@ -47,7 +47,7 @@ public:
QmakePriFile *priFile() const;
// ProjectNode interface
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const override;
bool showInSimpleTree() const override { return false; }
diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp
index 357420c1d8..abf45bfbb1 100644
--- a/src/plugins/qmldesigner/documentmanager.cpp
+++ b/src/plugins/qmldesigner/documentmanager.cpp
@@ -438,7 +438,7 @@ bool DocumentManager::isoProFileSupportsAddingExistingFiles(const QString &resou
ProjectExplorer::ProjectNode *projectNode = node->parentFolderNode()->asProjectNode();
if (!projectNode)
return false;
- if (!projectNode->supportedActions(projectNode).contains(ProjectExplorer::AddExistingFile)) {
+ if (!projectNode->supportsAction(ProjectExplorer::AddExistingFile, projectNode)) {
qCWarning(documentManagerLog) << "Project" << projectNode->displayName() << "does not support adding existing files";
return false;
}
diff --git a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp
index c3e1034baf..ecf191a02f 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectnodes.cpp
@@ -57,15 +57,17 @@ bool QmlProjectNode::showInSimpleTree() const
return true;
}
-QList<ProjectAction> QmlProjectNode::supportedActions(Node *node) const
+bool QmlProjectNode::supportsAction(ProjectAction action, Node *node) const
{
- QList<ProjectAction> actions = {AddNewFile, EraseFile};
- if (node->nodeType() == NodeType::File) {
+ if (action == AddNewFile || action == EraseFile)
+ return true;
+
+ if (action == Rename && node->nodeType() == NodeType::File) {
FileNode *fileNode = static_cast<FileNode *>(node);
- if (fileNode->fileType() != FileType::Project)
- actions.append(Rename);
+ return fileNode->fileType() != FileType::Project;
}
- return actions;
+
+ return false;
}
bool QmlProjectNode::addFiles(const QStringList &filePaths, QStringList * /*notAdded*/)
diff --git a/src/plugins/qmlprojectmanager/qmlprojectnodes.h b/src/plugins/qmlprojectmanager/qmlprojectnodes.h
index 3df7d7e3be..bc715d86f6 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectnodes.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectnodes.h
@@ -38,13 +38,11 @@ class QmlProjectNode : public ProjectExplorer::ProjectNode
public:
QmlProjectNode(QmlProject *project);
- virtual bool showInSimpleTree() const override;
-
- virtual QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
-
- virtual bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0) override;
- virtual bool deleteFiles(const QStringList &filePaths) override;
- virtual bool renameFile(const QString &filePath, const QString &newFilePath) override;
+ bool showInSimpleTree() const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const override;
+ bool addFiles(const QStringList &filePaths, QStringList *notAdded = 0) override;
+ bool deleteFiles(const QStringList &filePaths) override;
+ bool renameFile(const QString &filePath, const QString &newFilePath) override;
private:
QmlProject *m_project;
diff --git a/src/plugins/resourceeditor/resourceeditorplugin.cpp b/src/plugins/resourceeditor/resourceeditorplugin.cpp
index 474092d350..1ae83161ca 100644
--- a/src/plugins/resourceeditor/resourceeditorplugin.cpp
+++ b/src/plugins/resourceeditor/resourceeditorplugin.cpp
@@ -338,8 +338,8 @@ void ResourceEditorPlugin::updateContextActions()
if (isResourceNode) {
FolderNode *parent = node ? node->parentFolderNode() : 0;
- enableRename = parent && parent->supportedActions(node).contains(Rename);
- enableRemove = parent && parent->supportedActions(node).contains(RemoveFile);
+ enableRename = parent && parent->supportsAction(Rename, node);
+ enableRemove = parent && parent->supportsAction(RemoveFile, node);
}
m_renameResourceFile->setEnabled(isResourceNode && enableRename);
diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp
index 49c640840a..ffe74eeb42 100644
--- a/src/plugins/resourceeditor/resourcenode.cpp
+++ b/src/plugins/resourceeditor/resourcenode.cpp
@@ -160,7 +160,7 @@ public:
ResourceTopLevelNode *topLevel, ResourceFolderNode *prefixNode);
QString displayName() const final;
- QList<ProjectAction> supportedActions(Node *node) const final;
+ bool supportsAction(ProjectAction, Node *node) const final;
bool addFiles(const QStringList &filePaths, QStringList *notAdded) final;
bool removeFiles(const QStringList &filePaths, QStringList *notRemoved) final;
bool renameFile(const QString &filePath, const QString &newFilePath) final;
@@ -199,17 +199,15 @@ SimpleResourceFolderNode::SimpleResourceFolderNode(const QString &afolderName, c
}
-QList<ProjectAction> SimpleResourceFolderNode::supportedActions(Node *) const
+bool SimpleResourceFolderNode::supportsAction(ProjectAction action, Node *) const
{
- return {
- AddNewFile,
- AddExistingFile,
- AddExistingDirectory,
- RemoveFile,
- DuplicateFile,
- Rename, // Note: only works for the filename, works akwardly for relative file paths
- InheritedFromParent // Do not add to list of projects when adding new file
- };
+ return action == AddNewFile
+ || action == AddExistingFile
+ || action == AddExistingDirectory
+ || action == RemoveFile
+ || action == DuplicateFile
+ || action == Rename // Note: only works for the filename, works akwardly for relative file paths
+ || action == InheritedFromParent; // Do not add to list of projects when adding new file
}
bool SimpleResourceFolderNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
@@ -387,11 +385,15 @@ QString ResourceTopLevelNode::addFileFilter() const
return QLatin1String("*.png; *.jpg; *.gif; *.svg; *.ico; *.qml; *.qml.ui");
}
-QList<ProjectAction> ResourceTopLevelNode::supportedActions(Node *node) const
+bool ResourceTopLevelNode::supportsAction(ProjectAction action, Node *node) const
{
if (node != this)
- return {};
- return {AddNewFile, AddExistingFile, AddExistingDirectory, HidePathActions, Rename};
+ return false;
+ return action == AddNewFile
+ || action == AddExistingFile
+ || action == AddExistingDirectory
+ || action == HidePathActions
+ || action == Rename;
}
bool ResourceTopLevelNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
@@ -504,25 +506,23 @@ ResourceFolderNode::~ResourceFolderNode()
}
-QList<ProjectAction> ResourceFolderNode::supportedActions(Node *node) const
+bool ResourceFolderNode::supportsAction(ProjectAction action, Node *node) const
{
Q_UNUSED(node)
- QList<ProjectAction> actions = {
- AddNewFile,
- AddExistingFile,
- AddExistingDirectory,
- RemoveFile,
- DuplicateFile,
- Rename, // Note: only works for the filename, works akwardly for relative file paths
- HidePathActions, // hides open terminal etc.
- };
- // if the prefix is '/' (without lang) hide this node in add new dialog,
- // as the ResouceTopLevelNode is always shown for the '/' prefix
- if (m_prefix == QLatin1String("/") && m_lang.isEmpty())
- actions << InheritedFromParent;
+ if (action == InheritedFromParent) {
+ // if the prefix is '/' (without lang) hide this node in add new dialog,
+ // as the ResouceTopLevelNode is always shown for the '/' prefix
+ return m_prefix == QLatin1String("/") && m_lang.isEmpty();
+ }
- return actions;
+ return action == AddNewFile
+ || action == AddExistingFile
+ || action == AddExistingDirectory
+ || action == RemoveFile
+ || action == DuplicateFile
+ || action == Rename // Note: only works for the filename, works akwardly for relative file paths
+ || action == HidePathActions; // hides open terminal etc.
}
bool ResourceFolderNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
@@ -674,12 +674,11 @@ QString ResourceFileNode::qrcPath() const
return m_qrcPath;
}
-QList<ProjectAction> ResourceFileNode::supportedActions(Node *node) const
+bool ResourceFileNode::supportsAction(ProjectAction action, Node *node) const
{
- QList<ProjectAction> actions = parentFolderNode()->supportedActions(node);
- actions.removeOne(HidePathActions);
- return actions;
+ if (action == HidePathActions)
+ return false;
+ return parentFolderNode()->supportsAction(action, node);
}
-
} // ResourceEditor
diff --git a/src/plugins/resourceeditor/resourcenode.h b/src/plugins/resourceeditor/resourcenode.h
index aa7ff02580..0d6b7a1b64 100644
--- a/src/plugins/resourceeditor/resourcenode.h
+++ b/src/plugins/resourceeditor/resourcenode.h
@@ -41,7 +41,7 @@ public:
QString addFileFilter() const override;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const override;
bool addFiles(const QStringList &filePaths, QStringList *notAdded) override;
bool removeFiles(const QStringList &filePaths, QStringList *notRemoved) override;
@@ -67,7 +67,7 @@ public:
ResourceFolderNode(const QString &prefix, const QString &lang, ResourceTopLevelNode *parent);
~ResourceFolderNode() override;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const override;
QString displayName() const override;
@@ -97,7 +97,7 @@ public:
QString displayName() const override;
QString qrcPath() const;
- QList<ProjectExplorer::ProjectAction> supportedActions(Node *node) const override;
+ bool supportsAction(ProjectExplorer::ProjectAction action, Node *node) const override;
private:
QString m_qrcPath;