[Bf-blender-cvs] [28d581af928] blender-v2.93-release: Fix T91411: Outliner crash using contextmenu operators from a shortcut

Philipp Oeser noreply at git.blender.org
Tue Nov 2 13:52:40 CET 2021


Commit: 28d581af928fcfd26f8f8e49d953348a6570d456
Author: Philipp Oeser
Date:   Wed Sep 15 08:43:21 2021 +0200
Branches: blender-v2.93-release
https://developer.blender.org/rB28d581af928fcfd26f8f8e49d953348a6570d456

Fix T91411: Outliner crash using contextmenu operators from a shortcut

Oversight in {rBb0741e1dcbc5}.

This was guarded by an assert in `get_target_element`, but it can be
valid to have these assigned to a shortcut (and then perform the action
without an active outliner element).

Now remove the assert and let the operator polls check if we really have
a target element.

note: this basically makes `get_target_element` obsolete, could call
`outliner_find_element_with_flag` instead in all cases.

Maniphest Tasks: T91411

Differential Revision: https://developer.blender.org/D12495

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

M	source/blender/editors/space_outliner/outliner_tools.c

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

diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c
index 456c2079f27..b20d6a4a43c 100644
--- a/source/blender/editors/space_outliner/outliner_tools.c
+++ b/source/blender/editors/space_outliner/outliner_tools.c
@@ -194,11 +194,24 @@ static void get_element_operation_type(
 static TreeElement *get_target_element(SpaceOutliner *space_outliner)
 {
   TreeElement *te = outliner_find_element_with_flag(&space_outliner->tree, TSE_ACTIVE);
-  BLI_assert(te);
 
   return te;
 }
 
+static bool outliner_operation_tree_element_poll(bContext *C)
+{
+  if (!ED_operator_outliner_active(C)) {
+    return false;
+  }
+  SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
+  TreeElement *te = get_target_element(space_outliner);
+  if (te == NULL) {
+    return false;
+  }
+
+  return true;
+}
+
 static void unlink_action_fn(bContext *C,
                              ReportList *UNUSED(reports),
                              Scene *UNUSED(scene),
@@ -1843,6 +1856,10 @@ static bool outliner_id_operation_item_poll(bContext *C,
                                             PropertyRNA *UNUSED(prop),
                                             const int enum_value)
 {
+  if (!outliner_operation_tree_element_poll(C)) {
+    return false;
+  }
+
   SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
   TreeElement *te = get_target_element(space_outliner);
   TreeStoreElem *tselem = TREESTORE(te);
@@ -2240,7 +2257,7 @@ void OUTLINER_OT_id_operation(wmOperatorType *ot)
   /* callbacks */
   ot->invoke = WM_menu_invoke;
   ot->exec = outliner_id_operation_exec;
-  ot->poll = ED_operator_outliner_active;
+  ot->poll = outliner_operation_tree_element_poll;
 
   ot->flag = 0;
 
@@ -2347,7 +2364,7 @@ void OUTLINER_OT_lib_operation(wmOperatorType *ot)
   /* callbacks */
   ot->invoke = WM_menu_invoke;
   ot->exec = outliner_lib_operation_exec;
-  ot->poll = ED_operator_outliner_active;
+  ot->poll = outliner_operation_tree_element_poll;
 
   ot->prop = RNA_def_enum(
       ot->srna, "type", outliner_lib_op_type_items, 0, "Library Operation", "");
@@ -2406,14 +2423,8 @@ static int outliner_action_set_exec(bContext *C, wmOperator *op)
   Main *bmain = CTX_data_main(C);
   SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
   int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
-
   bAction *act;
 
-  /* check for invalid states */
-  if (space_outliner == NULL) {
-    return OPERATOR_CANCELLED;
-  }
-
   TreeElement *te = get_target_element(space_outliner);
   get_element_operation_type(te, &scenelevel, &objectlevel, &idlevel, &datalevel);
 
@@ -2468,7 +2479,7 @@ void OUTLINER_OT_action_set(wmOperatorType *ot)
   /* api callbacks */
   ot->invoke = WM_enum_search_invoke;
   ot->exec = outliner_action_set_exec;
-  ot->poll = ED_operator_outliner_active;
+  ot->poll = outliner_operation_tree_element_poll;
 
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -2517,12 +2528,6 @@ static int outliner_animdata_operation_exec(bContext *C, wmOperator *op)
   wmWindowManager *wm = CTX_wm_manager(C);
   SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
   int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
-
-  /* check for invalid states */
-  if (space_outliner == NULL) {
-    return OPERATOR_CANCELLED;
-  }
-
   TreeElement *te = get_target_element(space_outliner);
   get_element_operation_type(te, &scenelevel, &objectlevel, &idlevel, &datalevel);
 
@@ -2718,12 +2723,6 @@ static int outliner_data_operation_exec(bContext *C, wmOperator *op)
 {
   SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
   int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
-
-  /* check for invalid states */
-  if (space_outliner == NULL) {
-    return OPERATOR_CANCELLED;
-  }
-
   TreeElement *te = get_target_element(space_outliner);
   get_element_operation_type(te, &scenelevel, &objectlevel, &idlevel, &datalevel);
 
@@ -2793,7 +2792,7 @@ void OUTLINER_OT_data_operation(wmOperatorType *ot)
   /* callbacks */
   ot->invoke = WM_menu_invoke;
   ot->exec = outliner_data_operation_exec;
-  ot->poll = ED_operator_outliner_active;
+  ot->poll = outliner_operation_tree_element_poll;
 
   ot->flag = 0;



More information about the Bf-blender-cvs mailing list