Prechádzať zdrojové kódy

Fix for stopping the Undo History being desynchronised from actual Undo queue.

Sofox 1 rok pred
rodič
commit
662522ae5a

+ 4 - 0
core/object/undo_redo.cpp

@@ -463,6 +463,10 @@ bool UndoRedo::has_redo() const {
 	return (current_action + 1) < actions.size();
 	return (current_action + 1) < actions.size();
 }
 }
 
 
+bool UndoRedo::is_merging() const {
+	return merging;
+}
+
 uint64_t UndoRedo::get_version() const {
 uint64_t UndoRedo::get_version() const {
 	return version;
 	return version;
 }
 }

+ 2 - 0
core/object/undo_redo.h

@@ -131,6 +131,8 @@ public:
 	bool has_undo() const;
 	bool has_undo() const;
 	bool has_redo() const;
 	bool has_redo() const;
 
 
+	bool is_merging() const;
+
 	uint64_t get_version() const;
 	uint64_t get_version() const;
 
 
 	void set_commit_notify_callback(CommitNotifyCallback p_callback, void *p_ud);
 	void set_commit_notify_callback(CommitNotifyCallback p_callback, void *p_ud);

+ 3 - 31
editor/editor_undo_redo_manager.cpp

@@ -239,6 +239,7 @@ void EditorUndoRedoManager::commit_action(bool p_execute) {
 	is_committing = true;
 	is_committing = true;
 
 
 	History &history = get_or_create_history(pending_action.history_id);
 	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.undo_redo->commit_action(p_execute);
 	history.redo_stack.clear();
 	history.redo_stack.clear();
 
 
@@ -248,39 +249,10 @@ void EditorUndoRedoManager::commit_action(bool p_execute) {
 		return;
 		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();
 	pending_action = Action();
 	is_committing = false;
 	is_committing = false;
 	emit_signal(SNAME("history_changed"));
 	emit_signal(SNAME("history_changed"));