Expose EditorUndoRedoManager's clear_history()

This commit is contained in:
kobewi 2024-04-02 13:33:12 +02:00
parent fd7239cfab
commit ad7a2d19a6
11 changed files with 47 additions and 18 deletions

View File

@ -117,6 +117,12 @@
[b]Note:[/b] When creating custom editor UI, prefer accessing theme items directly from your GUI nodes using the [code]get_theme_*[/code] methods. [b]Note:[/b] When creating custom editor UI, prefer accessing theme items directly from your GUI nodes using the [code]get_theme_*[/code] methods.
</description> </description>
</method> </method>
<method name="get_editor_undo_redo" qualifiers="const">
<return type="EditorUndoRedoManager" />
<description>
Returns the editor's [EditorUndoRedoManager].
</description>
</method>
<method name="get_editor_viewport_2d" qualifiers="const"> <method name="get_editor_viewport_2d" qualifiers="const">
<return type="SubViewport" /> <return type="SubViewport" />
<description> <description>

View File

@ -68,6 +68,21 @@
Register a reference for "undo" that will be erased if the "undo" history is lost. This is useful mostly for nodes removed with the "do" call (not the "undo" call!). Register a reference for "undo" that will be erased if the "undo" history is lost. This is useful mostly for nodes removed with the "do" call (not the "undo" call!).
</description> </description>
</method> </method>
<method name="clear_history">
<return type="void" />
<param index="0" name="id" type="int" default="-99" />
<param index="1" name="increase_version" type="bool" default="true" />
<description>
Clears the given undo history. You can clear history for a specific scene, global history, or for all scenes at once if [param id] is [constant INVALID_HISTORY].
If [param increase_version] is [code]true[/code], the undo history version will be increased, marking it as unsaved. Useful for operations that modify the scene, but don't support undo.
[codeblock]
var scene_root = EditorInterface.get_edited_scene_root()
var undo_redo = EditorInterface.get_editor_undo_redo()
undo_redo.clear_history(undo_redo.get_object_history_id(scene_root))
[/codeblock]
[b]Note:[/b] If you want to mark an edited scene as unsaved without clearing its history, use [method EditorInterface.mark_scene_as_unsaved] instead.
</description>
</method>
<method name="commit_action"> <method name="commit_action">
<return type="void" /> <return type="void" />
<param index="0" name="execute" type="bool" default="true" /> <param index="0" name="execute" type="bool" default="true" />

View File

@ -6887,8 +6887,8 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
_redraw_tracks(); _redraw_tracks();
_update_key_edit(); _update_key_edit();
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
undo_redo->clear_history(true, undo_redo->get_history_id_for_object(animation.ptr())); undo_redo->clear_history(undo_redo->get_history_id_for_object(animation.ptr()));
undo_redo->clear_history(true, undo_redo->get_history_id_for_object(this)); undo_redo->clear_history(undo_redo->get_history_id_for_object(this));
} break; } break;
case EDIT_CLEAN_UP_ANIMATION: { case EDIT_CLEAN_UP_ANIMATION: {
@ -7030,8 +7030,8 @@ void AnimationTrackEditor::_cleanup_animation(Ref<Animation> p_animation) {
} }
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
undo_redo->clear_history(true, undo_redo->get_history_id_for_object(animation.ptr())); undo_redo->clear_history(undo_redo->get_history_id_for_object(animation.ptr()));
undo_redo->clear_history(true, undo_redo->get_history_id_for_object(this)); undo_redo->clear_history(undo_redo->get_history_id_for_object(this));
_update_tracks(); _update_tracks();
} }

View File

@ -303,7 +303,7 @@ void EditorDebuggerNode::stop(bool p_force) {
}); });
_break_state_changed(); _break_state_changed();
breakpoints.clear(); breakpoints.clear();
EditorUndoRedoManager::get_singleton()->clear_history(false, EditorUndoRedoManager::REMOTE_HISTORY); EditorUndoRedoManager::get_singleton()->clear_history(EditorUndoRedoManager::REMOTE_HISTORY, false);
set_process(false); set_process(false);
} }

View File

