From 568130da7035fa4b7c47cf995d2e51b6f7e30bf8 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 13 Feb 2017 17:31:30 +0100 Subject: [PATCH] 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 --- .../cmakeprojectmanager/servermodereader.cpp | 2 ++ src/plugins/projectexplorer/projectnodes.cpp | 27 +++++++++++++++++++ src/plugins/projectexplorer/projectnodes.h | 1 + 3 files changed, 30 insertions(+) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 1ec9f63aca1..23db99ff31d 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -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, diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 3f05c3b7362..bf4e0309f83 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -459,6 +459,33 @@ void FolderNode::buildTree(QList &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 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); diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 1933e44bc3c..4672ef04e41 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -204,6 +204,7 @@ public: FolderNode *recursiveFindOrCreateFolderNode(const Utils::FileName &directory, const Utils::FileName &overrideBaseDir = Utils::FileName()); void buildTree(QList &files, const Utils::FileName &overrideBaseDir = Utils::FileName()); + void compress(); virtual void accept(NodesVisitor *visitor);