From 5a5a464dfa2cadcd8d769936a5ee8e05383b1975 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 9 Mar 2017 14:41:01 +0100 Subject: [PATCH] ProjectNodes: Introduce FolderNode::replaceSubtree Introduce FolderNode::replaceSubtree incl. necessary signalling Change-Id: I57762cd24a2986d3a04d0de6b794c1f6c772dbe6 Reviewed-by: hjk --- src/plugins/projectexplorer/projectmodels.cpp | 8 ++---- src/plugins/projectexplorer/projectmodels.h | 2 -- src/plugins/projectexplorer/projectnodes.cpp | 25 +++++++++++++++++++ src/plugins/projectexplorer/projectnodes.h | 4 +++ src/plugins/projectexplorer/projecttree.cpp | 7 ++++++ src/plugins/projectexplorer/projecttree.h | 2 ++ 6 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp index f40ac2b7665..3f16be312ee 100644 --- a/src/plugins/projectexplorer/projectmodels.cpp +++ b/src/plugins/projectexplorer/projectmodels.cpp @@ -78,7 +78,8 @@ FlatModel::FlatModel(QObject *parent) ProjectTree *tree = ProjectTree::instance(); connect(tree, &ProjectTree::dataChanged, this, &FlatModel::update); - connect(tree, &ProjectTree::nodeUpdated, this, &FlatModel::nodeUpdated); + connect(tree, &ProjectTree::nodeUpdated, this, &FlatModel::update); + connect(tree, &ProjectTree::subtreeChanged, this, &FlatModel::update); SessionManager *sm = SessionManager::instance(); connect(sm, &SessionManager::projectRemoved, this, &FlatModel::update); @@ -394,11 +395,6 @@ bool isSorted(const QList &nodes) return true; } -void FlatModel::nodeUpdated(Node *) -{ - update(); -} - namespace Internal { int caseFriendlyCompare(const QString &a, const QString &b) diff --git a/src/plugins/projectexplorer/projectmodels.h b/src/plugins/projectexplorer/projectmodels.h index 361b380d0af..6bb63a15b25 100644 --- a/src/plugins/projectexplorer/projectmodels.h +++ b/src/plugins/projectexplorer/projectmodels.h @@ -85,8 +85,6 @@ signals: void requestExpansion(const QModelIndex &index); private: - void nodeUpdated(ProjectExplorer::Node *node); - bool filter(Node *node) const; // Returns true if node is hidden. bool m_filterProjects = false; diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 16282da09e8..72dc63a08e9 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -43,6 +43,8 @@ #include #include +#include + namespace ProjectExplorer { static FolderNode *folderNode(const FolderNode *folder, const Utils::FileName &directory) @@ -494,6 +496,29 @@ void FolderNode::compress() } } +bool FolderNode::replaceSubtree(Node *oldNode, Node *newNode) +{ + std::unique_ptr nn(newNode); + + if (!oldNode) { + addNode(nn.release()); // Happens e.g. when a project is registered + } else { + auto it = std::find_if(m_nodes.begin(), m_nodes.end(), + [oldNode](const Node *n) { return oldNode == n; }); + QTC_ASSERT(it != m_nodes.end(), return false); + if (nn) { + nn->setParentFolderNode(this); + *it = nn.release(); + } else { + removeNode(oldNode); // Happens e.g. when project is shutting down + } + delete oldNode; + } + + ProjectTree::emitSubtreeChanged(this); + return true; +} + void FolderNode::setDisplayName(const QString &name) { if (m_displayName == name) diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 5dd5de84910..2f9ad0cdefe 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -201,6 +201,10 @@ public: void buildTree(QList &files, const Utils::FileName &overrideBaseDir = Utils::FileName()); void compress(); + // takes ownership of newNode. + // Will delete newNode if oldNode is not a child of this node. + bool replaceSubtree(Node *oldNode, Node *newNode); + void setDisplayName(const QString &name); void setIcon(const QIcon &icon); diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 6188770c258..40d817524d0 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -266,6 +266,13 @@ void ProjectTree::emitNodeUpdated(Node *node) emit s_instance->nodeUpdated(node); } +void ProjectTree::emitSubtreeChanged(Node *node) +{ + if (!s_instance->isInNodeHierarchy(node)) + return; + emit s_instance->subtreeChanged(node); +} + void ProjectTree::emitDataChanged() { instance()->dataChanged(); diff --git a/src/plugins/projectexplorer/projecttree.h b/src/plugins/projectexplorer/projecttree.h index 183ae791cdf..58d15fd049c 100644 --- a/src/plugins/projectexplorer/projecttree.h +++ b/src/plugins/projectexplorer/projecttree.h @@ -68,6 +68,7 @@ signals: // Emitted whenever the model needs to send a update signal. void nodeUpdated(ProjectExplorer::Node *node); + void subtreeChanged(ProjectExplorer::Node *node); void dataChanged(); void aboutToShowContextMenu(ProjectExplorer::Project *project, @@ -75,6 +76,7 @@ signals: public: // for nodes to emit signals, do not call unless you are a node static void emitNodeUpdated(ProjectExplorer::Node *node); + static void emitSubtreeChanged(ProjectExplorer::Node *node); static void emitDataChanged(); void collapseAll();