forked from qt-creator/qt-creator
ProjectExplorer: Simplify FolderNode::buildTree
Change-Id: Id2425310ee4192758a2b21b22fe49ffe9b30d276 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -447,52 +447,16 @@ FolderNode *FolderNode::recursiveFindOrCreateFolderNode(const QString &directory
|
|||||||
|
|
||||||
void FolderNode::buildTree(QList<FileNode *> &files, const Utils::FileName &overrideBaseDir)
|
void FolderNode::buildTree(QList<FileNode *> &files, const Utils::FileName &overrideBaseDir)
|
||||||
{
|
{
|
||||||
// Gather old list
|
qDeleteAll(m_fileNodes);
|
||||||
QList<ProjectExplorer::FileNode *> oldFiles = recursiveFileNodes();
|
m_fileNodes.clear();
|
||||||
Utils::sort(oldFiles, Node::sortByPath);
|
qDeleteAll(m_folderNodes);
|
||||||
Utils::sort(files, Node::sortByPath);
|
m_folderNodes.clear();
|
||||||
|
|
||||||
QList<ProjectExplorer::FileNode *> added;
|
foreach (ProjectExplorer::FileNode *fn, files) {
|
||||||
QList<ProjectExplorer::FileNode *> deleted;
|
|
||||||
|
|
||||||
ProjectExplorer::compareSortedLists(oldFiles, files, deleted, added, Node::sortByPath);
|
|
||||||
|
|
||||||
qDeleteAll(ProjectExplorer::subtractSortedList(files, added, Node::sortByPath));
|
|
||||||
|
|
||||||
QHash<ProjectExplorer::FolderNode *, QList<ProjectExplorer::FileNode *>> addedFolderMapping;
|
|
||||||
QHash<ProjectExplorer::FolderNode *, QList<ProjectExplorer::FileNode *>> deletedFolderMapping;
|
|
||||||
|
|
||||||
// add added nodes
|
|
||||||
foreach (ProjectExplorer::FileNode *fn, added) {
|
|
||||||
// Get relative path to rootNode
|
// Get relative path to rootNode
|
||||||
QString parentDir = fn->filePath().toFileInfo().absolutePath();
|
QString parentDir = fn->filePath().toFileInfo().absolutePath();
|
||||||
ProjectExplorer::FolderNode *folder
|
ProjectExplorer::FolderNode *folder = recursiveFindOrCreateFolderNode(parentDir, overrideBaseDir);
|
||||||
= recursiveFindOrCreateFolderNode(parentDir, overrideBaseDir);
|
folder->addFileNodes({ fn });
|
||||||
addedFolderMapping[folder] << fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto i = addedFolderMapping.constBegin(); i != addedFolderMapping.constEnd(); ++i)
|
|
||||||
i.key()->addFileNodes(i.value());
|
|
||||||
|
|
||||||
// remove old file nodes and check whether folder nodes can be removed
|
|
||||||
foreach (ProjectExplorer::FileNode *fn, deleted)
|
|
||||||
deletedFolderMapping[fn->parentFolderNode()] << fn;
|
|
||||||
|
|
||||||
for (auto i = deletedFolderMapping.constBegin(); i != deletedFolderMapping.constEnd(); ++i) {
|
|
||||||
ProjectExplorer::FolderNode *parent = i.key();
|
|
||||||
parent->removeFileNodes(i.value());
|
|
||||||
|
|
||||||
if (parent == this) // Never delete this node!
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Check for empty parent
|
|
||||||
while (parent->folderNodes().isEmpty() && parent->fileNodes().isEmpty()) {
|
|
||||||
ProjectExplorer::FolderNode *grandparent = parent->parentFolderNode();
|
|
||||||
grandparent->removeFolderNodes(QList<ProjectExplorer::FolderNode *>() << parent);
|
|
||||||
parent = grandparent;
|
|
||||||
if (parent == this)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user