Overhaul scene loading and edit state management
This commit is contained in:
+76
-24
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user