diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 1b0adc3d6a9..da2ab831d14 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -331,6 +331,35 @@ QList FolderNode::fileNodes() const return m_fileNodes; } +FileNode *FolderNode::fileNode(const Utils::FileName &file) const +{ + return Utils::findOrDefault(m_fileNodes, [&file](const FileNode *fn) { + return fn->filePath() == file; + }); +} + +FileNode *FolderNode::recursiveFileNode(const Utils::FileName &file) const +{ + Utils::FileName dir = file.parentDir(); + + const QDir thisDir(filePath().toString()); + QString relativePath = thisDir.relativeFilePath(dir.toString()); + if (relativePath == ".") + relativePath.clear(); + QStringList parts = relativePath.split('/', QString::SkipEmptyParts); + const ProjectExplorer::FolderNode *parent = this; + foreach (const QString &part, parts) { + dir.appendPath(part); + // Find folder in subFolders + parent = Utils::findOrDefault(parent->folderNodes(), [&dir](const FolderNode *fn) { + return fn->filePath() == dir; + }); + if (!parent) + return nullptr; + } + return parent->fileNode(file); +} + QList FolderNode::recursiveFileNodes() const { QList result = fileNodes(); @@ -344,34 +373,35 @@ QList FolderNode::folderNodes() const return m_folderNodes; } -FolderNode *FolderNode::findOrCreateFolderNode(const QString &directory) +FolderNode *FolderNode::folderNode(const Utils::FileName &directory) const +{ + return Utils::findOrDefault(m_folderNodes, [&directory](const FolderNode *fn) { + return fn->filePath() == directory; + }); +} + +FolderNode *FolderNode::recursiveFindOrCreateFolderNode(const QString &directory) { Utils::FileName path = filePath(); QDir parentDir(path.toString()); QString relativePath = parentDir.relativeFilePath(directory); if (relativePath == ".") relativePath.clear(); + QStringList parts = relativePath.split('/', QString::SkipEmptyParts); ProjectExplorer::FolderNode *parent = this; foreach (const QString &part, parts) { path.appendPath(part); // Find folder in subFolders - bool found = false; - foreach (ProjectExplorer::FolderNode *folder, parent->folderNodes()) { - if (folder->filePath() == path) { - // yeah found something :) - parent = folder; - found = true; - break; - } - } - if (!found) { + FolderNode *next = parent->folderNode(path); + if (!next) { // No FolderNode yet, so create it auto tmp = new ProjectExplorer::FolderNode(path); tmp->setDisplayName(part); parent->addFolderNodes(QList({ tmp })); - parent = tmp; + next = tmp; } + parent = next; } return parent; } @@ -397,7 +427,7 @@ void FolderNode::buildTree(QList &files) foreach (ProjectExplorer::FileNode *fn, added) { // Get relative path to rootNode QString parentDir = fn->filePath().toFileInfo().absolutePath(); - ProjectExplorer::FolderNode *folder = findOrCreateFolderNode(parentDir); + ProjectExplorer::FolderNode *folder = recursiveFindOrCreateFolderNode(parentDir); addedFolderMapping[folder] << fn; } diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index baf30c40926..bdc283e7af6 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -184,9 +184,12 @@ public: QIcon icon() const; QList fileNodes() const; + FileNode *fileNode(const Utils::FileName &file) const; + FileNode *recursiveFileNode(const Utils::FileName &file) const; QList recursiveFileNodes() const; QList folderNodes() const; - FolderNode *findOrCreateFolderNode(const QString &directory); + FolderNode *folderNode(const Utils::FileName &directory) const; + FolderNode *recursiveFindOrCreateFolderNode(const QString &directory); void buildTree(QList &files); virtual void accept(NodesVisitor *visitor);