[Bf-blender-cvs] [dc6fe73e707] master: Outliner: Make use of new C++ based functional iterators

Julian Eisel noreply at git.blender.org
Wed May 25 23:22:35 CEST 2022


Commit: dc6fe73e707fc224cfdff8457f63ef9c0eb0a04b
Author: Julian Eisel
Date:   Wed May 25 23:12:06 2022 +0200
Branches: master
https://developer.blender.org/rBdc6fe73e707fc224cfdff8457f63ef9c0eb0a04b

Outliner: Make use of new C++ based functional iterators

(Not meant to cause user visible changes.)

Makes use of the new iterators introduced in the previous commit. Some
benefits:
- Shorter, simpler, easier to read & understand
- Deduplicates logic
- Centralizes iteration logic, making it easier to replace tree storage
  (as planned), see previous commit.
- Avoids having to pass (sub-)tree to iterate around (often redundant
  since it's just `SpaceOutliner.tree`, even though `SpaceOutliner` is
  already passed).
- Function arguments that are only passed to the recursive call are
  recognized as unused (found and removed a few).

Also does some general cleanups while refactoring the code for the
iterators. Use `const`, use references (signals null is not expected),
early-exit (see 16fd5fa656af), remove redundant arguments, etc.

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

M	source/blender/editors/space_outliner/outliner_context.cc
M	source/blender/editors/space_outliner/outliner_dragdrop.cc
M	source/blender/editors/space_outliner/outliner_draw.cc
M	source/blender/editors/space_outliner/outliner_edit.cc
M	source/blender/editors/space_outliner/outliner_intern.hh
M	source/blender/editors/space_outliner/outliner_select.cc
M	source/blender/editors/space_outliner/outliner_tools.cc
M	source/blender/editors/space_outliner/outliner_utils.cc
M	source/blender/editors/space_outliner/space_outliner.cc

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

diff --git a/source/blender/editors/space_outliner/outliner_context.cc b/source/blender/editors/space_outliner/outliner_context.cc
index d07b6641836..1a804cb58b8 100644
--- a/source/blender/editors/space_outliner/outliner_context.cc
+++ b/source/blender/editors/space_outliner/outliner_context.cc
@@ -12,23 +12,25 @@
 #include "DNA_space_types.h"
 
 #include "outliner_intern.hh"
+#include "tree/tree_iterator.hh"
 
