From 3cbe2a19dffdcf9aea5fee28fba4f2e66dcff08a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 9 Jan 2019 20:21:24 +1100 Subject: Undo System: apply accumulation steps Apply steps between the active and the undo state being decoded. --- source/blender/blenkernel/intern/undo_system.c | 31 ++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'source/blender/blenkernel/intern/undo_system.c') diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c index abc53bf031a..139f6a20a59 100644 --- a/source/blender/blenkernel/intern/undo_system.c +++ b/source/blender/blenkernel/intern/undo_system.c @@ -563,14 +563,28 @@ bool BKE_undosys_step_undo_with_data_ex( undosys_stack_validate(ustack, true); } UndoStep *us_prev = us ? us->prev : NULL; - if (us && us->type->mode == BKE_UNDOTYPE_MODE_STORE) { + if (us) { /* The current state is a copy, we need to load the previous state. */ us = us_prev; } if (us != NULL) { CLOG_INFO(&LOG, 1, "addr=%p, name='%s', type='%s'", us, us->name, us->type->name); - undosys_step_decode(C, us, -1); + + /* Handle accumulate steps. */ + if (ustack->step_active) { + UndoStep *us_iter = ustack->step_active; + while (us_iter != us) { + if (us_iter->type->mode == BKE_UNDOTYPE_MODE_ACCUMULATE) { + undosys_step_decode(C, us_iter, -1); + } + us_iter = us_iter->prev; + } + } + + if (us->type->mode != BKE_UNDOTYPE_MODE_ACCUMULATE) { + undosys_step_decode(C, us, -1); + } ustack->step_active = us_prev; undosys_stack_validate(ustack, true); if (use_skip) { @@ -611,6 +625,19 @@ bool BKE_undosys_step_redo_with_data_ex( if (us != NULL) { CLOG_INFO(&LOG, 1, "addr=%p, name='%s', type='%s'", us, us->name, us->type->name); + + /* Handle accumulate steps. */ + if (ustack->step_active && ustack->step_active->next) { + UndoStep *us_iter = ustack->step_active->next; + while (us_iter != us) { + if (us_iter->type->mode == BKE_UNDOTYPE_MODE_ACCUMULATE) { + undosys_step_decode(C, us_iter, 1); + } + us_iter = us_iter->next; + } + } + + /* Unlike undo, always redo accumulation state. */ undosys_step_decode(C, us, 1); ustack->step_active = us_next; if (use_skip) { -- cgit v1.2.3