Add per-scene UndoRedo
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "editor/editor_node.h"
|
||||
#include "editor/editor_plugin.h"
|
||||
#include "editor/editor_undo_redo_manager.h"
|
||||
#include "editor/plugins/script_editor_plugin.h"
|
||||
#include "scene/resources/packed_scene.h"
|
||||
|
||||
@@ -364,13 +365,13 @@ void EditorData::restore_editor_global_states() {
|
||||
|
||||
void EditorData::paste_object_params(Object *p_object) {
|
||||
ERR_FAIL_NULL(p_object);
|
||||
undo_redo.create_action(TTR("Paste Params"));
|
||||
undo_redo_manager->create_action(TTR("Paste Params"));
|
||||
for (const PropertyData &E : clipboard) {
|
||||
String name = E.name;
|
||||
undo_redo.add_do_property(p_object, name, E.value);
|
||||
undo_redo.add_undo_property(p_object, name, p_object->get(name));
|
||||
undo_redo_manager->add_do_property(p_object, name, E.value);
|
||||
undo_redo_manager->add_undo_property(p_object, name, p_object->get(name));
|
||||
}
|
||||
undo_redo.commit_action();
|
||||
undo_redo_manager->commit_action();
|
||||
}
|
||||
|
||||
bool EditorData::call_build() {
|
||||
@@ -383,8 +384,49 @@ bool EditorData::call_build() {
|
||||
return result;
|
||||
}
|
||||
|
||||
UndoRedo &EditorData::get_undo_redo() {
|
||||
return undo_redo;
|
||||
void EditorData::set_scene_as_saved(int p_idx) {
|
||||
if (p_idx == -1) {
|
||||
p_idx = current_edited_scene;
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, edited_scene.size());
|
||||
|
||||
get_undo_redo()->set_history_as_saved(edited_scene[p_idx].history_id);
|
||||
}
|
||||
|
||||
bool EditorData::is_scene_changed(int p_idx) {
|
||||
if (p_idx == -1) {
|
||||
p_idx = current_edited_scene;
|
||||
}
|
||||
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), false);
|
||||
|
||||
uint64_t current_scene_version = get_undo_redo()->get_or_create_history(edited_scene[p_idx].history_id).undo_redo->get_version();
|
||||
bool is_changed = edited_scene[p_idx].last_checked_version != current_scene_version;
|
||||
edited_scene.write[p_idx].last_checked_version = current_scene_version;
|
||||
return is_changed;
|
||||
}
|
||||
|
||||
int EditorData::get_scene_history_id_from_path(const String &p_path) const {
|
||||
for (const EditedScene &E : edited_scene) {
|
||||
if (E.path == p_path) {
|
||||
return E.history_id;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int EditorData::get_current_edited_scene_history_id() const {
|
||||
if (current_edited_scene != -1) {
|
||||
return edited_scene[current_edited_scene].history_id;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int EditorData::get_scene_history_id(int p_idx) const {
|
||||
return edited_scene[p_idx].history_id;
|
||||
}
|
||||
|
||||
Ref<EditorUndoRedoManager> &EditorData::get_undo_redo() {
|
||||
return undo_redo_manager;
|
||||
}
|
||||
|
||||
void EditorData::add_undo_redo_inspector_hook_callback(Callable p_callable) {
|
||||
@@ -415,12 +457,12 @@ Callable EditorData::get_move_array_element_function(const StringName &p_class)
|
||||
}
|
||||
|
||||
void EditorData::remove_editor_plugin(EditorPlugin *p_plugin) {
|
||||
p_plugin->undo_redo = nullptr;
|
||||
p_plugin->undo_redo = Ref<EditorUndoRedoManager>();
|
||||
editor_plugins.erase(p_plugin);
|
||||
}
|
||||
|
||||
void EditorData::add_editor_plugin(EditorPlugin *p_plugin) {
|
||||
p_plugin->undo_redo = &undo_redo;
|
||||
p_plugin->undo_redo = undo_redo_manager;
|
||||
editor_plugins.push_back(p_plugin);
|
||||
}
|
||||
|
||||
@@ -505,8 +547,8 @@ int EditorData::add_edited_scene(int p_at_pos) {
|
||||
es.path = String();
|
||||
es.file_modified_time = 0;
|
||||
es.history_current = -1;
|
||||
es.version = 0;
|
||||
es.live_edit_root = NodePath(String("/root"));
|
||||
es.history_id = last_created_scene++;
|
||||
|
||||
if (p_at_pos == edited_scene.size()) {
|
||||
edited_scene.push_back(es);
|
||||
@@ -547,6 +589,7 @@ void EditorData::remove_scene(int p_idx) {
|
||||
ScriptEditor::get_singleton()->close_builtin_scripts_from_scene(edited_scene[p_idx].path);
|
||||
}
|
||||
|
||||
undo_redo_manager->discard_history(edited_scene[p_idx].history_id);
|
||||
edited_scene.remove_at(p_idx);
|
||||
}
|
||||
|
||||
@@ -679,26 +722,10 @@ Vector<EditorData::EditedScene> EditorData::get_edited_scenes() const {
|
||||
return out_edited_scenes_list;
|
||||
}
|
||||
|
||||
void EditorData::set_edited_scene_version(uint64_t version, int p_scene_idx) {
|
||||
ERR_FAIL_INDEX(current_edited_scene, edited_scene.size());
|
||||
if (p_scene_idx < 0) {
|
||||
edited_scene.write[current_edited_scene].version = version;
|
||||
} else {
|
||||
ERR_FAIL_INDEX(p_scene_idx, edited_scene.size());
|
||||
edited_scene.write[p_scene_idx].version = version;
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t EditorData::get_scene_version(int p_idx) const {
|
||||
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), 0);
|
||||
return edited_scene[p_idx].version;
|
||||
}
|
||||
|
||||
void EditorData::set_scene_modified_time(int p_idx, uint64_t p_time) {
|
||||
if (p_idx == -1) {
|
||||
p_idx = current_edited_scene;
|
||||
}
|
||||
|
||||
ERR_FAIL_INDEX(p_idx, edited_scene.size());
|
||||
|
||||
edited_scene.write[p_idx].file_modified_time = p_time;
|
||||
@@ -991,6 +1018,7 @@ void EditorData::script_class_load_icon_paths() {
|
||||
|
||||
EditorData::EditorData() {
|
||||
current_edited_scene = -1;
|
||||
undo_redo_manager.instantiate();
|
||||
script_class_load_icon_paths();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user