diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2022-11-14 18:29:46 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2022-11-14 18:29:46 +0100 |
commit | beed90ea6d4a3e779a115622776206cc6b052a6c (patch) | |
tree | 1d374a943ab621e2cdcb4059ff72cad4c2339f48 | |
parent | 4d9adfea23f193d51f8a53371d311a9595320655 (diff) | |
parent | d7ebf725c9d83b6694802d18c36bab42b11759c7 (diff) |
Merge pull request #67963 from KoBeWi/den_of_actions
Fix nested actions in EditorUndoRedoManager
-rw-r--r-- | core/object/undo_redo.cpp | 4 | ||||
-rw-r--r-- | core/object/undo_redo.h | 1 | ||||
-rw-r--r-- | editor/animation_track_editor.cpp | 2 | ||||
-rw-r--r-- | editor/editor_undo_redo_manager.cpp | 17 |
4 files changed, 20 insertions, 4 deletions
diff --git a/core/object/undo_redo.cpp b/core/object/undo_redo.cpp index aa66e86bc0..9f8a1de697 100644 --- a/core/object/undo_redo.cpp +++ b/core/object/undo_redo.cpp @@ -423,6 +423,10 @@ String UndoRedo::get_current_action_name() const { return actions[current_action].name; } +int UndoRedo::get_action_level() const { + return action_level; +} + bool UndoRedo::has_undo() const { return current_action >= 0; } diff --git a/core/object/undo_redo.h b/core/object/undo_redo.h index c7c58697c3..9c6d2d10ed 100644 --- a/core/object/undo_redo.h +++ b/core/object/undo_redo.h @@ -120,6 +120,7 @@ public: bool redo(); bool undo(); String get_current_action_name() const; + int get_action_level() const; int get_history_count(); int get_current_action(); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index 44ecda103e..0c8176a44b 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -3613,7 +3613,7 @@ void AnimationTrackEditor::_animation_track_remove_request(int p_track, Ref<Anim } int idx = p_track; if (idx >= 0 && idx < p_from_animation->get_track_count()) { - undo_redo->create_action(TTR("Remove Anim Track")); + undo_redo->create_action(TTR("Remove Anim Track"), UndoRedo::MERGE_DISABLE, p_from_animation.ptr()); // Remove corresponding reset tracks if they are no longer needed. AnimationPlayer *player = AnimationPlayerEditor::get_singleton()->get_player(); diff --git a/editor/editor_undo_redo_manager.cpp b/editor/editor_undo_redo_manager.cpp index 8dfd8e0528..4bfa9b686c 100644 --- a/editor/editor_undo_redo_manager.cpp +++ b/editor/editor_undo_redo_manager.cpp @@ -110,9 +110,14 @@ EditorUndoRedoManager::History &EditorUndoRedoManager::get_history_for_object(Ob } void EditorUndoRedoManager::create_action_for_history(const String &p_name, int p_history_id, UndoRedo::MergeMode p_mode) { - pending_action.action_name = p_name; - pending_action.timestamp = OS::get_singleton()->get_unix_time(); - pending_action.merge_mode = p_mode; + if (pending_action.history_id != INVALID_HISTORY) { + // Nested action. + p_history_id = pending_action.history_id; + } else { + pending_action.action_name = p_name; + pending_action.timestamp = OS::get_singleton()->get_unix_time(); + pending_action.merge_mode = p_mode; + } if (p_history_id != INVALID_HISTORY) { pending_action.history_id = p_history_id; @@ -229,6 +234,12 @@ void EditorUndoRedoManager::commit_action(bool p_execute) { history.undo_redo->commit_action(p_execute); history.redo_stack.clear(); + if (history.undo_redo->get_action_level() > 0) { + // Nested action. + is_committing = false; + return; + } + 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) { |