ProjectExplorer: Add FolderNode::compress

Add a method to FolderNode that compresses a tree of folders like
A/B/C/file.txt into one FolderNode (A/B/C) and a FileNode (file.txt)

Change-Id: I5efa038c33b91ea01017269daa048ba101085d01
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2017-02-13 17:31:30 +01:00
parent 0b6eb21388
commit 568130da70
3 changed files with 30 additions and 0 deletions

View File

@@ -226,6 +226,8 @@ static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, i
folder->setDisplayName(displayName);
base->addNode(folder);
folder->buildTree(files);
for (FolderNode *fn : folder->folderNodes())
fn->compress();
}
static void addCMakeInputs(CMakeListsNode *root,

View File

@@ -459,6 +459,33 @@ void FolderNode::buildTree(QList<FileNode *> &files, const Utils::FileName &over
emitTreeChanged();
}
// "Compress" a tree of foldernodes such that foldernodes with exactly one foldernode as a child
// are merged into one. This e.g. turns a sequence of FolderNodes "foo" "bar" "baz" into one
// FolderNode named "foo/bar/baz", saving a lot of clicks in the Project View to get to the actual
// files.
void FolderNode::compress()
{
QList<Node *> children = nodes();
if (auto subFolder = children.count() == 1 ? children.at(0)->asFolderNode() : nullptr) {
// Only one subfolder: Compress!
setDisplayName(QDir::toNativeSeparators(displayName() + "/" + subFolder->displayName()));
for (Node *n : subFolder->nodes()) {
subFolder->removeNode(n);
n->setParentFolderNode(nullptr);
addNode(n);
}
setAbsoluteFilePathAndLine(subFolder->filePath(), -1);
removeNode(subFolder);
delete subFolder;
compress();
} else {
for (FolderNode *fn : folderNodes())
fn->compress();
}
}
void FolderNode::accept(NodesVisitor *visitor)
{
visitor->visitFolderNode(this);

View File

@@ -204,6 +204,7 @@ public:
FolderNode *recursiveFindOrCreateFolderNode(const Utils::FileName &directory,
const Utils::FileName &overrideBaseDir = Utils::FileName());
void buildTree(QList<FileNode *> &files, const Utils::FileName &overrideBaseDir = Utils::FileName());
void compress();
virtual void accept(NodesVisitor *visitor);