From 662522ae5ad1d4320447ffb4de43be6aea3d6e0e Mon Sep 17 00:00:00 2001 From: Sofox Date: Mon, 6 Nov 2023 23:55:14 +0000 Subject: [PATCH] Fix for stopping the Undo History being desynchronised from actual Undo queue. --- core/object/undo_redo.cpp | 4 ++++ core/object/undo_redo.h | 2 ++ editor/editor_undo_redo_manager.cpp | 34 +++-------------------------- 3 files changed, 9 insertions(+), 31 deletions(-) diff --git a/core/object/undo_redo.cpp b/core/object/undo_redo.cpp index a8f2ac5bfe5..1d0dff526dd 100644 --- a/core/object/undo_redo.cpp +++ b/core/object/undo_redo.cpp @@ -463,6 +463,10 @@ bool UndoRedo::has_redo() const { return (current_action + 1) < actions.size(); } +bool UndoRedo::is_merging() const { + return merging; +} + uint64_t UndoRedo::get_version() const { return version; } diff --git a/core/object/undo_redo.h b/core/object/undo_redo.h index 74a6bea7327..b3a3322e4bf 100644 --- a/core/object/undo_redo.h +++ b/core/object/undo_redo.h @@ -131,6 +131,8 @@ public: bool has_undo() const; bool has_redo() const; + bool is_merging() const; + uint64_t get_version() const; void set_commit_notify_callback(CommitNotifyCallback p_callback, void *p_ud); diff --git a/editor/editor_undo_redo_manager.cpp b/editor/editor_undo_redo_manager.cpp index 5b064c9ae36..c2491f86113 100644 --- a/editor/editor_undo_redo_manager.cpp +++ b/editor/editor_undo_redo_manager.cpp @@ -239,6 +239,7 @@ void EditorUndoRedoManager::commit_action(bool p_execute) { is_committing = true; History &history = get_or_create_history(pending_action.history_id); + bool merging = history.undo_redo->is_merging(); history.undo_redo->commit_action(p_execute); history.redo_stack.clear(); @@ -248,39 +249,10 @@ void EditorUndoRedoManager::commit_action(bool p_execute) { return; } - if (!history.undo_stack.is_empty()) { - // Discard action if it should be merged (UndoRedo handles merging internally). - switch (pending_action.merge_mode) { - case UndoRedo::MERGE_DISABLE: - break; // Nothing to do here. - case UndoRedo::MERGE_ENDS: { - if (history.undo_stack.size() < 2) { - break; - } - - const Action &prev_action = history.undo_stack.back()->get(); - const Action &pre_prev_action = history.undo_stack.back()->prev()->get(); - if (pending_action.merge_mode == prev_action.merge_mode && pending_action.merge_mode == pre_prev_action.merge_mode && - pending_action.action_name == prev_action.action_name && pending_action.action_name == pre_prev_action.action_name) { - pending_action = Action(); - is_committing = false; - emit_signal(SNAME("history_changed")); - return; - } - } break; - case UndoRedo::MERGE_ALL: { - const Action &prev_action = history.undo_stack.back()->get(); - if (pending_action.merge_mode == prev_action.merge_mode && pending_action.action_name == prev_action.action_name) { - pending_action = Action(); - is_committing = false; - emit_signal(SNAME("history_changed")); - return; - } - } break; - } + if (!merging) { + history.undo_stack.push_back(pending_action); } - history.undo_stack.push_back(pending_action); pending_action = Action(); is_committing = false; emit_signal(SNAME("history_changed"));