aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp1
-rw-r--r--src/plugins/projectexplorer/project.cpp5
-rw-r--r--src/plugins/projectexplorer/project.h3
-rw-r--r--src/plugins/projectexplorer/projectnodes.cpp2
-rw-r--r--src/plugins/projectexplorer/session.cpp37
-rw-r--r--src/plugins/projectexplorer/session.h1
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);