[Bf-blender-cvs] [121b2c04244] blender-v2.83-release: Fix T76799: Crash from undoing the copy-pasting of multiple data blocks.

Bastien Montagne noreply at git.blender.org
Mon May 18 15:53:59 CEST 2020


Commit: 121b2c0424465800ba79c0c7a4403cc2999b261b
Author: Bastien Montagne
Date:   Mon May 18 15:47:03 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB121b2c0424465800ba79c0c7a4403cc2999b261b

Fix T76799: Crash from undoing the copy-pasting of multiple data blocks.

Bug was actually in outliner code, paste operator would not generate any
undo step...

This was not correct ever, but with new undo code this has become a
critical issue, it cannot survive a situation where current main data
has been changed without a proper undo push.

This illustrates again how much of a catastrophic mess the 'tools'
callbacks of the outliner are currently, it has already caused us quiet
some pain in the past, and will keep doing so until this is fully
sanitized am afraid.

Would strongly suggest getting rid of thosw nasty mix of custom
callbacks requiring manual undo pushes, I do not see the added value of
this compared to regular menus calling regular operators. It only adds
confusion and extra code for nothing...

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

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

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

diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c
index 181be13f959..26d356a290d 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -835,7 +835,8 @@ void OUTLINER_OT_id_paste(wmOperatorType *ot)
   ot->exec = outliner_id_paste_exec;
   ot->poll = ED_operator_outliner_active;
 
-  ot->flag = 0;
+  /* flags */
+  ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
 /* Library relocate/reload --------------------------------------------------- */
diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c
index 1c9998d256b..c162bba885f 100644
--- a/source/blender/editors/space_outliner/outliner_tools.c
+++ b/source/blender/editors/space_outliner/outliner_tools.c
@@ -1601,6 +1601,7 @@ static const EnumPropertyItem *outliner_id_operation_itemf(bContext *C,
 
 static int outliner_id_operation_exec(bContext *C, wmOperator *op)
 {
+  wmWindowManager *wm = CTX_wm_manager(C);
   Scene *scene = CTX_data_scene(C);
   SpaceOutliner *soops = CTX_wm_space_outliner(C);
   int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
@@ -1726,11 +1727,16 @@ static int outliner_id_operation_exec(bContext *C, wmOperator *op)
       break;
     }
     case OUTLINER_IDOP_COPY: {
+      wm->op_undo_depth++;
       WM_operator_name_call(C, "OUTLINER_OT_id_copy", WM_OP_INVOKE_DEFAULT, NULL);
+      wm->op_undo_depth--;
+      /* No need for undo, this operation does not change anything... */
       break;
     }
     case OUTLINER_IDOP_PASTE: {
+      wm->op_undo_depth++;
       WM_operator_name_call(C, "OUTLINER_OT_id_paste", WM_OP_INVOKE_DEFAULT, NULL);
+      wm->op_undo_depth--;
       ED_outliner_select_sync_from_all_tag(C);
       ED_undo_push(C, "Paste");
       break;
@@ -2016,7 +2022,7 @@ void OUTLINER_OT_action_set(wmOperatorType *ot)
   ot->poll = ED_operator_outliner_active;
 
   /* flags */
-  ot->flag = 0;
+  ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
   /* props */
   // TODO: this would be nicer as an ID-pointer...
@@ -2060,6 +2066,7 @@ static const EnumPropertyItem prop_animdata_op_types[] = {
 
 static int outliner_animdata_operation_exec(bContext *C, wmOperator *op)
 {
+  wmWindowManager *wm = CTX_wm_manager(C);
   SpaceOutliner *soops = CTX_wm_space_outliner(C);
   int scenelevel = 0, objectlevel = 0, idlevel = 0, datalevel = 0;
   eOutliner_AnimDataOps event;
@@ -2088,7 +2095,10 @@ static int outliner_animdata_operation_exec(bContext *C, wmOperator *op)
 
     case OUTLINER_ANIMOP_SET_ACT:
       /* delegate once again... */
+      wm->op_undo_depth++;
       WM_operator_name_call(C, "OUTLINER_OT_action_set", WM_OP_INVOKE_REGION_WIN, NULL);
+      wm->op_undo_depth--;
+      ED_undo_push(C, "Set active action");
       break;
 
     case OUTLINER_ANIMOP_CLEAR_ACT:



More information about the Bf-blender-cvs mailing list