diff --git a/src/libs/utils/treemodel.cpp b/src/libs/utils/treemodel.cpp index db8923e372a..19f3fc72c48 100644 --- a/src/libs/utils/treemodel.cpp +++ b/src/libs/utils/treemodel.cpp @@ -841,6 +841,18 @@ TreeItem *TreeItem::findAnyChild(const std::function &pred) co return 0; } +TreeItem *TreeItem::reverseFindAnyChild(const std::function &pred) const +{ + auto end = m_children.rend(); + for (auto it = m_children.rbegin(); it != end; ++it) { + if (pred(*it)) + return *it; + if (TreeItem *found = (*it)->reverseFindAnyChild(pred)) + return found; + } + return nullptr; +} + void TreeItem::clear() { while (childCount() != 0) { diff --git a/src/libs/utils/treemodel.h b/src/libs/utils/treemodel.h index 60db234d3b4..d62670867be 100644 --- a/src/libs/utils/treemodel.h +++ b/src/libs/utils/treemodel.h @@ -78,6 +78,8 @@ public: void forSelectedChildren(const std::function &pred) const; void forAllChildren(const std::function &pred) const; TreeItem *findAnyChild(const std::function &pred) const; + // like findAnyChild() but processes children from bottom to top + TreeItem *reverseFindAnyChild(const std::function &pred) const; // Levels are 1-based: Child at Level 1 is an immediate child. void forChildrenAtLevel(int level, const std::function &pred) const; diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp index c962b8a19f6..3bfdba93573 100644 --- a/src/plugins/autotest/testresultmodel.cpp +++ b/src/plugins/autotest/testresultmodel.cpp @@ -313,7 +313,7 @@ TestResultItem *TestResultModel::findParentItemFor(const TestResultItem *item, TestResultItem *currentItem = static_cast(it); return currentItem->testResult()->isDirectParentOf(result, &needsIntermediate); }; - TestResultItem *parent = static_cast(root->findAnyChild(predicate)); + TestResultItem *parent = static_cast(root->reverseFindAnyChild(predicate)); if (parent) { if (needsIntermediate) { // check if the intermediate is present already