From bccda22cceafb591bec817a97809a13b85c4c9f5 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 13 Feb 2017 12:45:23 +0100 Subject: [PATCH] ProjectExplorer: Add a way to iterate over the node tree Similar to what is used in Utils::TreeModel: Use lambdas as "visitor". Change-Id: Ia6e1a7ec022b61f94b01e1e8476bb932d22fd161 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/projectnodes.cpp | 32 ++++++++++++++++++++ src/plugins/projectexplorer/projectnodes.h | 4 +++ 2 files changed, 36 insertions(+) diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index bf4e0309f83..c733db122b5 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -335,6 +335,38 @@ QIcon FolderNode::icon() const return m_icon; } +void FolderNode::forEachNode(const std::function &fileTask, + const std::function &folderTask, + const std::function &folderFilterTask) const +{ + if (folderFilterTask) { + if (!folderFilterTask(this)) + return; + } + if (fileTask) { + for (Node *n : m_nodes) { + if (FileNode *fn = n->asFileNode()) + fileTask(fn); + } + } + for (Node *n : m_nodes) { + if (FolderNode *fn = n->asFolderNode()) { + if (folderTask) + folderTask(fn); + fn->forEachNode(fileTask, folderTask, folderFilterTask); + } + } +} + +void FolderNode::forEachGenericNode(const std::function &genericTask) const +{ + for (Node *n : m_nodes) { + genericTask(n); + if (FolderNode *fn = n->asFolderNode()) + fn->forEachNode(genericTask); + } +} + QList FolderNode::fileNodes() const { QList result; diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 4672ef04e41..44bd7493743 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -194,6 +194,10 @@ public: QString displayName() const override; QIcon icon() const; + void forEachNode(const std::function &fileTask, + const std::function &folderTask = {}, + const std::function &folderFilterTask = {}) const; + void forEachGenericNode(const std::function &genericTask) const; const QList nodes() const { return m_nodes; } QList fileNodes() const; FileNode *fileNode(const Utils::FileName &file) const;