[Bf-blender-cvs] [f4f84c833a4] temp-asset-browser-catalogs-ui: Cleanup: Use iterator rather than recursive functions

Julian Eisel noreply at git.blender.org
Wed Sep 15 19:05:31 CEST 2021


Commit: f4f84c833a4728b682dc4cf1ee9afdf0413e8ab5
Author: Julian Eisel
Date:   Wed Sep 15 18:09:28 2021 +0200
Branches: temp-asset-browser-catalogs-ui
https://developer.blender.org/rBf4f84c833a4728b682dc4cf1ee9afdf0413e8ab5

Cleanup: Use iterator rather than recursive functions

Also add missing `_` suffix for protected member variable.

===================================================================

M	source/blender/editors/include/UI_tree_view.hh
M	source/blender/editors/interface/tree_view.cc

===================================================================

diff --git a/source/blender/editors/include/UI_tree_view.hh b/source/blender/editors/include/UI_tree_view.hh
index 725975b2b8d..4b1b0057736 100644
--- a/source/blender/editors/include/UI_tree_view.hh
+++ b/source/blender/editors/include/UI_tree_view.hh
@@ -60,11 +60,19 @@ class uiTreeViewItemContainer {
  protected:
   Vector<std::unique_ptr<uiAbstractTreeViewItem>> children_;
   /** Adding the first item to the root will set this, then it's passed on to all children. */
-  uiTreeViewItemContainer *root = nullptr;
+  uiTreeViewItemContainer *root_ = nullptr;
   /** Pointer back to the owning item. */
   uiAbstractTreeViewItem *parent_ = nullptr;
 
  public:
+  enum class IterOptions {
+    None = 0,
+    SkipCollapsed = 1 << 0,
+
+    /* Keep ENUM_OPERATORS() below updated! */
+  };
+  using ItemIterFn = FunctionRef<void(uiAbstractTreeViewItem &)>;
+
   /**
    * Convenience wrapper taking the arguments needed to construct an item of type \a ItemT. Calls
    * the version just below.
@@ -79,8 +87,14 @@ class uiTreeViewItemContainer {
   }
 
   uiAbstractTreeViewItem &add_tree_item(std::unique_ptr<uiAbstractTreeViewItem> item);
+
+ protected:
+  void foreach_item_recursive(ItemIterFn iter_fn, IterOptions options = IterOptions::None) const;
 };
 
+ENUM_OPERATORS(uiTreeViewItemContainer::IterOptions,
+               uiTreeViewItemContainer::IterOptions::SkipCollapsed);
+
 /** \} */
 
 /* ---------------------------------------------------------------------- */
@@ -124,6 +138,8 @@ class uiAbstractTreeView : public uiTreeViewItemContainer {
  public:
   virtual ~uiAbstractTreeView() = default;
 
+  void foreach_item(ItemIterFn iter_fn, IterOptions options = IterOptions::None) const;
+
  protected:
   virtual void build_tree() = 0;
 
@@ -134,8 +150,6 @@ class uiAbstractTreeView : public uiTreeViewItemContainer {
   static uiAbstractTreeViewItem *find_matching_child(const uiAbstractTreeViewItem &lookup_item,
                                                      const uiTreeViewItemContainer &items);
   void build_layout_from_tree(const uiTreeViewLayoutBuilder &builder);
-  void build_layout_from_tree_recursive(const uiTreeViewLayoutBuilder &builder,
-                                        const uiTreeViewItemContainer &items);
 };
 
 /** \} */
diff --git a/source/blender/editors/interface/tree_view.cc b/source/blender/editors/interface/tree_view.cc
index 0eec47d610b..b0c4a35df08 100644
--- a/source/blender/editors/interface/tree_view.cc
+++ b/source/blender/editors/interface/tree_view.cc
@@ -40,13 +40,13 @@ uiAbstractTreeViewItem &uiTreeViewItemContainer::add_tree_item(
   children_.append(std::move(item));
 
   /* The first item that will be added to the root sets this. */
-  if (root == nullptr) {
-    root = this;
+  if (root_ == nullptr) {
+    root_ = this;
   }
 
   uiAbstractTreeViewItem &added_item = *children_.last();
-  added_item.root = root;
-  if (root != this) {
+  added_item.root_ = root_;
+  if (root_ != this) {
     /* Any item that isn't the root can be assumed to the a #uiAbstractTreeViewItem. Not entirely
      * nice to static_cast this, but well... */
     added_item.parent_ = static_cast<uiAbstractTreeViewItem *>(this);
@@ -55,31 +55,37 @@ uiAbstractTreeViewItem &uiTreeViewItemContainer::add_tree_item(
   return added_item;
 }
 
+void uiTreeViewItemContainer::foreach_item_recursive(ItemIterFn iter_fn, IterOptions options) const
+{
+  for (auto &child : children_) {
+    iter_fn(*child);
+    if (bool(options & IterOptions::SkipCollapsed) && child->is_collapsed()) {
+      continue;
+    }
+
+    child->foreach_item_recursive(iter_fn, options);
+  }
+}
+
 /* ---------------------------------------------------------------------- */
 
+void uiAbstractTreeView::foreach_item(ItemIterFn iter_fn, IterOptions options) const
+{
+  foreach_item_recursive(iter_fn, options);
+}
+
 void uiAbstractTreeView::build_layout_from_tree(const uiTreeViewLayoutBuilder &builder)
 {
   uiLayout *prev_layout = builder.current_layout();
 
   uiLayoutColumn(prev_layout, true);
 
-  build_layout_from_tree_recursive(builder, *this);
+  foreach_item([&builder](uiAbstractTreeViewItem &item) { builder.build_row(item); },
+               IterOptions::SkipCollapsed);
 
   UI_block_layout_set_current(&builder.block(), prev_layout);
 }
 
-void uiAbstractTreeView::build_layout_from_tree_recursive(const uiTreeViewLayoutBuilder &builder,
-                                                          const uiTreeViewItemContainer &items)
-{
-  for (const auto &item : items.children_) {
-    builder.build_row(*item);
-    if (!item->is_open_) {
-      continue;
-    }
-    build_layout_from_tree_recursive(builder, *item);
-  }
-}
-
 void uiAbstractTreeView::update_from_old(uiBlock &new_block)
 {
   uiBlock *old_block = new_block.oldblock;



More information about the Bf-blender-cvs mailing list