forked from qt-creator/qt-creator
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>
This commit is contained in:
@@ -134,7 +134,6 @@ CMakeProject::~CMakeProject()
|
|||||||
future.waitForFinished();
|
future.waitForFinished();
|
||||||
}
|
}
|
||||||
delete m_cppCodeModelUpdater;
|
delete m_cppCodeModelUpdater;
|
||||||
setRootProjectNode(nullptr);
|
|
||||||
qDeleteAll(m_extraCompilers);
|
qDeleteAll(m_extraCompilers);
|
||||||
qDeleteAll(m_allFiles);
|
qDeleteAll(m_allFiles);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -420,13 +420,12 @@ void Project::setDocument(Core::IDocument *doc)
|
|||||||
|
|
||||||
void Project::setRootProjectNode(ProjectNode *root)
|
void Project::setRootProjectNode(ProjectNode *root)
|
||||||
{
|
{
|
||||||
ProjectNode *oldNode = d->m_rootProjectNode;
|
if (d->m_rootProjectNode == root)
|
||||||
if (oldNode == root)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
d->m_rootProjectNode = root;
|
d->m_rootProjectNode = root;
|
||||||
emit projectTreeChanged(this, QPrivateSignal());
|
emit projectTreeChanged(this, QPrivateSignal());
|
||||||
delete oldNode;
|
// Do not delete oldNode! The ProjectTree owns that!
|
||||||
}
|
}
|
||||||
|
|
||||||
Target *Project::restoreTarget(const QVariantMap &data)
|
Target *Project::restoreTarget(const QVariantMap &data)
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ class NamedWidget;
|
|||||||
class ProjectImporter;
|
class ProjectImporter;
|
||||||
class ProjectNode;
|
class ProjectNode;
|
||||||
class ProjectPrivate;
|
class ProjectPrivate;
|
||||||
|
class Session;
|
||||||
class Target;
|
class Target;
|
||||||
|
|
||||||
// Documentation inside.
|
// Documentation inside.
|
||||||
@@ -189,6 +190,8 @@ private:
|
|||||||
|
|
||||||
void setActiveTarget(Target *target);
|
void setActiveTarget(Target *target);
|
||||||
ProjectPrivate *d;
|
ProjectPrivate *d;
|
||||||
|
|
||||||
|
friend class Session;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ProjectExplorer
|
} // namespace ProjectExplorer
|
||||||
|
|||||||
@@ -465,8 +465,6 @@ void FolderNode::buildTree(QList<FileNode *> &files, const Utils::FileName &over
|
|||||||
overrideBaseDir);
|
overrideBaseDir);
|
||||||
folder->addNode(fn);
|
folder->addNode(fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
emitTreeChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// "Compress" a tree of foldernodes such that foldernodes with exactly one foldernode as a child
|
// "Compress" a tree of foldernodes such that foldernodes with exactly one foldernode as a child
|
||||||
|
|||||||
@@ -188,6 +188,29 @@ void SessionManager::clearProjectFileCache()
|
|||||||
d->m_projectFileCache.clear();
|
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
|
bool SessionManagerPrivate::recursiveDependencyCheck(const QString &newDep, const QString &checkDep) const
|
||||||
{
|
{
|
||||||
if (newDep == checkDep)
|
if (newDep == checkDep)
|
||||||
@@ -385,11 +408,11 @@ void SessionManager::addProject(Project *pro)
|
|||||||
d->m_virginSession = false;
|
d->m_virginSession = false;
|
||||||
QTC_ASSERT(!hasProject(pro), return);
|
QTC_ASSERT(!hasProject(pro), return);
|
||||||
|
|
||||||
d->m_projects.append(qMakePair(pro, pro->rootProjectNode()));
|
d->m_projects.append(qMakePair(pro, nullptr));
|
||||||
d->m_sessionNode.addNode(pro->rootProjectNode());
|
m_instance->updateProjectTree(pro);
|
||||||
|
|
||||||
connect(pro, &Project::fileListChanged,
|
connect(pro, &Project::fileListChanged, m_instance, &SessionManager::clearProjectFileCache);
|
||||||
m_instance, &SessionManager::clearProjectFileCache);
|
connect(pro, &Project::projectTreeChanged, m_instance, &SessionManager::updateProjectTree);
|
||||||
|
|
||||||
connect(pro, &Project::displayNameChanged, m_instance, [pro] {
|
connect(pro, &Project::displayNameChanged, m_instance, [pro] {
|
||||||
d->m_sessionNode.emitNodeUpdated();
|
d->m_sessionNode.emitNodeUpdated();
|
||||||
@@ -405,7 +428,7 @@ void SessionManager::removeProject(Project *project)
|
|||||||
{
|
{
|
||||||
d->m_virginSession = false;
|
d->m_virginSession = false;
|
||||||
QTC_ASSERT(project, return);
|
QTC_ASSERT(project, return);
|
||||||
removeProjects(QList<Project*>() << project);
|
removeProjects({project});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SessionManager::loadingSession()
|
bool SessionManager::loadingSession()
|
||||||
@@ -737,6 +760,8 @@ void SessionManager::removeProjects(QList<Project *> remove)
|
|||||||
// Delete projects
|
// Delete projects
|
||||||
foreach (Project *pro, remove) {
|
foreach (Project *pro, remove) {
|
||||||
pro->saveSettings();
|
pro->saveSettings();
|
||||||
|
pro->setRootProjectNode(nullptr); // Deregister project with sessionnode!
|
||||||
|
|
||||||
d->m_projects
|
d->m_projects
|
||||||
= Utils::filtered(d->m_projects, [pro](const QPair<Project *, ProjectNode *> &pair)
|
= 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,
|
disconnect(pro, &Project::fileListChanged,
|
||||||
m_instance, &SessionManager::clearProjectFileCache);
|
m_instance, &SessionManager::clearProjectFileCache);
|
||||||
d->m_projectFileCache.remove(pro);
|
d->m_projectFileCache.remove(pro);
|
||||||
|
|
||||||
d->m_sessionNode.removeNode(pro->rootProjectNode());
|
|
||||||
emit m_instance->projectRemoved(pro);
|
emit m_instance->projectRemoved(pro);
|
||||||
delete pro;
|
delete pro;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ signals: // for tests only
|
|||||||
private:
|
private:
|
||||||
static void saveActiveMode(Core::Id mode);
|
static void saveActiveMode(Core::Id mode);
|
||||||
void clearProjectFileCache();
|
void clearProjectFileCache();
|
||||||
|
void updateProjectTree(Project *pro);
|
||||||
static void configureEditor(Core::IEditor *editor, const QString &fileName);
|
static void configureEditor(Core::IEditor *editor, const QString &fileName);
|
||||||
static void markSessionFileDirty(bool makeDefaultVirginDirty = true);
|
static void markSessionFileDirty(bool makeDefaultVirginDirty = true);
|
||||||
static void configureEditors(Project *project);
|
static void configureEditors(Project *project);
|
||||||
|
|||||||
Reference in New Issue
Block a user