[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