From ad767b2ec4c0bc5bf0d9ded879d78ba2fa1c0be7 Mon Sep 17 00:00:00 2001 From: kobewi Date: Sun, 12 Sep 2021 21:17:34 +0200 Subject: [PATCH] Don't edit foreign resources when restoring scene (cherry picked from commit 363a9c674a13376daeb8689489bf5366b9db10d3) --- editor/editor_node.cpp | 18 +++++++++++++----- editor/editor_node.h | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index bd5c87c667f..0f339771906 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -1977,11 +1977,19 @@ static bool overrides_external_editor(Object *p_object) { return script->get_language()->overrides_external_editor(); } -void EditorNode::_edit_current() { +void EditorNode::_edit_current(bool p_skip_foreign) { uint32_t current = editor_history.get_current(); Object *current_obj = current > 0 ? ObjectDB::get_instance(current) : nullptr; - bool inspector_only = editor_history.is_current_inspector_only(); + RES res = Object::cast_to(current_obj); + if (p_skip_foreign && res.is_valid()) { + if (res->get_path().find("::") > -1 && res->get_path().get_slice("::", 0) != editor_data.get_scene_path(get_current_tab())) { + // Trying to edit resource that belongs to another scene; abort. + current_obj = nullptr; + } + } + + bool inspector_only = editor_history.is_current_inspector_only(); this->current = current_obj; if (!current_obj) { @@ -2112,8 +2120,8 @@ void EditorNode::_edit_current() { if (main_plugin) { // special case if use of external editor is true - Resource *res = Object::cast_to(current_obj); - if (main_plugin->get_name() == "Script" && current_obj->get_class_name() != StringName("VisualScript") && res && !res->get_path().empty() && res->get_path().find("::") == -1 && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) { + Resource *current_res = Object::cast_to(current_obj); + if (main_plugin->get_name() == "Script" && current_obj->get_class_name() != StringName("VisualScript") && current_res && !current_res->get_path().empty() && current_res->get_path().find("::") == -1 && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) { if (!changing_scene) { main_plugin->edit(current_obj); } @@ -3475,7 +3483,7 @@ void EditorNode::set_current_scene(int p_idx) { } Dictionary state = editor_data.restore_edited_scene_state(editor_selection, &editor_history); - _edit_current(); + _edit_current(true); _update_title(); diff --git a/editor/editor_node.h b/editor/editor_node.h index bbd1ed7dfd2..226f10b8330 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -452,7 +452,7 @@ private: void _dialog_action(String p_file); - void _edit_current(); + void _edit_current(bool p_skip_foreign = false); void _dialog_display_save_error(String p_file, Error p_error); void _dialog_display_load_error(String p_file, Error p_error);