From 71a5aee36fa90bab83614ded6bb182be6c5bf5e0 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 3 Mar 2017 14:40:02 +0100 Subject: [PATCH] Session: Update SessionNode when Project tree changes This moves ownership of the project's root node from the project into the project tree! Change-Id: I84eba884bd63b44e56c75023d8bf12caf5cc2833 Reviewed-by: hjk --- .../cmakeprojectmanager/cmakeproject.cpp | 1 - src/plugins/projectexplorer/project.cpp | 5 +-- src/plugins/projectexplorer/project.h | 3 ++ src/plugins/projectexplorer/projectnodes.cpp | 2 - src/plugins/projectexplorer/session.cpp | 37 +++++++++++++++---- src/plugins/projectexplorer/session.h | 1 + 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index a1b7b9b9469..5a566bffab9 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -134,7 +134,6 @@ CMakeProject::~CMakeProject() future.waitForFinished(); } delete m_cppCodeModelUpdater; - setRootProjectNode(nullptr); qDeleteAll(m_extraCompilers); qDeleteAll(m_allFiles); } diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 45bf8769dad..9eb8956dae2 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -420,13 +420,12 @@ void Project::setDocument(Core::IDocument *doc) void Project::setRootProjectNode(ProjectNode *root) { - ProjectNode *oldNode = d->m_rootProjectNode; - if (oldNode == root) + if (d->m_rootProjectNode == root) return; d->m_rootProjectNode = root; emit projectTreeChanged(this, QPrivateSignal()); - delete oldNode; + // Do not delete oldNode! The ProjectTree owns that! } Target *Project::restoreTarget(const QVariantMap &data) diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index d3dcce9dbf4..3ca35707fcf 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -51,6 +51,7 @@ class NamedWidget; class ProjectImporter; class ProjectNode; class ProjectPrivate; +class Session; class Target; // Documentation inside. @@ -189,6 +190,8 @@ private: void setActiveTarget(Target *target); ProjectPrivate *d; + + friend class Session; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 39305c7e8c7..ea759cc0ebe 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -465,8 +465,6 @@ void FolderNode::buildTree(QList &files, const Utils::FileName &over overrideBaseDir); folder->addNode(fn); } - - emitTreeChanged(); } // "Compress" a tree of foldernodes such that foldernodes with exactly one foldernode as a child diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index e977571f88e..688439f2f94 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -188,6 +188,29 @@ void SessionManager::clearProjectFileCache() d->m_projectFileCache.clear(); } +void SessionManager::updateProjectTree(Project *pro) +{ + if (!pro) + return; + + QPair *currentPair = nullptr; + for (QPair &pair : d->m_projects) { + if (pair.first == pro) { + currentPair = &pair; + break; + } + } + + if (!currentPair) + return; // Project was already de-registered and is shutting down + + ProjectNode *const oldNode = currentPair->second; + ProjectNode *const newNode = pro->rootProjectNode(); + + d->m_sessionNode.replaceSubtree(oldNode, newNode); + currentPair->second = newNode; +} + bool SessionManagerPrivate::recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const { if (newDep == checkDep) @@ -385,11 +408,11 @@ void SessionManager::addProject(Project *pro) d->m_virginSession = false; QTC_ASSERT(!hasProject(pro), return); - d->m_projects.append(qMakePair(pro, pro->rootProjectNode())); - d->m_sessionNode.addNode(pro->rootProjectNode()); + d->m_projects.append(qMakePair(pro, nullptr)); + m_instance->updateProjectTree(pro); - connect(pro, &Project::fileListChanged, - m_instance, &SessionManager::clearProjectFileCache); + connect(pro, &Project::fileListChanged, m_instance, &SessionManager::clearProjectFileCache); + connect(pro, &Project::projectTreeChanged, m_instance, &SessionManager::updateProjectTree); connect(pro, &Project::displayNameChanged, m_instance, [pro] { d->m_sessionNode.emitNodeUpdated(); @@ -405,7 +428,7 @@ void SessionManager::removeProject(Project *project) { d->m_virginSession = false; QTC_ASSERT(project, return); - removeProjects(QList() << project); + removeProjects({project}); } bool SessionManager::loadingSession() @@ -737,6 +760,8 @@ void SessionManager::removeProjects(QList remove) // Delete projects foreach (Project *pro, remove) { pro->saveSettings(); + pro->setRootProjectNode(nullptr); // Deregister project with sessionnode! + d->m_projects = Utils::filtered(d->m_projects, [pro](const QPair &pair) { @@ -749,8 +774,6 @@ void SessionManager::removeProjects(QList remove) disconnect(pro, &Project::fileListChanged, m_instance, &SessionManager::clearProjectFileCache); d->m_projectFileCache.remove(pro); - - d->m_sessionNode.removeNode(pro->rootProjectNode()); emit m_instance->projectRemoved(pro); delete pro; } diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index 1510b7ae5a8..b97f297ff2d 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -144,6 +144,7 @@ signals: // for tests only private: static void saveActiveMode(Core::Id mode); void clearProjectFileCache(); + void updateProjectTree(Project *pro); static void configureEditor(Core::IEditor *editor, const QString &fileName); static void markSessionFileDirty(bool makeDefaultVirginDirty = true); static void configureEditors(Project *project);