From 937731dff1af4910dc94646904106432c14b2042 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 7 Feb 2019 20:27:11 +1100 Subject: Fix T61272: Undo fails to track multi-edit mode enter/exit Objects leaving edit-mode weren't restored by edit-mode undo steps. --- source/blender/editors/undo/ed_undo.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'source/blender/editors/undo') diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c index 69e02148ba5..ffe752e11b1 100644 --- a/source/blender/editors/undo/ed_undo.c +++ b/source/blender/editors/undo/ed_undo.c @@ -653,4 +653,37 @@ void ED_undo_object_set_active_or_warn(ViewLayer *view_layer, Object *ob, const } } +void ED_undo_object_editmode_restore_helper( + struct bContext *C, Object **object_array, uint object_array_len, uint object_array_stride) +{ + Main *bmain = CTX_data_main(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + uint bases_len = 0; + /* Don't request unique data because we wan't to de-select objects when exiting edit-mode + * for that to be done on all objects we can't skip ones that share data. */ + Base **bases = BKE_view_layer_array_from_bases_in_edit_mode( + view_layer, NULL, &bases_len); + for (uint i = 0; i < bases_len; i++) { + ((ID *)bases[i]->object->data)->tag |= LIB_TAG_DOIT; + } + Scene *scene = CTX_data_scene(C); + Object **ob_p = object_array; + for (uint i = 0; i < object_array_len; i++, ob_p = POINTER_OFFSET(ob_p, object_array_stride)) { + Object *obedit = *ob_p; + ED_object_editmode_enter_ex(bmain, scene, obedit, EM_NO_CONTEXT); + ((ID *)obedit->data)->tag &= ~LIB_TAG_DOIT; + } + for (uint i = 0; i < bases_len; i++) { + ID *id = bases[i]->object->data; + if (id->tag & LIB_TAG_DOIT) { + ED_object_editmode_exit_ex(bmain, scene, bases[i]->object, EM_FREEDATA); + /* Ideally we would know the selection state it was before entering edit-mode, + * for now follow the convention of having them unselected when exiting the mode. */ + ED_object_base_select(bases[i], BA_DESELECT); + + } + } + MEM_freeN(bases); +} + /** \} */ -- cgit v1.2.3