From 49f5d98871f7f0728a56ea78e577ba1bda9f54d9 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 10 Nov 2016 16:56:15 +0100 Subject: [PATCH] ProjectExplorer: Make priorities available on more nodes Make priority available on all FolderNodes. Make the sort order of all kinds of FolderNodes check the priority. This allows no reorder e.g. ProjectNodes as needed. Change-Id: I369edd28807ab9f89fb646b0001e1b3eb1a19d7e Reviewed-by: Tim Jenssen --- src/plugins/projectexplorer/projectmodels.cpp | 121 ++---------------- src/plugins/projectexplorer/projectnodes.cpp | 29 +++-- src/plugins/projectexplorer/projectnodes.h | 24 ++-- .../qmakeprojectmanager/qmakenodes.cpp | 6 +- src/plugins/resourceeditor/resourcenode.cpp | 6 +- 5 files changed, 54 insertions(+), 132 deletions(-) diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index 8e2133202ae..e597e23bf79 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -50,119 +50,20 @@ namespace { bool sortNodes(Node *n1, Node *n2) { - // Ordering is: project files, project, folder, file - - const NodeType n1Type = n1->nodeType(); - const NodeType n2Type = n2->nodeType(); - - // project files - FileNode *file1 = n1->asFileNode(); - FileNode *file2 = n2->asFileNode(); - if (file1 && file1->fileType() == FileType::Project) { - if (file2 && file2->fileType() == FileType::Project) { - const QString fileName1 = file1->filePath().fileName(); - const QString fileName2 = file2->filePath().fileName(); - - int result = caseFriendlyCompare(fileName1, fileName2); - if (result != 0) - return result < 0; - else - return file1 < file2; - } else { - return true; // project file is before everything else - } - } else { - if (file2 && file2->fileType() == FileType::Project) - return false; - } - - // projects - if (n1Type == NodeType::Project) { - if (n2Type == NodeType::Project) { - auto project1 = static_cast(n1); - auto project2 = static_cast(n2); - - int result = caseFriendlyCompare(project1->displayName(), project2->displayName()); - if (result != 0) - return result < 0; - - result = caseFriendlyCompare(project1->filePath().toString(), - project2->filePath().toString()); - if (result != 0) - return result < 0; - return project1 < project2; // sort by pointer value - } else { - return true; // project is before folder & file - } - } - if (n2Type == NodeType::Project) + if (n1->priority() > n2->priority()) + return true; + if (n1->priority() < n2->priority()) return false; - if (n1Type == NodeType::VirtualFolder) { - if (n2Type == NodeType::VirtualFolder) { - auto folder1 = static_cast(n1); - auto folder2 = static_cast(n2); + const int displayNameResult = caseFriendlyCompare(n1->displayName(), n2->displayName()); + if (displayNameResult != 0) + return displayNameResult < 0; - if (folder1->priority() > folder2->priority()) - return true; - if (folder1->priority() < folder2->priority()) - return false; - int result = caseFriendlyCompare(folder1->filePath().toString(), - folder2->filePath().toString()); - if (result != 0) - return result < 0; - else - return folder1 < folder2; - } else { - return true; // virtual folder is before folder - } - } - - if (n2Type == NodeType::VirtualFolder) - return false; - - - if (n1Type == NodeType::Folder) { - if (n2Type == NodeType::Folder) { - auto folder1 = static_cast(n1); - auto folder2 = static_cast(n2); - - int result = caseFriendlyCompare(folder1->filePath().toString(), - folder2->filePath().toString()); - if (result != 0) - return result < 0; - else - return folder1 < folder2; - } else { - return true; // folder is before file - } - } - if (n2Type == NodeType::Folder) - return false; - - // must be file nodes - int result = caseFriendlyCompare(n1->displayName(), n2->displayName()); - if (result != 0) - return result < 0; - - const QString filePath1 = n1->filePath().toString(); - const QString filePath2 = n2->filePath().toString(); - - const QString fileName1 = n1->filePath().fileName(); - const QString fileName2 = n2->filePath().fileName(); - - result = caseFriendlyCompare(fileName1, fileName2); - if (result != 0) { - return result < 0; // sort by filename - } else { - result = caseFriendlyCompare(filePath1, filePath2); - if (result != 0) - return result < 0; // sort by filepath - - if (n1->line() != n2->line()) - return n1->line() < n2->line(); // sort by line numbers - return n1 < n2; // sort by pointer value - } + const int filePathResult = caseFriendlyCompare(n1->filePath().toString(), + n2->filePath().toString()); + if (filePathResult != 0) + return filePathResult < 0; + return n1 < n2; // sort by pointer value } } // namespace anon diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 7fc241200ef..24b3451c12f 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -63,6 +63,11 @@ Node::Node(NodeType nodeType, const Utils::FileName &filePath, int line) : m_filePath(filePath), m_line(line), m_nodeType(nodeType) { } +void Node::setPriority(int p) +{ + m_priority = p; +} + void Node::emitNodeSortKeyAboutToChange() { if (parentFolderNode()) @@ -92,6 +97,11 @@ NodeType Node::nodeType() const return m_nodeType; } +int Node::priority() const +{ + return m_priority; +} + /*! The project that owns and manages the node. It is the first project in the list of ancestors. @@ -209,7 +219,12 @@ FileNode::FileNode(const Utils::FileName &filePath, bool generated, int line) : Node(NodeType::File, filePath, line), m_fileType(fileType), m_generated(generated) -{ } +{ + if (fileType == FileType::Project) + setPriority(DefaultProjectFilePriority); + else + setPriority(DefaultFilePriority); +} FileType FileNode::fileType() const { @@ -287,9 +302,10 @@ QList FileNode::scanForFiles(const Utils::FileName &directory, \sa ProjectExplorer::FileNode, ProjectExplorer::ProjectNode */ FolderNode::FolderNode(const Utils::FileName &folderPath, NodeType nodeType, const QString &displayName) : - Node(nodeType, folderPath), + Node(nodeType, folderPath, -1), m_displayName(displayName) { + setPriority(DefaultFolderPriority); if (m_displayName.isEmpty()) m_displayName = folderPath.toUserOutput(); } @@ -712,13 +728,9 @@ bool FolderNode::showInSimpleTree() const \sa ProjectExplorer::FileNode, ProjectExplorer::ProjectNode */ VirtualFolderNode::VirtualFolderNode(const Utils::FileName &folderPath, int priority) : - FolderNode(folderPath, NodeType::VirtualFolder), - m_priority(priority) -{ } - -int VirtualFolderNode::priority() const + FolderNode(folderPath, NodeType::VirtualFolder, QString()) { - return m_priority; + setPriority(priority); } /*! @@ -737,6 +749,7 @@ int VirtualFolderNode::priority() const ProjectNode::ProjectNode(const Utils::FileName &projectFilePath) : FolderNode(projectFilePath, NodeType::Project) { + setPriority(DefaultProjectPriority); setDisplayName(projectFilePath.fileName()); } diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index f36110d9571..3de04ecf13b 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -107,8 +107,18 @@ class SessionManager; class PROJECTEXPLORER_EXPORT Node { public: + enum PriorityLevel { + DefaultPriority = 0, + DefaultFilePriority = 100000, + DefaultFolderPriority = 200000, + DefaultVirtualFolderPriority = 300000, + DefaultProjectPriority = 400000, + DefaultProjectFilePriority = 500000 + }; + virtual ~Node() = default; NodeType nodeType() const; + int priority() const; ProjectNode *parentProjectNode() const; // parent project, will be nullptr for the top-level project FolderNode *parentFolderNode() const; // parent folder or project @@ -148,6 +158,7 @@ public: protected: Node(NodeType nodeType, const Utils::FileName &filePath, int line = -1); + void setPriority(int priority); void setParentFolderNode(FolderNode *parentFolder); void emitNodeSortKeyAboutToChange(); @@ -156,7 +167,8 @@ protected: private: FolderNode *m_parentFolderNode = nullptr; Utils::FileName m_filePath; - int m_line; + int m_line = -1; + int m_priority = DefaultPriority; const NodeType m_nodeType; bool m_isEnabled = true; }; @@ -251,21 +263,17 @@ protected: QList m_fileNodes; private: - // managed by ProjectNode - friend class ProjectNode; QString m_displayName; mutable QIcon m_icon; + + // managed by ProjectNode + friend class ProjectNode; }; class PROJECTEXPLORER_EXPORT VirtualFolderNode : public FolderNode { public: explicit VirtualFolderNode(const Utils::FileName &folderPath, int priority); - - int priority() const; - -private: - int m_priority; }; // Documentation inside. diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index 9f5b4950601..9d9db724876 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -322,7 +322,7 @@ struct InternalNode QMap subnodes; FileNameList files; FileType type = FileType::Unknown; - int priority = 0; + int priority = Node::DefaultVirtualFolderPriority; QString displayName; QString typeName; QString addFileFilter; @@ -739,7 +739,7 @@ void QmakePriFileNode::update(const Internal::PriFileEvalResult &result) subfolder->fullPath = m_projectDir; subfolder->typeName = fileTypes.at(i).typeName; subfolder->addFileFilter = fileTypes.at(i).addFileFilter; - subfolder->priority = -i; + subfolder->priority = Node::DefaultVirtualFolderPriority - i; subfolder->displayName = fileTypes.at(i).typeName; contents.virtualfolders.append(subfolder); // create the hierarchy with subdirectories @@ -816,7 +816,7 @@ bool QmakePriFileNode::folderChanged(const QString &changedFolder, const QSeticon = fileTypes.at(i).icon; subfolder->fullPath = m_projectDir; subfolder->typeName = fileTypes.at(i).typeName; - subfolder->priority = -i; + subfolder->priority = Node::DefaultVirtualFolderPriority - i; subfolder->displayName = fileTypes.at(i).typeName; contents.virtualfolders.append(subfolder); // create the hierarchy with subdirectories diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp index c91763be35f..1bb7b8c0ed7 100644 --- a/src/plugins/resourceeditor/resourcenode.cpp +++ b/src/plugins/resourceeditor/resourcenode.cpp @@ -44,7 +44,7 @@ using namespace ResourceEditor; using namespace ResourceEditor::Internal; -static bool priority(const QStringList &files) +static bool hasPriority(const QStringList &files) { if (files.isEmpty()) return false; @@ -341,7 +341,7 @@ ProjectExplorer::FolderNode::AddNewInformation ResourceTopLevelNode::addNewInfor .arg(QLatin1Char('/')); int p = -1; - if (priority(files)) { // images/* and qml/js mimetypes + if (hasPriority(files)) { // images/* and qml/js mimetypes p = 110; if (context == this) p = 120; @@ -497,7 +497,7 @@ ProjectExplorer::FolderNode::AddNewInformation ResourceFolderNode::addNewInforma .arg(displayName()); int p = -1; // never the default - if (priority(files)) { // image/* and qml/js mimetypes + if (hasPriority(files)) { // image/* and qml/js mimetypes p = 105; // prefer against .pro and .pri files if (context == this) p = 120;