diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index d643e6d6f02..43870201dbd 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -430,6 +431,8 @@ void Project::setRootProjectNode(ProjectNode *root) if (d->m_rootProjectNode == root) return; + ProjectTree::applyTreeManager(root); + d->m_rootProjectNode = root; emit projectTreeChanged(this, QPrivateSignal()); // Do not delete oldNode! The ProjectTree owns that! diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp index 62301525ebf..86d8ef1d269 100644 --- a/src/plugins/projectexplorer/projecttree.cpp +++ b/src/plugins/projectexplorer/projecttree.cpp @@ -261,8 +261,9 @@ void ProjectTree::updateContext() void ProjectTree::emitSubtreeChanged(FolderNode *node) { - if (!s_instance->isInNodeHierarchy(node)) + if (!SessionManager::sessionNode()->isAncesterOf(node)) return; + emit s_instance->subtreeChanged(node); } @@ -358,7 +359,6 @@ void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &global void ProjectTree::highlightProject(Project *project, const QString &message) { - Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); // Shows and focusses a project tree @@ -368,20 +368,24 @@ void ProjectTree::highlightProject(Project *project, const QString &message) projectTreeWidget->showMessage(project->rootProjectNode(), message); } +void ProjectTree::registerTreeManager(const TreeManagerFunction &treeChange) +{ + if (treeChange) + s_instance->m_treeManagers.append(treeChange); +} + +void ProjectTree::applyTreeManager(FolderNode *folder) +{ + if (!folder) + return; + + for (TreeManagerFunction &f : s_instance->m_treeManagers) + f(folder); +} + void ProjectTree::hideContextMenu() { m_focusForContextMenu = nullptr; } -bool ProjectTree::isInNodeHierarchy(Node *n) -{ - Node *sessionNode = SessionManager::sessionNode(); - do { - if (n == sessionNode) - return true; - n = n->parentFolderNode(); - } while (n); - return false; -} - } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projecttree.h b/src/plugins/projectexplorer/projecttree.h index 0985540cc4b..74f0c53a2cb 100644 --- a/src/plugins/projectexplorer/projecttree.h +++ b/src/plugins/projectexplorer/projecttree.h @@ -29,6 +29,8 @@ #include +#include + namespace ProjectExplorer { class FileNode; class FolderNode; @@ -62,6 +64,10 @@ public: static void highlightProject(Project *project, const QString &message); + using TreeManagerFunction = std::function; + static void registerTreeManager(const TreeManagerFunction &treeChange); + static void applyTreeManager(FolderNode *folder); + void collapseAll(); signals: @@ -92,11 +98,11 @@ private: void updateExternalFileWarning(); static bool hasFocus(Internal::ProjectTreeWidget *widget); void hideContextMenu(); - bool isInNodeHierarchy(Node *n); private: static ProjectTree *s_instance; QList> m_projectTreeWidgets; + QVector m_treeManagers; QPointer m_currentNode; Project *m_currentProject = nullptr; Internal::ProjectTreeWidget *m_focusForContextMenu = nullptr;