diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index dca54eb0283c..8bc44a2f12a9 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -1304,21 +1304,27 @@ void EditorNode::_scan_external_changes() { disk_changed_list->set_hide_root(true); bool need_reload = false; - // Check if any edited scene has changed. + disk_changed_scenes.clear(); + disk_changed_project = false; + // Check if any edited scene has changed. for (int i = 0; i < editor_data.get_edited_scene_count(); i++) { Ref da = DirAccess::create(DirAccess::ACCESS_RESOURCES); - if (editor_data.get_scene_path(i) == "" || !da->file_exists(editor_data.get_scene_path(i))) { + + const String scene_path = editor_data.get_scene_path(i); + + if (scene_path == "" || !da->file_exists(scene_path)) { continue; } uint64_t last_date = editor_data.get_scene_modified_time(i); - uint64_t date = FileAccess::get_modified_time(editor_data.get_scene_path(i)); + uint64_t date = FileAccess::get_modified_time(scene_path); if (date > last_date) { TreeItem *ti = disk_changed_list->create_item(r); - ti->set_text(0, editor_data.get_scene_path(i).get_file()); + ti->set_text(0, scene_path.get_file()); need_reload = true; + disk_changed_scenes.push_back(scene_path); } } @@ -1327,6 +1333,7 @@ void EditorNode::_scan_external_changes() { TreeItem *ti = disk_changed_list->create_item(r); ti->set_text(0, "project.godot"); need_reload = true; + disk_changed_project = true; } if (need_reload) { @@ -1334,9 +1341,15 @@ void EditorNode::_scan_external_changes() { } } -void EditorNode::_resave_scenes(String p_str) { - save_all_scenes(); - ProjectSettings::get_singleton()->save(); +void EditorNode::_resave_externally_modified_scenes(String p_str) { + for (const String &scene_path : disk_changed_scenes) { + _save_scene(scene_path); + } + + if (disk_changed_project) { + ProjectSettings::get_singleton()->save(); + } + disk_changed->hide(); } @@ -8293,7 +8306,7 @@ EditorNode::EditorNode() { disk_changed->set_ok_button_text(TTR("Reload from disk")); disk_changed->add_button(TTR("Ignore external changes"), !DisplayServer::get_singleton()->get_swap_cancel_ok(), "resave"); - disk_changed->connect("custom_action", callable_mp(this, &EditorNode::_resave_scenes)); + disk_changed->connect("custom_action", callable_mp(this, &EditorNode::_resave_externally_modified_scenes)); } gui_base->add_child(disk_changed); diff --git a/editor/editor_node.h b/editor/editor_node.h index eeb232c033c1..d134054c491f 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -434,6 +434,8 @@ class EditorNode : public Node { EditorBottomPanel *bottom_panel = nullptr; Tree *disk_changed_list = nullptr; + LocalVector disk_changed_scenes; + bool disk_changed_project = false; ConfirmationDialog *disk_changed = nullptr; ConfirmationDialog *project_data_missing = nullptr; @@ -674,7 +676,7 @@ class EditorNode : public Node { void _scan_external_changes(); void _reload_modified_scenes(); void _reload_project_settings(); - void _resave_scenes(String p_str); + void _resave_externally_modified_scenes(String p_str); void _feature_profile_changed(); bool _is_class_editor_disabled_by_feature_profile(const StringName &p_class);