@ -1262,7 +1262,7 @@ void EditorAudioBuses::_load_default_layout() {
file->set_text(String(TTR("Layout:")) + " " + layout_path.get_file()); file->set_text(String(TTR("Layout:")) + " " + layout_path.get_file());
AudioServer::get_singleton()->set_bus_layout(state); AudioServer::get_singleton()->set_bus_layout(state);
_rebuild_buses(); _rebuild_buses();
EditorUndoRedoManager::get_singleton()->clear_history(true, EditorUndoRedoManager::GLOBAL_HISTORY); EditorUndoRedoManager::get_singleton()->clear_history(EditorUndoRedoManager::GLOBAL_HISTORY);
callable_mp(this, &EditorAudioBuses::_select_layout).call_deferred(); callable_mp(this, &EditorAudioBuses::_select_layout).call_deferred();
} }
@ -1278,7 +1278,7 @@ void EditorAudioBuses::_file_dialog_callback(const String &p_string) {
file->set_text(String(TTR("Layout:")) + " " + p_string.get_file()); file->set_text(String(TTR("Layout:")) + " " + p_string.get_file());
AudioServer::get_singleton()->set_bus_layout(state); AudioServer::get_singleton()->set_bus_layout(state);
_rebuild_buses(); _rebuild_buses();
EditorUndoRedoManager::get_singleton()->clear_history(true, EditorUndoRedoManager::GLOBAL_HISTORY); EditorUndoRedoManager::get_singleton()->clear_history(EditorUndoRedoManager::GLOBAL_HISTORY);
callable_mp(this, &EditorAudioBuses::_select_layout).call_deferred(); callable_mp(this, &EditorAudioBuses::_select_layout).call_deferred();
} else if (file_dialog->get_file_mode() == EditorFileDialog::FILE_MODE_SAVE_FILE) { } else if (file_dialog->get_file_mode() == EditorFileDialog::FILE_MODE_SAVE_FILE) {
@ -1298,7 +1298,7 @@ void EditorAudioBuses::_file_dialog_callback(const String &p_string) {
edited_path = p_string; edited_path = p_string;
file->set_text(String(TTR("Layout:")) + " " + p_string.get_file()); file->set_text(String(TTR("Layout:")) + " " + p_string.get_file());
_rebuild_buses(); _rebuild_buses();
EditorUndoRedoManager::get_singleton()->clear_history(true, EditorUndoRedoManager::GLOBAL_HISTORY); EditorUndoRedoManager::get_singleton()->clear_history(EditorUndoRedoManager::GLOBAL_HISTORY);
callable_mp(this, &EditorAudioBuses::_select_layout).call_deferred(); callable_mp(this, &EditorAudioBuses::_select_layout).call_deferred();
} }
} }
@ -1397,7 +1397,7 @@ void EditorAudioBuses::open_layout(const String &p_path) {
file->set_text(p_path.get_file()); file->set_text(p_path.get_file());
AudioServer::get_singleton()->set_bus_layout(state); AudioServer::get_singleton()->set_bus_layout(state);
_rebuild_buses(); _rebuild_buses();
EditorUndoRedoManager::get_singleton()->clear_history(true, EditorUndoRedoManager::GLOBAL_HISTORY); EditorUndoRedoManager::get_singleton()->clear_history(EditorUndoRedoManager::GLOBAL_HISTORY);
callable_mp(this, &EditorAudioBuses::_select_layout).call_deferred(); callable_mp(this, &EditorAudioBuses::_select_layout).call_deferred();
} }

View File

