Overhaul scene loading and edit state management

This commit is contained in:
kobewi
2026-02-28 23:08:26 +01:00
parent f94bbfc07c
commit 8cd87c2c16
18 changed files with 242 additions and 247 deletions
+76 -24
View File
@@ -328,8 +328,23 @@ Dictionary EditorData::get_editor_plugin_states() const {
Dictionary EditorData::get_scene_editor_states(int p_idx) const {
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), Dictionary());
EditedScene es = edited_scene[p_idx];
return es.editor_states;
return edited_scene[p_idx].editor_states;
}
Dictionary EditorData::get_scene_editor_states_with_selection(int p_idx) const {
ERR_FAIL_INDEX_V(p_idx, edited_scene.size(), Dictionary());
const EditedScene &es = edited_scene[p_idx];
Dictionary states = es.editor_states;
TypedArray<NodePath> selected_paths;
Node *root = es.root;
if (root) {
for (Node *node : es.selection) {
selected_paths.push_back(root->get_path_to(node));
}
states["selected_nodes"] = selected_paths;
}
return states;
}
void EditorData::set_editor_plugin_states(const Dictionary &p_states) {
@@ -376,6 +391,36 @@ void EditorData::notify_scene_saved(const String &p_path) {
}
}
void EditorData::load_editor_plugin_states_from_config(const Ref<ConfigFile> &p_config_file, int p_idx) {
ERR_FAIL_INDEX(p_idx, edited_scene.size());
EditedScene &es = edited_scene.write[p_idx];
const Vector<String> esl = p_config_file->get_section_keys("editor_states");
Dictionary states;
for (const String &E : esl) {
const Variant state = p_config_file->get_value("editor_states", E);
if (state.get_type() != Variant::NIL) {
states[E] = state;
}
}
es.editor_states = states;
const Node *root = es.root;
if (root && p_config_file->has_section_key("editor_states", "selected_nodes")) {
TypedArray<NodePath> node_paths = p_config_file->get_value("editor_states", "selected_nodes");
List<Node *> nodes;
for (const Variant &np : node_paths) {
Node *node = root->get_node_or_null(np);
if (node) {
nodes.push_back(node);
}
}
es.selection = nodes;
}
}
void EditorData::clear_editor_states() {
for (int i = 0; i < editor_plugins.size(); i++) {
editor_plugins[i]->clear();
@@ -635,12 +680,6 @@ int EditorData::add_edited_scene(int p_at_pos) {
return p_at_pos;
}
void EditorData::move_edited_scene_index(int p_idx, int p_to_idx) {
ERR_FAIL_INDEX(p_idx, edited_scene.size());
ERR_FAIL_INDEX(p_to_idx, edited_scene.size());
SWAP(edited_scene.write[p_idx], edited_scene.write[p_to_idx]);
}
void EditorData::remove_scene(int p_idx) {
ERR_FAIL_INDEX(p_idx, edited_scene.size());
if (edited_scene[p_idx].root) {
@@ -671,6 +710,24 @@ void EditorData::remove_scene(int p_idx) {
edited_scene.remove_at(p_idx);
}
void EditorData::set_scene_root(int p_idx, Node *p_root) {
ERR_FAIL_INDEX(p_idx, edited_scene.size());
EditedScene &scene_info = edited_scene.write[p_idx];
scene_info.root = p_root;
if (p_root) {
if (p_root->is_instance()) {
scene_info.path = p_root->get_scene_file_path();
} else {
p_root->set_scene_file_path(scene_info.path);
}
}
if (!scene_info.path.is_empty()) {
scene_info.file_modified_time = FileAccess::get_modified_time(scene_info.path);
}
}
bool EditorData::_find_updated_instances(Node *p_root, Node *p_node, HashSet<String> &checked_paths) {
Ref<SceneState> ss;
@@ -762,6 +819,15 @@ bool EditorData::reload_scene_from_memory(int p_idx, bool p_mark_unsaved) {
return true;
}
void EditorData::move_scene_to_index(int p_idx, int p_to_idx) {
ERR_FAIL_INDEX(p_idx, edited_scene.size());
ERR_FAIL_INDEX(p_to_idx, edited_scene.size());
EditedScene es = edited_scene[p_idx];
edited_scene.remove_at(p_idx);
edited_scene.insert(p_to_idx, es);
}
int EditorData::get_edited_scene() const {
return current_edited_scene;
}
@@ -792,19 +858,7 @@ Node *EditorData::get_edited_scene_root(int p_idx) {
}
void EditorData::set_edited_scene_root(Node *p_root) {
ERR_FAIL_INDEX(current_edited_scene, edited_scene.size());
edited_scene.write[current_edited_scene].root = p_root;
if (p_root) {
if (p_root->is_instance()) {
edited_scene.write[current_edited_scene].path = p_root->get_scene_file_path();
} else {
p_root->set_scene_file_path(edited_scene[current_edited_scene].path);
}
}
if (!edited_scene[current_edited_scene].path.is_empty()) {
edited_scene.write[current_edited_scene].file_modified_time = FileAccess::get_modified_time(edited_scene[current_edited_scene].path);
}
set_scene_root(current_edited_scene, p_root);
}
int EditorData::get_edited_scene_count() const {
@@ -852,9 +906,7 @@ void EditorData::move_edited_scene_to_index(int p_idx) {
ERR_FAIL_INDEX(current_edited_scene, edited_scene.size());
ERR_FAIL_INDEX(p_idx, edited_scene.size());
EditedScene es = edited_scene[current_edited_scene];
edited_scene.remove_at(current_edited_scene);
edited_scene.insert(p_idx, es);
move_scene_to_index(current_edited_scene, p_idx);
current_edited_scene = p_idx;
}