Fix undo of transform after frame change undoing too much.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 13 Jun 2018 16:22:17 +0000 (18:22 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 13 Jun 2018 16:39:30 +0000 (18:39 +0200)
For grouped undo we should not skip the undo push, rather replace the
previous undo push. This way undo goes back to the state after the last
operation in the group.

source/blender/blenkernel/BKE_undo_system.h
source/blender/blenkernel/intern/undo_system.c
source/blender/editors/undo/ed_undo.c

index 05093deec702aabba97f4bf071cd66353c0610da..a75606a17cb26d5ff8abaafd0c8036dfbe25d3f8 100644 (file)
@@ -135,6 +135,7 @@ extern const UndoType *BKE_UNDOSYS_TYPE_TEXT;
 UndoStack      *BKE_undosys_stack_create(void);
 void            BKE_undosys_stack_destroy(UndoStack *ustack);
 void            BKE_undosys_stack_clear(UndoStack *ustack);
 UndoStack      *BKE_undosys_stack_create(void);
 void            BKE_undosys_stack_destroy(UndoStack *ustack);
 void            BKE_undosys_stack_clear(UndoStack *ustack);
+void            BKE_undosys_stack_clear_active(UndoStack *ustack);
 bool            BKE_undosys_stack_has_undo(UndoStack *ustack, const char *name);
 void            BKE_undosys_stack_init_from_main(UndoStack *ustack, struct Main *bmain);
 void            BKE_undosys_stack_init_from_context(UndoStack *ustack, struct bContext *C);
 bool            BKE_undosys_stack_has_undo(UndoStack *ustack, const char *name);
 void            BKE_undosys_stack_init_from_main(UndoStack *ustack, struct Main *bmain);
 void            BKE_undosys_stack_init_from_context(UndoStack *ustack, struct bContext *C);
index a8f895853ed667ff0dde36be3426f2580147d249..ba7d432fab3084f58737abf2ae40c092c2285064 100644 (file)
@@ -234,6 +234,23 @@ void BKE_undosys_stack_clear(UndoStack *ustack)
        ustack->step_active = NULL;
 }
 
        ustack->step_active = NULL;
 }
 
+void BKE_undosys_stack_clear_active(UndoStack *ustack)
+{
+       /* Remove active and all following undos. */
+       UndoStep *us = ustack->step_active;
+
+       if (us) {
+               ustack->step_active = us->prev;
+               bool is_not_empty = ustack->step_active != NULL;
+
+               while (ustack->steps.last != ustack->step_active) {
+                       UndoStep *us_iter = ustack->steps.last;
+                       undosys_step_free_and_unlink(ustack, us_iter);
+                       undosys_stack_validate(ustack, is_not_empty);
+               }
+       }
+}
+
 static bool undosys_stack_push_main(UndoStack *ustack, const char *name, struct Main *bmain)
 {
        UNDO_NESTED_ASSERT(false);
 static bool undosys_stack_push_main(UndoStack *ustack, const char *name, struct Main *bmain)
 {
        UNDO_NESTED_ASSERT(false);
index d8b194e33363010956c3037a4e498b3a080e87c3..539d024530615c7f6f549d7fc3831c04e44f7aab 100644 (file)
@@ -143,15 +143,10 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
 void ED_undo_grouped_push(bContext *C, const char *str)
 {
        /* do nothing if previous undo task is the same as this one (or from the same undo group) */
 void ED_undo_grouped_push(bContext *C, const char *str)
 {
        /* do nothing if previous undo task is the same as this one (or from the same undo group) */
-       {
-               wmWindowManager *wm = CTX_wm_manager(C);
-               if (wm->undo_stack->steps.last) {
-                       const UndoStep *us = wm->undo_stack->steps.last;
-                       if (STREQ(str, us->name)) {
-                               return;
-                       }
-               }
-
+       wmWindowManager *wm = CTX_wm_manager(C);
+       const UndoStep *us = wm->undo_stack->step_active;
+       if (us && STREQ(str, us->name)) {
+               BKE_undosys_stack_clear_active(wm->undo_stack);
        }
 
        /* push as usual */
        }
 
        /* push as usual */