ProjectExplorer: Make the FlatModel a Utils::TreeModel

The FlatModel is essentially a proxy model keeping expansion and
filter state per ProjectTree(View). Using a Utils::TreeModel makes
it fast enough to allow recreation of the proxy structure on
structural changes simplifying the parent/child logic significantly.

The {Session,Project,Folder,File}Node hierarchy still is still primary
information and shared by all views.

Change-Id: Ic08180a19bda37908280ff30e0737d188ed93e92
Reviewed-by: Robert Loehning <robert.loehning@qt.io>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
hjk
2017-01-19 14:54:23 +01:00
parent 03a68a91bb
commit 3c743346b0
13 changed files with 236 additions and 1063 deletions

View File

@@ -93,7 +93,7 @@ public:
static QString windowTitleAddition(const QString &filePath);
static QString sessionTitle(const QString &filePath);
std::unique_ptr<SessionNode> m_sessionNode;
SessionNode m_sessionNode;
QString m_sessionName = QLatin1String("default");
bool m_virginSession = true;
bool m_loadingSession = false;
@@ -124,8 +124,6 @@ SessionManager::SessionManager(QObject *parent) : QObject(parent)
m_instance = this;
d = new SessionManagerPrivate;
d->m_sessionNode.reset(new SessionNode);
connect(ModeManager::instance(), &ModeManager::currentModeChanged,
this, &SessionManager::saveActiveMode);
@@ -383,13 +381,13 @@ void SessionManager::addProject(Project *pro)
QTC_ASSERT(!d->m_projects.contains(pro), return);
d->m_projects.append(pro);
d->m_sessionNode->addProjectNodes(QList<ProjectNode *>() << pro->rootProjectNode());
d->m_sessionNode.addProjectNodes({ pro->rootProjectNode() });
connect(pro, &Project::fileListChanged,
m_instance, &SessionManager::clearProjectFileCache);
connect(pro, &Project::displayNameChanged, m_instance, [pro] {
d->m_sessionNode->projectDisplayNameChanged(pro->rootProjectNode());
d->m_sessionNode.emitNodeUpdated();
emit m_instance->projectDisplayNameChanged(pro);
});
@@ -650,11 +648,9 @@ Project *SessionManager::projectForNode(Node *node)
if (!rootProjectNode)
rootProjectNode = node->parentFolderNode();
while (rootProjectNode && rootProjectNode->parentFolderNode() != d->m_sessionNode.get())
while (rootProjectNode && rootProjectNode->parentFolderNode() != &d->m_sessionNode)
rootProjectNode = rootProjectNode->parentFolderNode();
Q_ASSERT(rootProjectNode);
return Utils::findOrDefault(d->m_projects, Utils::equal(&Project::rootProjectNode, rootProjectNode));
}
@@ -742,7 +738,7 @@ void SessionManager::removeProjects(QList<Project *> remove)
m_instance, &SessionManager::clearProjectFileCache);
d->m_projectFileCache.remove(pro);
d->m_sessionNode->removeProjectNodes(QList<ProjectNode *>() << pro->rootProjectNode());
d->m_sessionNode.removeProjectNodes({ pro->rootProjectNode() });
emit m_instance->projectRemoved(pro);
delete pro;
}
@@ -1095,7 +1091,7 @@ QString SessionManager::lastSession()
SessionNode *SessionManager::sessionNode()
{
return d->m_sessionNode.get();
return &d->m_sessionNode;
}
void SessionManager::reportProjectLoadingProgress()