[Bf-blender-cvs] [e726ed3c6b6] master: Fix: Outliner walk navigation in Data API mode

Nathan Craddock noreply at git.blender.org
Fri Aug 28 02:55:58 CEST 2020


Commit: e726ed3c6b6600b953c72604b8a0b891f27fd7f9
Author: Nathan Craddock
Date:   Thu Aug 27 09:41:05 2020 -0600
Branches: master
https://developer.blender.org/rBe726ed3c6b6600b953c72604b8a0b891f27fd7f9

Fix: Outliner walk navigation in Data API mode

Because the subtrees in Data API mode are empty for performance reasons,
it was impossible to move through the tree with walk navigation. This
adds an exception to allow walk navigation to expand subtrees in that
mode.

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

M	source/blender/editors/space_outliner/outliner_edit.c
M	source/blender/editors/space_outliner/outliner_intern.h
M	source/blender/editors/space_outliner/outliner_select.c

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

diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c
index 8567dd4da13..498d26add48 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -150,10 +150,18 @@ void OUTLINER_OT_highlight_update(wmOperatorType *ot)
  * \{ */
 
 /* Open or close a tree element, optionally toggling all children recursively */
-void outliner_item_openclose(TreeElement *te, bool open, bool toggle_all)
-{
-  TreeStoreElem *tselem = TREESTORE(te);
+void outliner_item_openclose(SpaceOutliner *space_outliner,
+                             TreeElement *te,
+                             bool open,
+                             bool toggle_all)
+{
+  /* Prevent opening leaf elements in the tree unless in the Data API display mode because in that
+   * mode subtrees are empty unless expanded. */
+  if (space_outliner->outlinevis != SO_DATA_API && BLI_listbase_is_empty(&te->subtree)) {
+    return;
+  }
 
+  TreeStoreElem *tselem = TREESTORE(te);
   if (open) {
     tselem->flag &= ~TSE_CLOSED;
   }
@@ -191,7 +199,7 @@ static int outliner_item_openclose_modal(bContext *C, wmOperator *op, const wmEv
 
       /* Only toggle openclose on the same level as the first clicked element */
       if (te->xs == data->x_location) {
-        outliner_item_openclose(te, data->open, false);
+        outliner_item_openclose(space_outliner, te, data->open, false);
 
         outliner_tag_redraw_avoid_rebuild_on_open_change(space_outliner, region);
       }
@@ -232,7 +240,7 @@ static int outliner_item_openclose_invoke(bContext *C, wmOperator *op, const wmE
     const bool open = (tselem->flag & TSE_CLOSED) ||
                       (toggle_all && (outliner_flag_is_any_test(&te->subtree, TSE_CLOSED, 1)));
 
-    outliner_item_openclose(te, open, toggle_all);
+    outliner_item_openclose(space_outliner, te, open, toggle_all);
     outliner_tag_redraw_avoid_rebuild_on_open_change(space_outliner, region);
 
     /* Only toggle once for single click toggling */
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 9795bb73efe..bd283777397 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -374,7 +374,10 @@ void item_object_mode_exit_fn(struct bContext *C,
 
 void outliner_set_coordinates(struct ARegion *region, struct SpaceOutliner *space_outliner);
 
-void outliner_item_openclose(TreeElement *te, bool open, bool toggle_all);
+void outliner_item_openclose(struct SpaceOutliner *space_outliner,
+                             TreeElement *te,
+                             bool open,
+                             bool toggle_all);
 
 /* outliner_dragdrop.c */
 void outliner_dropboxes(void);
diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c
index 23aa2979e86..266ea293d43 100644
--- a/source/blender/editors/space_outliner/outliner_select.c
+++ b/source/blender/editors/space_outliner/outliner_select.c
@@ -1647,7 +1647,7 @@ static TreeElement *outliner_walk_left(SpaceOutliner *space_outliner,
   TreeStoreElem *tselem = TREESTORE(te);
 
   if (TSELEM_OPEN(tselem, space_outliner)) {
-    outliner_item_openclose(te, false, toggle_all);
+    outliner_item_openclose(space_outliner, te, false, toggle_all);
   }
   /* Only walk up a level if the element is closed and not toggling expand */
   else if (!toggle_all && te->parent) {
@@ -1667,11 +1667,8 @@ static TreeElement *outliner_walk_right(SpaceOutliner *space_outliner,
   if (!toggle_all && TSELEM_OPEN(tselem, space_outliner) && !BLI_listbase_is_empty(&te->subtree)) {
     te = te->subtree.first;
   }
-  /* Prevent opening leaf elements in the tree.
-   * This cannot be done in `outliner_item_openclose` because the Data API display mode subtrees
-   * are empty unless expanded. */
-  else if (!BLI_listbase_is_empty(&te->subtree)) {
-    outliner_item_openclose(te, true, toggle_all);
+  else {
+    outliner_item_openclose(space_outliner, te, true, toggle_all);
   }
 
   return te;



More information about the Bf-blender-cvs mailing list