浏览代码

Fix EditorUndoRedoManager's handling of MERGE_ENDS

kobewi 2 年之前
父节点
当前提交
38c50b4ed3
共有 1 个文件被更改,包括 26 次插入6 次删除
  1. 26 6
      editor/editor_undo_redo_manager.cpp

+ 26 - 6
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;
 		}
 	}