@ -86,6 +86,10 @@ Ref<EditorSettings> EditorInterface::get_editor_settings() const {
return EditorSettings::get_singleton(); return EditorSettings::get_singleton();
} }
EditorUndoRedoManager *EditorInterface::get_editor_undo_redo() const {
return EditorUndoRedoManager::get_singleton();
}
TypedArray<Texture2D> EditorInterface::_make_mesh_previews(const TypedArray<Mesh> &p_meshes, int p_preview_size) { TypedArray<Texture2D> EditorInterface::_make_mesh_previews(const TypedArray<Mesh> &p_meshes, int p_preview_size) {
Vector<Ref<Mesh>> meshes; Vector<Ref<Mesh>> meshes;
@ -525,6 +529,7 @@ void EditorInterface::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_resource_previewer"), &EditorInterface::get_resource_previewer); ClassDB::bind_method(D_METHOD("get_resource_previewer"), &EditorInterface::get_resource_previewer);
ClassDB::bind_method(D_METHOD("get_selection"), &EditorInterface::get_selection); ClassDB::bind_method(D_METHOD("get_selection"), &EditorInterface::get_selection);
ClassDB::bind_method(D_METHOD("get_editor_settings"), &EditorInterface::get_editor_settings); ClassDB::bind_method(D_METHOD("get_editor_settings"), &EditorInterface::get_editor_settings);
ClassDB::bind_method(D_METHOD("get_editor_undo_redo"), &EditorInterface::get_editor_undo_redo);
ClassDB::bind_method(D_METHOD("make_mesh_previews", "meshes", "preview_size"), &EditorInterface::_make_mesh_previews); ClassDB::bind_method(D_METHOD("make_mesh_previews", "meshes", "preview_size"), &EditorInterface::_make_mesh_previews);

View File

@ -45,6 +45,7 @@ class EditorPlugin;
class EditorResourcePreview; class EditorResourcePreview;
class EditorSelection; class EditorSelection;
class EditorSettings; class EditorSettings;
class EditorUndoRedoManager;
class FileSystemDock; class FileSystemDock;
class Mesh; class Mesh;
class Node; class Node;
@ -93,6 +94,7 @@ public:
EditorResourcePreview *get_resource_previewer() const; EditorResourcePreview *get_resource_previewer() const;
EditorSelection *get_selection() const; EditorSelection *get_selection() const;
Ref<EditorSettings> get_editor_settings() const; Ref<EditorSettings> get_editor_settings() const;
EditorUndoRedoManager *get_editor_undo_redo() const;
Vector<Ref<Texture2D>> make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform3D> *p_transforms, int p_preview_size); Vector<Ref<Texture2D>> make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform3D> *p_transforms, int p_preview_size);

View File

