Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve saving of built-in resources #86705

Merged
merged 1 commit into from
Feb 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion editor/editor_node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1293,7 +1293,14 @@ void EditorNode::save_resource(const Ref<Resource> &p_resource) {
if (p_resource->is_built_in()) {
const String scene_path = p_resource->get_path().get_slice("::", 0);
if (!scene_path.is_empty()) {
save_scene_if_open(scene_path);
if (ResourceLoader::exists(scene_path) && ResourceLoader::get_resource_type(scene_path) == "PackedScene") {
save_scene_if_open(scene_path);
} else {
// Not a packed scene, so save it as regular resource.
Ref<Resource> parent_resource = ResourceCache::get_ref(scene_path);
ERR_FAIL_COND_MSG(parent_resource.is_null(), "Parent resource not loaded, can't save.");
save_resource(parent_resource);
}
return;
}
}
Expand Down
11 changes: 10 additions & 1 deletion editor/plugins/script_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1000,12 +1000,21 @@ void ScriptEditor::_res_saved_callback(const Ref<Resource> &p_res) {
}
}

if (p_res.is_valid()) {
// In case the Resource has built-in scripts.
_mark_built_in_scripts_as_saved(p_res->get_path());
}

_update_script_names();
trigger_live_script_reload();
}

void ScriptEditor::_scene_saved_callback(const String &p_path) {
// If scene was saved, mark all built-in scripts from that scene as saved.
_mark_built_in_scripts_as_saved(p_path);
}

void ScriptEditor::_mark_built_in_scripts_as_saved(const String &p_parent_path) {
for (int i = 0; i < tab_container->get_tab_count(); i++) {
ScriptEditorBase *se = Object::cast_to<ScriptEditorBase>(tab_container->get_tab_control(i));
if (!se) {
Expand All @@ -1018,7 +1027,7 @@ void ScriptEditor::_scene_saved_callback(const String &p_path) {
continue; // External script, who cares.
}

if (edited_res->get_path().get_slice("::", 0) == p_path) {
if (edited_res->get_path().get_slice("::", 0) == p_parent_path) {
se->tag_saved_version();
}

Expand Down
1 change: 1 addition & 0 deletions editor/plugins/script_editor_plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ class ScriptEditor : public PanelContainer {
void _add_callback(Object *p_obj, const String &p_function, const PackedStringArray &p_args);
void _res_saved_callback(const Ref<Resource> &p_res);
void _scene_saved_callback(const String &p_path);
void _mark_built_in_scripts_as_saved(const String &p_parent_path);

bool open_textfile_after_create = true;
bool trim_trailing_whitespace_on_save;
Expand Down
25 changes: 25 additions & 0 deletions editor/plugins/shader_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,11 +583,36 @@ void ShaderEditorPlugin::_file_removed(const String &p_removed_file) {
}
}

void ShaderEditorPlugin::_res_saved_callback(const Ref<Resource> &p_res) {
if (p_res.is_null()) {
return;
}
const String &path = p_res->get_path();

for (EditedShader &edited : edited_shaders) {
Ref<Resource> shader_res = edited.shader;
if (shader_res.is_null()) {
shader_res = edited.shader_inc;
}
ERR_FAIL_COND(shader_res.is_null());

if (!edited.shader_editor || !shader_res->is_built_in()) {
continue;
}

if (shader_res->get_path().get_slice("::", 0) == path) {
edited.shader_editor->tag_saved_version();
_update_shader_list();
}
}
}

void ShaderEditorPlugin::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_READY: {
EditorNode::get_singleton()->connect("scene_closed", callable_mp(this, &ShaderEditorPlugin::_close_builtin_shaders_from_scene));
FileSystemDock::get_singleton()->connect("file_removed", callable_mp(this, &ShaderEditorPlugin::_file_removed));
EditorNode::get_singleton()->connect("resource_saved", callable_mp(this, &ShaderEditorPlugin::_res_saved_callback));
} break;
}
}
Expand Down
1 change: 1 addition & 0 deletions editor/plugins/shader_editor_plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ class ShaderEditorPlugin : public EditorPlugin {
void _close_shader(int p_index);
void _close_builtin_shaders_from_scene(const String &p_scene);
void _file_removed(const String &p_removed_file);
void _res_saved_callback(const Ref<Resource> &p_res);

void _shader_created(Ref<Shader> p_shader);
void _shader_include_created(Ref<ShaderInclude> p_shader_inc);
Expand Down
Loading