diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 9eebf958ff0..019d62a4bfd 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -64,6 +64,11 @@ void ShaderEditorPlugin::_update_shader_list() { } } + // When shader is deleted in filesystem dock, need this to correctly close shader editor. + if (!path.is_empty()) { + shader->set_meta("_edit_res_path", path); + } + bool unsaved = false; if (edited_shader.shader_editor) { unsaved = edited_shader.shader_editor->is_unsaved(); @@ -571,10 +576,20 @@ void ShaderEditorPlugin::_window_changed(bool p_visible) { make_floating->set_visible(!p_visible); } +void ShaderEditorPlugin::_file_removed(const String &p_removed_file) { + for (uint32_t i = 0; i < edited_shaders.size(); i++) { + const Ref &shader = edited_shaders[i].shader; + if (shader->get_meta("_edit_res_path") == p_removed_file) { + _close_shader(i); + } + } +} + 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)); } break; } } diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index fb7b2832668..8b48140262d 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -87,6 +87,7 @@ class ShaderEditorPlugin : public EditorPlugin { void _resource_saved(Object *obj); 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 _shader_created(Ref p_shader); void _shader_include_created(Ref p_shader_inc);