summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-03-06 10:53:22 +0100
committerRémi Verschelde <rverschelde@gmail.com>2023-03-06 10:53:22 +0100
commit9fa320852ee05de6be6997eb7eafe1d68c6e1c02 (patch)
tree38dc3178b22cd144a70e93fe734608fe26b38c27
parentf408e7a38716cf38d822b717136a1fbd91497c66 (diff)
parent38c50b4ed3c24a0bbe7327466a3069b1ac0df6a5 (diff)
downloadredot-engine-9fa320852ee05de6be6997eb7eafe1d68c6e1c02.tar.gz
Merge pull request #74460 from KoBeWi/undo_mergundo
Fix EditorUndoRedoManager's handling of MERGE_ENDS
-rw-r--r--editor/editor_undo_redo_manager.cpp32
1 files changed, 26 insertions, 6 deletions
diff --git a/editor/editor_undo_redo_manager.cpp b/editor/editor_undo_redo_manager.cpp
index f65f905b25..facd1fd6d3 100644
--- a/editor/editor_undo_redo_manager.cpp
+++ b/editor/editor_undo_redo_manager.cpp
@@ -248,12 +248,32 @@ void EditorUndoRedoManager::commit_action(bool p_execute) {
}
if (!history.undo_stack.is_empty()) {
- const Action &prev_action = history.undo_stack.back()->get();
- if (pending_action.merge_mode != UndoRedo::MERGE_DISABLE && pending_action.merge_mode == prev_action.merge_mode && pending_action.action_name == prev_action.action_name) {
- // Discard action if it should be merged (UndoRedo handles merging internally).
- pending_action = Action();
- is_committing = false;
- return;
+ // 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;
+ 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;
+ return;
+ }
+ } break;
}
}