Undo System: apply accumulation steps

Apply steps between the active and the undo state being decoded.
This commit is contained in:
Campbell Barton 2019-01-09 20:21:24 +11:00
parent ef33215bb7
commit 3cbe2a19df
1 changed files with 29 additions and 2 deletions

View File

@ -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) {