diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2017-03-03 14:40:02 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2017-03-10 16:22:21 +0000 |
commit | 71a5aee36fa90bab83614ded6bb182be6c5bf5e0 (patch) | |
tree | 6c6ac48e32820e724cc6fa451984f4b5d71260b3 /src | |
parent | 707990632cfefe6f43533725b5d531642967bbd7 (diff) |
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 <hjk@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakeproject.cpp | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/project.cpp | 5 | ||||
-rw-r--r-- | src/plugins/projectexplorer/project.h | 3 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectnodes.cpp | 2 | ||||
-rw-r--r-- | src/plugins/projectexplorer/session.cpp | 37 | ||||
-rw-r--r-- | 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 a1b7b9b946..5a566bffab 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 45bf8769da..9eb8956dae 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 d3dcce9dbf..3ca35707fc 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 39305c7e8c..ea759cc0eb 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -465,8 +465,6 @@ void FolderNode::buildTree(QList<FileNode *> &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 e977571f88..688439f2f9 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<Project *, ProjectNode *> *currentPair = nullptr; + for (QPair<Project *, ProjectNode *> &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*>() << project); + removeProjects({project}); } bool SessionManager::loadingSession() @@ -737,6 +760,8 @@ void SessionManager::removeProjects(QList<Project *> 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<Project *, ProjectNode *> &pair) { @@ -749,8 +774,6 @@ void SessionManager::removeProjects(QList<Project *> 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 1510b7ae5a..b97f297ff2 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); |