-static void outliner_context_selected_ids_recursive(const ListBase *subtree,
+using namespace blender::ed::outliner;
+
+static void outliner_context_selected_ids_recursive(const SpaceOutliner &space_outliner,
                                                     bContextDataResult *result)
 {
-  LISTBASE_FOREACH (const TreeElement *, te, subtree) {
+  tree_iterator::all(space_outliner, [&](const TreeElement *te) {
     const TreeStoreElem *tse = TREESTORE(te);
     if ((tse->flag & TSE_SELECTED) && (ELEM(tse->type, TSE_SOME_ID, TSE_LAYER_COLLECTION))) {
       CTX_data_id_list_add(result, tse->id);
     }
-    outliner_context_selected_ids_recursive(&te->subtree, result);
-  }
+  });
 }
 
 static void outliner_context_selected_ids(const SpaceOutliner *space_outliner,
                                           bContextDataResult *result)
 {
-  outliner_context_selected_ids_recursive(&space_outliner->tree, result);
+  outliner_context_selected_ids_recursive(*space_outliner, result);
   CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
 }
 
diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.cc b/source/blender/editors/space_outliner/outliner_dragdrop.cc
index a22ce9d3d24..e20958c1b1e 100644
--- a/source/blender/editors/space_outliner/outliner_dragdrop.cc
+++ b/source/blender/editors/space_outliner/outliner_dragdrop.cc
@@ -316,7 +316,7 @@ static bool parent_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
 {
   SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
 
-  bool changed = outliner_flag_set(&space_outliner->tree, TSE_DRAG_ANY, false);
+  bool changed = outliner_flag_set(*space_outliner, TSE_DRAG_ANY, false);
   if (changed) {
     ED_region_tag_redraw_no_rebuild(CTX_wm_region(C));
   }
@@ -847,8 +847,7 @@ static bool datastack_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event)
 
   SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
   ARegion *region = CTX_wm_region(C);
-  bool changed = outliner_flag_set(
-      &space_outliner->tree, TSE_HIGHLIGHTED_ANY | TSE_DRAG_ANY, false);
+  bool changed = outliner_flag_set(*space_outliner, TSE_HIGHLIGHTED_ANY | TSE_DRAG_ANY, false);
 
   StackDropData *drop_data = reinterpret_cast<StackDropData *>(drag->poin);
   if (!drop_data) {
@@ -1195,8 +1194,7 @@ static bool collection_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event
 {
   SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
   ARegion *region = CTX_wm_region(C);
-  bool changed = outliner_flag_set(
-      &space_outliner->tree, TSE_HIGHLIGHTED_ANY | TSE_DRAG_ANY, false);
+  bool changed = outliner_flag_set(*space_outliner, TSE_HIGHLIGHTED_ANY | TSE_DRAG_ANY, false);
 
   CollectionDrop data;
   if (((event->modifier & KM_SHIFT) == 0) &&
@@ -1461,7 +1459,7 @@ static int outliner_item_drag_drop_invoke(bContext *C,
 
     /* Only drag element under mouse if it was not selected before. */
     if ((tselem->flag & TSE_SELECTED) == 0) {
-      outliner_flag_set(&space_outliner->tree, TSE_SELECTED, 0);
+      outliner_flag_set(*space_outliner, TSE_SELECTED, 0);
       tselem->flag |= TSE_SELECTED;
     }
 
diff --git a/source/blender/editors/space_outliner/outliner_draw.cc b/source/blender/editors/space_outliner/outliner_draw.cc
index 92353c02d3f..753de83a10d 100644
--- a/source/blender/editors/space_outliner/outliner_draw.cc
+++ b/source/blender/editors/space_outliner/outliner_draw.cc
@@ -71,6 +71,7 @@
 #include "tree/tree_element_id.hh"
 #include "tree/tree_element_overrides.hh"
 #include "tree/tree_element_rna.hh"
+#include "tree/tree_iterator.hh"
 
 using namespace blender;
 using namespace blender::ed::outliner;
@@ -1715,72 +1716,70 @@ static void outliner_draw_restrictbuts(uiBlock *block,
 }
 
 static void outliner_draw_userbuts(uiBlock *block,
-                                   ARegion *region,
-                                   SpaceOutliner *space_outliner,
-                                   ListBase *lb)
+                                   const ARegion *region,
+                                   const SpaceOutliner *space_outliner)
 {
+  tree_iterator::all_open(*space_outliner, [&](const TreeElement *te) {
+    if (!outliner_is_element_in_view(te, &region->v2d)) {
+      return;
+    }
 
-  LISTBASE_FOREACH (TreeElement *, te, lb) {
-    TreeStoreElem *tselem = TREESTORE(te);
-    if (outliner_is_element_in_view(te, &region->v2d)) {
-      if (tselem->type == TSE_SOME_ID) {
-        uiBut *bt;
-        ID *id = tselem->id;
-        const char *tip = nullptr;
-        char buf[16] = "";
-        int but_flag = UI_BUT_DRAG_LOCK;
+    const TreeStoreElem *tselem = TREESTORE(te);
+    if (tselem->type != TSE_SOME_ID) {
+      return;
+    }
 
-        if (ID_IS_LINKED(id)) {
-          but_flag |= UI_BUT_DISABLED;
-        }
+    uiBut *bt;
+    ID *id = tselem->id;
+    const char *tip = nullptr;
+    char buf[16] = "";
+    int but_flag = UI_BUT_DRAG_LOCK;
 
-        BLI_str_format_int_grouped(buf, id->us);
-        bt = uiDefBut(block,
-                      UI_BTYPE_BUT,
-                      1,
-                      buf,
-                      (int)(region->v2d.cur.xmax - OL_TOG_USER_BUTS_USERS),
-                      te->ys,
-                      UI_UNIT_X,
-                      UI_UNIT_Y,
-                      nullptr,
-                      0.0,
-                      0.0,
-                      0,
-                      0,
-                      TIP_("Number of users of this data-block"));
-        UI_but_flag_enable(bt, but_flag);
-
-        if (id->flag & LIB_FAKEUSER) {
-          tip = TIP_("Data-block will be retained using a fake user");
-        }
-        else {
-          tip = TIP_("Data-block has no users and will be deleted");
-        }
-        bt = uiDefIconButBitS(block,
-                              UI_BTYPE_ICON_TOGGLE,
-                              LIB_FAKEUSER,
-                              1,
-                              ICON_FAKE_USER_OFF,
-                              (int)(region->v2d.cur.xmax - OL_TOG_USER_BUTS_STATUS),
-                              te->ys,
-                              UI_UNIT_X,
-                              UI_UNIT_Y,
-                              &id->flag,
-                              0,
-                              0,
-                              0,
-                              0,
-                              tip);
-        UI_but_func_set(bt, restrictbutton_id_user_toggle, id, nullptr);
-        UI_but_flag_enable(bt, but_flag);
-      }
+    if (ID_IS_LINKED(id)) {
+      but_flag |= UI_BUT_DISABLED;
     }
 
-    if (TSELEM_OPEN(tselem, space_outliner)) {
-      outliner_draw_userbuts(block, region, space_outliner, &te->subtree);
+    BLI_str_format_int_grouped(buf, id->us);
+    bt = uiDefBut(block,
+                  UI_BTYPE_BUT,
+                  1,
+                  buf,
+                  (int)(region->v2d.cur.xmax - OL_TOG_USER_BUTS_USERS),
+                  te->ys,
+                  UI_UNIT_X,
+                  UI_UNIT_Y,
+                  nullptr,
+                  0.0,
+                  0.0,
+                  0,
+                  0,
+                  TIP_("Number of users of this data-block"));
+    UI_but_flag_enable(bt, but_flag);
+
+    if (id->flag & LIB_FAKEUSER) {
+      tip = TIP_("Data-block will be retained using a fake user");
     }
-  }
+    else {
+      tip = TIP_("Data-block has no users and will be deleted");
+    }
+    bt = uiDefIconButBitS(block,
+                          UI_BTYPE_ICON_TOGGLE,
+                          LIB_FAKEUSER,
+                          1,
+                          ICON_FAKE_USER_OFF,
+                          (int)(region->v2d.cur.xmax - OL_TOG_USER_BUTS_STATUS),
+                          te->ys,
+                          UI_UNIT_X,
+                          UI_UNIT_Y,
+                          &id->flag,
+                          0,
+                          0,
+                          0,
+                          0,
+                          tip);
+    UI_but_func_set(bt, restrictbutton_id_user_toggle, id, nullptr);
+    UI_but_flag_enable(bt, but_flag);
+  });
 }
 
 static void outliner_draw_overrides_rna_buts(uiBlock *block,
@@ -1941,81 +1940,82 @@ static void outliner_draw_separator(ARegion *region, const int x)
   immUnbindProgram();
 }
 
-static void outliner_draw_rnabuts(
-    uiBlock *block, ARegion *region, SpaceOutliner *space_outliner, int sizex, ListBase *lb)
+static void outliner_draw_rnabuts(uiBlock *block,
+                                  ARegion *region,
+                                  SpaceOutliner *space_outliner,
+                                  int sizex)
 {
   PointerRNA ptr;
   PropertyRNA *prop;
 
-  LISTBASE_FOREACH (TreeElement *, te, lb) {
+  tree_iterator::all_open(*space_outliner, [&](TreeElement *te) {
     TreeStoreElem *tselem = TREESTORE(te);
-    if (outliner_is_element_in_view(te, &region->v2d)) {
-      if (TreeElementRNAProperty *te_rna_prop = tree_element_cast<TreeElementRNAProperty>(te)) {
-        ptr = te_rna_prop->getPointerRNA();
-        prop = te_rna_prop->getPropertyRNA();
-
-        if (!TSELEM_OPEN(tselem, space_outliner)) {
-          if (RNA_property_type(prop) == PROP_POINTER) {
-            uiBut *but = uiDefAutoButR(block,
-                                       &ptr,
-                                       prop,
-                                       -1,
-                                       "",
-                                       ICON_NONE,
-                                       sizex,
-                                       te->ys,
-                                       OL_RNA_COL_SIZEX,
-                                       UI_UNIT_Y - 1);
-            UI_but_flag_enable(but, UI_BUT_DISABLED);
-          }
-          else if (RNA_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list