From 9636cab0098f96b9c6b6493fb7120f32d7506cd6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 15 May 2018 10:02:01 +0200 Subject: Undo System: remove nested edit-mode undo calls Regression in recent undo system changes, This caused T55048. When each mode had its own undo stack it was important to initialize it when entering edit-mode. --- .../blender/editors/animation/anim_channels_edit.c | 5 ++-- source/blender/editors/curve/editcurve_add.c | 4 --- source/blender/editors/include/ED_object.h | 3 +-- source/blender/editors/mesh/editmesh_add.c | 4 +-- source/blender/editors/mesh/mesh_navmesh.c | 2 +- source/blender/editors/object/object_add.c | 5 ++-- source/blender/editors/object/object_edit.c | 29 +++++++--------------- source/blender/editors/screen/screen_edit.c | 7 +++--- .../editors/space_outliner/outliner_select.c | 4 +-- .../editors/space_outliner/outliner_tools.c | 7 +++--- 10 files changed, 29 insertions(+), 41 deletions(-) (limited to 'source/blender/editors') diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index 20904ed0263..301124c4dfa 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -2720,8 +2720,9 @@ static int mouse_anim_channels(bContext *C, bAnimContext *ac, int channel_index, adt->flag |= ADT_UI_ACTIVE; /* ensure we exit editmode on whatever object was active before to avoid getting stuck there - T48747 */ - if (ob != sce->obedit) - ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR | EM_DO_UNDO); + if (ob != sce->obedit) { + ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR); + } notifierFlags |= (ND_ANIMCHAN | NA_SELECTED); } diff --git a/source/blender/editors/curve/editcurve_add.c b/source/blender/editors/curve/editcurve_add.c index b23f0f967ec..a91b58f1e65 100644 --- a/source/blender/editors/curve/editcurve_add.c +++ b/source/blender/editors/curve/editcurve_add.c @@ -516,10 +516,6 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf) } } - /* ED_object_add_type doesnt do an undo, is needed for redo operator on primitive */ - if (newob && enter_editmode) - ED_undo_push(C, "Enter Editmode"); - ED_object_new_primitive_matrix(C, obedit, loc, rot, mat); dia = RNA_float_get(op->ptr, "radius"); mul_mat3_m4_fl(mat, dia); diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index 2087394b6f6..614be5dd0c1 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -115,10 +115,9 @@ void ED_object_parent(struct Object *ob, struct Object *parent, const int type, enum { EM_FREEDATA = (1 << 0), EM_WAITCURSOR = (1 << 1), - EM_DO_UNDO = (1 << 2), EM_IGNORE_LAYER = (1 << 3), }; -void ED_object_editmode_exit_ex(struct bContext *C, struct Scene *scene, struct Object *obedit, int flag); +void ED_object_editmode_exit_ex(struct Scene *scene, struct Object *obedit, int flag); void ED_object_editmode_exit(struct bContext *C, int flag); void ED_object_editmode_enter(struct bContext *C, int flag); bool ED_object_editmode_load(struct Object *obedit); diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index 22cb28f0b1b..9bea203e67b 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -72,7 +72,7 @@ static Object *make_prim_init( obedit = ED_object_add_type(C, OB_MESH, idname, loc, rot, false, layer); /* create editmode */ - ED_object_editmode_enter(C, EM_DO_UNDO | EM_IGNORE_LAYER); /* rare cases the active layer is messed up */ + ED_object_editmode_enter(C, EM_IGNORE_LAYER); /* rare cases the active layer is messed up */ *was_editmode = true; } @@ -95,7 +95,7 @@ static void make_prim_finish(bContext *C, Object *obedit, bool was_editmode, int /* userdef */ if (exit_editmode) { - ED_object_editmode_exit(C, EM_FREEDATA); /* adding EM_DO_UNDO messes up operator redo */ + ED_object_editmode_exit(C, EM_FREEDATA); } WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit); } diff --git a/source/blender/editors/mesh/mesh_navmesh.c b/source/blender/editors/mesh/mesh_navmesh.c index 0f1884f4017..0d6c7320a95 100644 --- a/source/blender/editors/mesh/mesh_navmesh.c +++ b/source/blender/editors/mesh/mesh_navmesh.c @@ -358,7 +358,7 @@ static Object *createRepresentation(bContext *C, struct recast_polyMesh *pmesh, copy_v3_v3(obedit->rot, rot); } - ED_object_editmode_enter(C, EM_DO_UNDO | EM_IGNORE_LAYER); + ED_object_editmode_enter(C, EM_IGNORE_LAYER); em = BKE_editmesh_from_object(obedit); if (!createob) { diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index eeeb3c058d0..101b5d4920d 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -411,8 +411,9 @@ Object *ED_object_add_type( Object *ob; /* for as long scene has editmode... */ - if (CTX_data_edit_object(C)) - ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR | EM_DO_UNDO); /* freedata, and undo */ + if (CTX_data_edit_object(C)) { + ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR); + } /* deselects all, sets scene->basact */ ob = BKE_object_add(bmain, scene, type, name); diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 844ed168157..a01a671ec98 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -444,14 +444,11 @@ bool ED_object_editmode_load(Object *obedit) } /** - * \param C: Can be NULL, only if #EM_DO_UNDO isn't set. * \param flag: - * - Only in exceptional cases should #EM_DO_UNDO NOT be in the flag. * - If #EM_FREEDATA isn't in the flag, use ED_object_editmode_load directly. */ -void ED_object_editmode_exit_ex(bContext *C, Scene *scene, Object *obedit, int flag) +void ED_object_editmode_exit_ex(Scene *scene, Object *obedit, int flag) { - BLI_assert(C || !(flag & EM_DO_UNDO)); const bool freedata = (flag & EM_FREEDATA) != 0; if (flag & EM_WAITCURSOR) waitcursor(1); @@ -486,16 +483,8 @@ void ED_object_editmode_exit_ex(bContext *C, Scene *scene, Object *obedit, int f /* also flush ob recalc, doesn't take much overhead, but used for particles */ DAG_id_tag_update(&obedit->id, OB_RECALC_OB | OB_RECALC_DATA); - - if (flag & EM_DO_UNDO) - ED_undo_push(C, "Editmode"); - if (C != NULL) { - WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); - } - else { - WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); - } + WM_main_add_notifier(NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); obedit->mode &= ~OB_MODE_EDIT; } @@ -507,7 +496,7 @@ void ED_object_editmode_exit(bContext *C, int flag) { Scene *scene = CTX_data_scene(C); Object *obedit = CTX_data_edit_object(C); - ED_object_editmode_exit_ex(C, scene, obedit, flag); + ED_object_editmode_exit_ex(scene, obedit, flag); } void ED_object_editmode_enter(bContext *C, int flag) @@ -638,7 +627,6 @@ void ED_object_editmode_enter(bContext *C, int flag) WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene); } - if (flag & EM_DO_UNDO) ED_undo_push(C, "Enter Editmode"); if (flag & EM_WAITCURSOR) waitcursor(0); } @@ -655,11 +643,12 @@ static int editmode_toggle_exec(bContext *C, wmOperator *op) } } - if (!is_mode_set) + if (!is_mode_set) { ED_object_editmode_enter(C, EM_WAITCURSOR); - else - ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR); /* had EM_DO_UNDO but op flag calls undo too [#24685] */ - + } + else { + ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR); + } ED_space_image_uv_sculpt_update(CTX_wm_manager(C), scene); return OPERATOR_FINISHED; @@ -713,7 +702,7 @@ static int posemode_exec(bContext *C, wmOperator *op) if (ob->type == OB_ARMATURE) { if (ob == CTX_data_edit_object(C)) { - ED_object_editmode_exit(C, EM_FREEDATA | EM_DO_UNDO); + ED_object_editmode_exit(C, EM_FREEDATA); is_mode_set = false; } diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 2cd8ee9223f..7630f913ec1 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1381,9 +1381,10 @@ void ED_screen_set_scene(bContext *C, bScreen *screen, Scene *scene) if (screen == NULL) return; - - if (ed_screen_used(CTX_wm_manager(C), screen)) - ED_object_editmode_exit(C, EM_FREEDATA | EM_DO_UNDO); + + if (ed_screen_used(CTX_wm_manager(C), screen)) { + ED_object_editmode_exit(C, EM_FREEDATA); + } for (sc = bmain->screen.first; sc; sc = sc->id.next) { if ((U.flag & USER_SCENEGLOBAL) || sc == screen) { diff --git a/source/blender/editors/space_outliner/outliner_select.c b/source/blender/editors/space_outliner/outliner_select.c index 0b8724b4e28..760673e5a5f 100644 --- a/source/blender/editors/space_outliner/outliner_select.c +++ b/source/blender/editors/space_outliner/outliner_select.c @@ -241,7 +241,7 @@ static eOLDrawState tree_element_set_active_object( } if (ob != scene->obedit) - ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR | EM_DO_UNDO); + ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR); return OL_DRAWSEL_NORMAL; } @@ -715,7 +715,7 @@ static eOLDrawState tree_element_active_pose( if (set != OL_SETSEL_NONE) { if (scene->obedit) { - ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR | EM_DO_UNDO); + ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR); } if (ob->mode & OB_MODE_POSE) { diff --git a/source/blender/editors/space_outliner/outliner_tools.c b/source/blender/editors/space_outliner/outliner_tools.c index e8275d597a6..20e011d4c8f 100644 --- a/source/blender/editors/space_outliner/outliner_tools.c +++ b/source/blender/editors/space_outliner/outliner_tools.c @@ -417,8 +417,9 @@ static void object_delete_cb( } // check also library later - if (scene->obedit == base->object) - ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR | EM_DO_UNDO); + if (scene->obedit == base->object) { + ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR); + } ED_base_object_free_and_unlink(CTX_data_main(C), scene, base); /* leave for ED_outliner_id_unref to handle */ @@ -873,7 +874,7 @@ static void object_delete_hierarchy_cb( /* Check also library later. */ for (; obedit && (obedit != base->object); obedit = obedit->parent); if (obedit == base->object) { - ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR | EM_DO_UNDO); + ED_object_editmode_exit(C, EM_FREEDATA | EM_WAITCURSOR); } outline_delete_hierarchy(C, reports, scene, base); -- cgit v1.2.3