aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/treemodel.cpp
diff options
context:
space:
mode:
authorhjk <hjk@theqtcompany.com>2016-07-25 16:48:15 +0200
committerhjk <hjk@qt.io>2016-08-03 09:23:46 +0000
commitdef8ca8ba1fce10a0514215e333598f831ab6e45 (patch)
treee9851f299860491d39ee9ecd121c3aa8129e7fbd /src/libs/utils/treemodel.cpp
parentbe2a0b9ecd3cd67d122591d202a97d5515086763 (diff)
TreeModel: Move some base TreeItem code out-of-line
Avoid code explosion. Change-Id: I7d239a4560e90b68cc4991341adf940a98776254 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/libs/utils/treemodel.cpp')
-rw-r--r--src/libs/utils/treemodel.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/libs/utils/treemodel.cpp b/src/libs/utils/treemodel.cpp
index 48dd4ac1b0..3acc9dbcdf 100644
--- a/src/libs/utils/treemodel.cpp
+++ b/src/libs/utils/treemodel.cpp
@@ -777,6 +777,61 @@ QAbstractItemModel *TreeItem::model() const
return m_model;
}
+void TreeItem::forAllChildren(const std::function<void (TreeItem *)> &pred) const
+{
+ foreach (TreeItem *item, m_children) {
+ pred(item);
+ item->forAllChildren(pred);
+ }
+}
+
+void TreeItem::forSelectedChildren(const std::function<bool (TreeItem *)> &pred) const
+{
+ foreach (TreeItem *item, m_children) {
+ if (pred(item))
+ item->forSelectedChildren(pred);
+ }
+}
+
+void TreeItem::forChildrenAtLevel(int level, const std::function<void(TreeItem *)> &pred) const
+{
+ QTC_ASSERT(level > 0, return);
+ if (level == 1) {
+ foreach (TreeItem *item, m_children)
+ pred(item);
+ } else {
+ foreach (TreeItem *item, m_children)
+ item->forChildrenAtLevel(level - 1, pred);
+ }
+}
+
+TreeItem *TreeItem::findChildAtLevel(int level, const std::function<bool(TreeItem *)> &pred) const
+{
+ QTC_ASSERT(level > 0, return 0);
+ if (level == 1) {
+ foreach (TreeItem *item, m_children)
+ if (pred(item))
+ return item;
+ } else {
+ foreach (TreeItem *item, m_children) {
+ if (auto found = item->findChildAtLevel(level - 1, pred))
+ return found;
+ }
+ }
+ return 0;
+}
+
+TreeItem *TreeItem::findAnyChild(const std::function<bool(TreeItem *)> &pred) const
+{
+ foreach (TreeItem *item, m_children) {
+ if (pred(item))
+ return item;
+ if (TreeItem *found = item->findAnyChild(pred))
+ return found;
+ }
+ return 0;
+}
+
void TreeItem::clear()
{
while (m_children.size()) {