diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-01-09 12:21:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-01-10 00:03:18 +0300 |
commit | 399fd54f88c844a52d3879eb70d99e04d1672582 (patch) | |
tree | 43544a61c470ae529b26362598301ee6dfe7548e /source | |
parent | 99d001a10f3c151e7952048760a07e1ca3f9aa8c (diff) |
Undo System: apply accumulation steps
Apply steps between the active and the undo state being decoded.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/undo_system.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/source/blender/blenkernel/intern/undo_system.c b/source/blender/blenkernel/intern/undo_system.c index 0ebfb4065e4..04f969c403e 100644 --- a/source/blender/blenkernel/intern/undo_system.c +++ b/source/blender/blenkernel/intern/undo_system.c @@ -552,14 +552,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) { @@ -600,6 +614,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) { |