From facc89fafd82b6a228f2608db6dde6a329f712b6 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Tue, 3 Mar 2015 15:11:01 +0100 Subject: [PATCH] Optimize ProjectTree for adding folders/files Instead of searching the whole tree for the current node, only check the newly added files/folders. Change-Id: I015a955815223767367c4cad476d0620f69abd71 Reviewed-by: Orgad Shaneh --- src/plugins/projectexplorer/projecttree.cpp | 47 +++++++++++++++++-- src/plugins/projectexplorer/projecttree.h | 3 ++ .../projectexplorer/projecttreewidget.cpp | 8 +++- .../projectexplorer/projecttreewidget.h | 1 + 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 66173a4856a..47bbca77c60 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -34,6 +34,7 @@ #include "project.h" #include "projectnodes.h" #include "projectexplorerconstants.h" +#include "nodesvisitor.h" #include #include @@ -187,11 +188,16 @@ void ProjectTree::updateFromDocumentManager(bool invalidCurrentNode) else currentNode = ProjectTreeWidget::nodeForFile(fileName); - Project *project = projectForNode(currentNode); + updateFromNode(currentNode); +} - update(currentNode, project); +void ProjectTree::updateFromNode(Node *node) +{ + Project *project = projectForNode(node); + + update(node, project); foreach (ProjectTreeWidget *widget, m_projectTreeWidgets) - widget->sync(currentNode); + widget->sync(node); } void ProjectTree::update(Node *node, Project *project) @@ -289,6 +295,8 @@ void ProjectTree::emitFoldersAboutToBeAdded(FolderNode *parentFolder, const QLis if (!isInNodeHierarchy(parentFolder)) return; + m_foldersAdded = newFolders; + emit foldersAboutToBeAdded(parentFolder, newFolders); } @@ -302,7 +310,22 @@ void ProjectTree::emitFoldersAdded(FolderNode *folder) if (Utils::anyOf(m_projectTreeWidgets, &ProjectTreeWidget::hasFocus)) return; - updateFromDocumentManager(); + if (!m_currentNode) { + Core::IDocument *document = Core::EditorManager::currentDocument(); + const FileName fileName = document ? document->filePath() : FileName(); + + + FindNodesForFileVisitor findNodes(fileName); + foreach (FolderNode *fn, m_foldersAdded) + fn->accept(&findNodes); + + Node *bestNode = ProjectTreeWidget::mostExpandedNode(findNodes.nodes()); + if (!bestNode) + return; + + updateFromNode(bestNode); + } + m_foldersAdded.clear(); } void ProjectTree::emitFoldersAboutToBeRemoved(FolderNode *parentFolder, const QList &staleFolders) @@ -344,6 +367,7 @@ void ProjectTree::emitFilesAboutToBeAdded(FolderNode *folder, const QListfilePath() : FileName(); + + int index = Utils::indexOf(m_filesAdded, [&fileName](FileNode *node) { + return node->path() == fileName; + }); + + if (index == -1) + return; + + updateFromNode(m_filesAdded.at(index)); + } + m_filesAdded.clear(); } void ProjectTree::emitFilesAboutToBeRemoved(FolderNode *folder, const QList &staleFiles) diff --git a/src/plugins/projectexplorer/projecttree.h b/src/plugins/projectexplorer/projecttree.h index 642458221e3..3f28618a0fc 100644 --- a/src/plugins/projectexplorer/projecttree.h +++ b/src/plugins/projectexplorer/projecttree.h @@ -135,6 +135,7 @@ private: void updateFromProjectTreeWidget(Internal::ProjectTreeWidget *widget); void documentManagerCurrentFileChanged(); void updateFromDocumentManager(bool invalidCurrentNode = false); + void updateFromNode(Node *node); void update(Node *node, Project *project); void updateContext(); @@ -150,6 +151,8 @@ private: QList m_projectTreeWidgets; Node *m_currentNode; Project *m_currentProject; + QList m_filesAdded; + QList m_foldersAdded; bool m_resetCurrentNodeFolder; bool m_resetCurrentNodeFile; bool m_resetCurrentNodeProject; diff --git a/src/plugins/projectexplorer/projecttreewidget.cpp b/src/plugins/projectexplorer/projecttreewidget.cpp index aba3e4c32ab..656fe9b5d88 100644 --- a/src/plugins/projectexplorer/projecttreewidget.cpp +++ b/src/plugins/projectexplorer/projecttreewidget.cpp @@ -237,11 +237,16 @@ void ProjectTreeWidget::rowsInserted(const QModelIndex &parent, int start, int e } Node *ProjectTreeWidget::nodeForFile(const Utils::FileName &fileName) +{ + return mostExpandedNode(SessionManager::nodesForFile(fileName)); +} + +Node *ProjectTreeWidget::mostExpandedNode(const QList &nodes) { Node *bestNode = 0; int bestNodeExpandCount = INT_MAX; - foreach (Node *node, SessionManager::nodesForFile(fileName)) { + foreach (Node *node, nodes) { if (!bestNode) { bestNode = node; bestNodeExpandCount = ProjectTreeWidget::expandedCount(node); @@ -256,7 +261,6 @@ Node *ProjectTreeWidget::nodeForFile(const Utils::FileName &fileName) } } } - return bestNode; } diff --git a/src/plugins/projectexplorer/projecttreewidget.h b/src/plugins/projectexplorer/projecttreewidget.h index 4f1a385259c..8b2eba324b6 100644 --- a/src/plugins/projectexplorer/projecttreewidget.h +++ b/src/plugins/projectexplorer/projecttreewidget.h @@ -68,6 +68,7 @@ public: void sync(ProjectExplorer::Node *node); static Node *nodeForFile(const Utils::FileName &fileName); + static Node *mostExpandedNode(const QList &nodes); public slots: void toggleAutoSynchronization();