From 1f13a1466e8edff14c24d20869a5e9fd4ef8a363 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 24 Aug 2017 16:03:01 +0100 Subject: [PATCH] Add RDTreeWidgetItemIterator for depth-first forward-only iteration --- qrenderdoc/Widgets/Extended/RDTreeWidget.cpp | 42 ++++++++++++++++++++ qrenderdoc/Widgets/Extended/RDTreeWidget.h | 29 ++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp index dba2df4bc..0c38bf80e 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp @@ -412,6 +412,48 @@ void RDTreeWidgetItem::clear() m_widget->m_model->endRemoveChildren(); } +RDTreeWidgetItemIterator::RDTreeWidgetItemIterator(RDTreeWidget *widget) +{ + if(widget->topLevelItemCount() == 0) + m_Current = NULL; + else + m_Current = widget->topLevelItem(0); +} + +RDTreeWidgetItemIterator &RDTreeWidgetItemIterator::operator++() +{ + // depth first + if(m_Current->childCount() > 0) + { + m_Current = m_Current->child(0); + return *this; + } + + // otherwise check if we have siblings, recursively up + RDTreeWidgetItem *parent = m_Current->parent(); + RDTreeWidgetItem *child = m_Current; + while(parent) + { + // if there's a sibling at this level, move to it + int idx = parent->indexOfChild(child); + if(idx + 1 < parent->childCount()) + { + m_Current = parent->child(idx + 1); + return *this; + } + + // if there are no more siblings at this level, move up + child = parent; + parent = parent->parent(); + + // if we just exhausted siblings at the top-level, parent will now be NULL, so we abort. + } + + // no more siblings, stop. + m_Current = NULL; + return *this; +} + RDTreeWidget::RDTreeWidget(QWidget *parent) : RDTreeView(parent) { // we'll call this ourselves in drawBranches() diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.h b/qrenderdoc/Widgets/Extended/RDTreeWidget.h index ace2a75c1..01a655237 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.h +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.h @@ -145,6 +145,35 @@ private: QVariant m_tag; }; +class RDTreeWidgetItemIterator +{ +public: + RDTreeWidgetItemIterator(RDTreeWidget *widget); + + RDTreeWidgetItemIterator &operator++(); + inline const RDTreeWidgetItemIterator operator++(int) + { + RDTreeWidgetItemIterator it = *this; + ++(*this); + return it; + } + + // TODO implement operator-- if we need it. + /* + RDTreeWidgetItemIterator &operator--(); + inline const RDTreeWidgetItemIterator operator--(int) + { + RDTreeWidgetItemIterator it = *this; + --(*this); + return it; + } + */ + + inline RDTreeWidgetItem *operator*() const { return m_Current; } +private: + RDTreeWidgetItem *m_Current; +}; + class RDTreeWidget : public RDTreeView { Q_OBJECT