ProjectExplorer: Make FolderNodes a bit easier to work with

Add some methods to look up different kinds of nodes in the
project tree.

Change-Id: Ia91844b45c2a124dc01771297e1f5c414d84e7cb
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2016-11-07 12:11:26 +01:00
parent 67e011ba5f
commit c7b0163fcb
2 changed files with 47 additions and 14 deletions

View File

@@ -331,6 +331,35 @@ QList<FileNode*> FolderNode::fileNodes() const
return m_fileNodes; 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<FileNode *> FolderNode::recursiveFileNodes() const QList<FileNode *> FolderNode::recursiveFileNodes() const
{ {
QList<FileNode *> result = fileNodes(); QList<FileNode *> result = fileNodes();
@@ -344,34 +373,35 @@ QList<FolderNode*> FolderNode::folderNodes() const
return m_folderNodes; 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(); Utils::FileName path = filePath();
QDir parentDir(path.toString()); QDir parentDir(path.toString());
QString relativePath = parentDir.relativeFilePath(directory); QString relativePath = parentDir.relativeFilePath(directory);
if (relativePath == ".") if (relativePath == ".")
relativePath.clear(); relativePath.clear();
QStringList parts = relativePath.split('/', QString::SkipEmptyParts); QStringList parts = relativePath.split('/', QString::SkipEmptyParts);
ProjectExplorer::FolderNode *parent = this; ProjectExplorer::FolderNode *parent = this;
foreach (const QString &part, parts) { foreach (const QString &part, parts) {
path.appendPath(part); path.appendPath(part);
// Find folder in subFolders // Find folder in subFolders
bool found = false; FolderNode *next = parent->folderNode(path);
foreach (ProjectExplorer::FolderNode *folder, parent->folderNodes()) { if (!next) {
if (folder->filePath() == path) {
// yeah found something :)
parent = folder;
found = true;
break;
}
}
if (!found) {
// No FolderNode yet, so create it // No FolderNode yet, so create it
auto tmp = new ProjectExplorer::FolderNode(path); auto tmp = new ProjectExplorer::FolderNode(path);
tmp->setDisplayName(part); tmp->setDisplayName(part);
parent->addFolderNodes(QList<ProjectExplorer::FolderNode *>({ tmp })); parent->addFolderNodes(QList<ProjectExplorer::FolderNode *>({ tmp }));
parent = tmp; next = tmp;
} }
parent = next;
} }
return parent; return parent;
} }
@@ -397,7 +427,7 @@ void FolderNode::buildTree(QList<FileNode *> &files)
foreach (ProjectExplorer::FileNode *fn, added) { 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 = findOrCreateFolderNode(parentDir); ProjectExplorer::FolderNode *folder = recursiveFindOrCreateFolderNode(parentDir);
addedFolderMapping[folder] << fn; addedFolderMapping[folder] << fn;
} }

View File

@@ -184,9 +184,12 @@ public:
QIcon icon() const; QIcon icon() const;
QList<FileNode *> fileNodes() const; QList<FileNode *> fileNodes() const;
FileNode *fileNode(const Utils::FileName &file) const;
FileNode *recursiveFileNode(const Utils::FileName &file) const;
QList<FileNode *> recursiveFileNodes() const; QList<FileNode *> recursiveFileNodes() const;
QList<FolderNode *> folderNodes() const; QList<FolderNode *> folderNodes() const;
FolderNode *findOrCreateFolderNode(const QString &directory); FolderNode *folderNode(const Utils::FileName &directory) const;
FolderNode *recursiveFindOrCreateFolderNode(const QString &directory);
void buildTree(QList<FileNode *> &files); void buildTree(QList<FileNode *> &files);
virtual void accept(NodesVisitor *visitor); virtual void accept(NodesVisitor *visitor);