@ -2961,7 +2961,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
ERR_PRINT("Failed to load scene"); ERR_PRINT("Failed to load scene");
} }
editor_data.move_edited_scene_to_index(cur_idx); editor_data.move_edited_scene_to_index(cur_idx);
EditorUndoRedoManager::get_singleton()->clear_history(false, editor_data.get_current_edited_scene_history_id()); EditorUndoRedoManager::get_singleton()->clear_history(editor_data.get_current_edited_scene_history_id(), false);
scene_tabs->set_current_tab(cur_idx); scene_tabs->set_current_tab(cur_idx);
} break; } break;
@ -3963,7 +3963,7 @@ void EditorNode::_set_current_scene_nocheck(int p_idx) {
editor_folding.load_scene_folding(editor_data.get_edited_scene_root(p_idx), editor_data.get_scene_path(p_idx)); editor_folding.load_scene_folding(editor_data.get_edited_scene_root(p_idx), editor_data.get_scene_path(p_idx));
} }
EditorUndoRedoManager::get_singleton()->clear_history(false, editor_data.get_scene_history_id(p_idx)); EditorUndoRedoManager::get_singleton()->clear_history(editor_data.get_scene_history_id(p_idx), false);
} }
Dictionary state = editor_data.restore_edited_scene_state(editor_selection, &editor_history); Dictionary state = editor_data.restore_edited_scene_state(editor_selection, &editor_history);
@ -4073,7 +4073,7 @@ Error EditorNode::load_scene(const String &p_scene, bool p_ignore_broken_deps, b
_set_current_scene(idx); _set_current_scene(idx);
} }
} else { } else {
EditorUndoRedoManager::get_singleton()->clear_history(false, editor_data.get_current_edited_scene_history_id()); EditorUndoRedoManager::get_singleton()->clear_history(editor_data.get_current_edited_scene_history_id(), false);
} }
dependency_errors.clear(); dependency_errors.clear();
@ -5928,7 +5928,7 @@ void EditorNode::reload_scene(const String &p_path) {
bool is_unsaved = EditorUndoRedoManager::get_singleton()->is_history_unsaved(current_history_id); bool is_unsaved = EditorUndoRedoManager::get_singleton()->is_history_unsaved(current_history_id);
// Scene is not open, so at it might be instantiated. We'll refresh the whole scene later. // Scene is not open, so at it might be instantiated. We'll refresh the whole scene later.
EditorUndoRedoManager::get_singleton()->clear_history(false, current_history_id); EditorUndoRedoManager::get_singleton()->clear_history(current_history_id, false);
if (is_unsaved) { if (is_unsaved) {
EditorUndoRedoManager::get_singleton()->set_history_as_unsaved(current_history_id); EditorUndoRedoManager::get_singleton()->set_history_as_unsaved(current_history_id);
} }
@ -5947,7 +5947,7 @@ void EditorNode::reload_scene(const String &p_path) {
// Adjust index so tab is back a the previous position. // Adjust index so tab is back a the previous position.
editor_data.move_edited_scene_to_index(scene_idx); editor_data.move_edited_scene_to_index(scene_idx);
EditorUndoRedoManager::get_singleton()->clear_history(false, editor_data.get_scene_history_id(scene_idx)); EditorUndoRedoManager::get_singleton()->clear_history(editor_data.get_scene_history_id(scene_idx), false);
// Recover the tab. // Recover the tab.
scene_tabs->set_current_tab(current_tab); scene_tabs->set_current_tab(current_tab);
@ -6092,7 +6092,7 @@ void EditorNode::reload_instances_with_path_in_edited_scenes() {
bool is_unsaved = EditorUndoRedoManager::get_singleton()->is_history_unsaved(current_history_id); bool is_unsaved = EditorUndoRedoManager::get_singleton()->is_history_unsaved(current_history_id);
// Clear the history for this affected tab. // Clear the history for this affected tab.
EditorUndoRedoManager::get_singleton()->clear_history(false, current_history_id); EditorUndoRedoManager::get_singleton()->clear_history(current_history_id, false);
// Update the version // Update the version
editor_data.is_scene_changed(current_scene_idx); editor_data.is_scene_changed(current_scene_idx);

View File

@ -390,7 +390,7 @@ bool EditorUndoRedoManager::has_history(int p_idx) const {
return history_map.has(p_idx); return history_map.has(p_idx);
} }
void EditorUndoRedoManager::clear_history(bool p_increase_version, int p_idx) { void EditorUndoRedoManager::clear_history(int p_idx, bool p_increase_version) {
if (p_idx != INVALID_HISTORY) { if (p_idx != INVALID_HISTORY) {
History &history = get_or_create_history(p_idx); History &history = get_or_create_history(p_idx);
history.undo_redo->clear_history(p_increase_version); history.undo_redo->clear_history(p_increase_version);
@ -507,6 +507,7 @@ void EditorUndoRedoManager::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_object_history_id", "object"), &EditorUndoRedoManager::get_history_id_for_object); ClassDB::bind_method(D_METHOD("get_object_history_id", "object"), &EditorUndoRedoManager::get_history_id_for_object);
ClassDB::bind_method(D_METHOD("get_history_undo_redo", "id"), &EditorUndoRedoManager::get_history_undo_redo); ClassDB::bind_method(D_METHOD("get_history_undo_redo", "id"), &EditorUndoRedoManager::get_history_undo_redo);
ClassDB::bind_method(D_METHOD("clear_history", "id", "increase_version"), &EditorUndoRedoManager::clear_history, DEFVAL(INVALID_HISTORY), DEFVAL(true));
ADD_SIGNAL(MethodInfo("history_changed")); ADD_SIGNAL(MethodInfo("history_changed"));
ADD_SIGNAL(MethodInfo("version_changed")); ADD_SIGNAL(MethodInfo("version_changed"));

View File

@ -125,7 +125,7 @@ public:
bool undo_history(int p_id); bool undo_history(int p_id);
bool redo(); bool redo();
bool redo_history(int p_id); bool redo_history(int p_id);
void clear_history(bool p_increase_version = true, int p_idx = INVALID_HISTORY); void clear_history(int p_idx = INVALID_HISTORY, bool p_increase_version = true);
void set_history_as_saved(int p_idx); void set_history_as_saved(int p_idx);
void set_history_as_unsaved(int p_idx); void set_history_as_unsaved(int p_idx);

View File

@ -190,7 +190,7 @@ void InspectorDock::_menu_option_confirm(int p_option, bool p_confirmed) {
} }
int history_id = EditorUndoRedoManager::get_singleton()->get_history_id_for_object(current); int history_id = EditorUndoRedoManager::get_singleton()->get_history_id_for_object(current);
EditorUndoRedoManager::get_singleton()->clear_history(true, history_id); EditorUndoRedoManager::get_singleton()->clear_history(history_id);
EditorNode::get_singleton()->edit_item(current, inspector); EditorNode::get_singleton()->edit_item(current, inspector);
} }