forked from qt-creator/qt-creator
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:
@@ -226,6 +226,8 @@ static void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, i
|
|||||||
folder->setDisplayName(displayName);
|
folder->setDisplayName(displayName);
|
||||||
base->addNode(folder);
|
base->addNode(folder);
|
||||||
folder->buildTree(files);
|
folder->buildTree(files);
|
||||||
|
for (FolderNode *fn : folder->folderNodes())
|
||||||
|
fn->compress();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addCMakeInputs(CMakeListsNode *root,
|
static void addCMakeInputs(CMakeListsNode *root,
|
||||||
|
|||||||
@@ -459,6 +459,33 @@ void FolderNode::buildTree(QList<FileNode *> &files, const Utils::FileName &over
|
|||||||
emitTreeChanged();
|
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)
|
void FolderNode::accept(NodesVisitor *visitor)
|
||||||
{
|
{
|
||||||
visitor->visitFolderNode(this);
|
visitor->visitFolderNode(this);
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ public:
|
|||||||
FolderNode *recursiveFindOrCreateFolderNode(const Utils::FileName &directory,
|
FolderNode *recursiveFindOrCreateFolderNode(const Utils::FileName &directory,
|
||||||
const Utils::FileName &overrideBaseDir = Utils::FileName());
|
const Utils::FileName &overrideBaseDir = Utils::FileName());
|
||||||
void buildTree(QList<FileNode *> &files, const Utils::FileName &overrideBaseDir = Utils::FileName());
|
void buildTree(QList<FileNode *> &files, const Utils::FileName &overrideBaseDir = Utils::FileName());
|
||||||
|
void compress();
|
||||||
|
|
||||||
virtual void accept(NodesVisitor *visitor);
|
virtual void accept(NodesVisitor *visitor);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user