From 4a08b974f44ef43e7c163f47dd6521df96e0b180 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 5 Jul 2019 13:46:48 +1000 Subject: Workaround T61948: Undo steps created for non-paint operations Changing the brush size for example, was adding redundant undo steps in paint-modes. For now, don't store undo steps for property changes in paint & edit modes. While not ideal, this is similar to 2.7x behavior. --- 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 6d5f486ebe9..582a2ccaef7 100644 --- a/source/blender/editors/undo/ed_undo.c +++ b/source/blender/editors/undo/ed_undo.c @@ -321,6 +321,39 @@ bool ED_undo_is_memfile_compatible(const bContext *C) return true; } +/** + * When a property of ID changes, return false. + * + * This is to avoid changes to a property making undo pushes + * which are ignored by the undo-system. + * For example, changing a brush property isn't stored by sculpt-mode undo steps. + * This workaround is needed until the limitation is removed, see: T61948. + */ +bool ED_undo_is_legacy_compatible_for_property(struct bContext *C, ID *id) +{ + ViewLayer *view_layer = CTX_data_view_layer(C); + if (view_layer != NULL) { + Object *obact = OBACT(view_layer); + if (obact != NULL) { + if (obact->mode & OB_MODE_ALL_PAINT) { + /* Don't store property changes when painting + * (only do undo pushes on brush strokes which each paint operator handles on it's own). */ + CLOG_INFO(&LOG, 1, "skipping undo for paint-mode"); + return false; + } + else if (obact->mode & OB_MODE_EDIT) { + if ((id == NULL) || (obact->data == NULL) || + (GS(id->name) != GS(((ID *)obact->data)->name))) { + /* No undo push on id type mismatch in edit-mode. */ + CLOG_INFO(&LOG, 1, "skipping undo for edit-mode"); + return false; + } + } + } + } + return true; +} + /** * Ideally we wont access the stack directly, * this is needed for modes which handle undo themselves (bypassing #ED_undo_push). -- cgit v1.2.3