@tool extends EditorPlugin const YAMLEditorPanel = preload("res://addons/yaml/editor/yaml_editor.tscn") const ShortcutsClass = preload("res://addons/yaml/editor/editor_shortcuts.gd") var yaml_editor_instance: YAMLEditor var resource_loader: YAMLResourceFormat.Loader var resource_saver: YAMLResourceFormat.Saver # Store original editor settings to restore on exit var previous_textfile_extensions: String var engine_version_info := Engine.get_version_info() func _enter_tree() -> void: # Modify editor settings to remove YAML from text files _modify_file_extensions() # Create and register resource format handlers resource_loader = YAMLResourceFormat.Loader.new() resource_saver = YAMLResourceFormat.Saver.new() ResourceLoader.add_resource_format_loader(resource_loader, true) ResourceSaver.add_resource_format_saver(resource_saver, true) add_custom_type( "YAMLResource", "Resource", load("res://addons/yaml/yaml_resource.gd"), _get_plugin_icon() ) # Initialize YAMLFileSystem singleton var file_system = YAMLFileSystem.get_singleton() # Create the instance yaml_editor_instance = YAMLEditorPanel.instantiate() # Add to the main screen EditorInterface.get_editor_main_screen().add_child(yaml_editor_instance) # Register keyboard shortcuts ShortcutsClass.register_shortcuts(self, yaml_editor_instance) # Hide initially - this is very important _make_visible(false) # Connect file system signals to detect file moves/renames EditorInterface.get_resource_filesystem().resources_reimported.connect(_on_resources_reimported) EditorInterface.get_resource_filesystem().filesystem_changed.connect(_on_filesystem_changed) func _exit_tree() -> void: # Restore original editor settings _restore_file_extensions() ResourceLoader.remove_resource_format_loader(resource_loader) ResourceSaver.remove_resource_format_saver(resource_saver) remove_custom_type("YAMLResource") # Unregister shortcuts ShortcutsClass.unregister_shortcuts() # Clean up if yaml_editor_instance: # Save the current session before closing if yaml_editor_instance.session_manager: yaml_editor_instance.session_manager.save_session() yaml_editor_instance.queue_free() # Clean up other resources EditorInterface.get_resource_filesystem().resources_reimported.disconnect(_on_resources_reimported) EditorInterface.get_resource_filesystem().filesystem_changed.disconnect(_on_filesystem_changed) func _modify_file_extensions() -> void: var editor_settings: EditorSettings = EditorInterface.get_editor_settings() # Store original settings previous_textfile_extensions = editor_settings.get_setting("docks/filesystem/textfile_extensions") # Remove yaml/yml from text files (so Script Editor ignores them) var new_textfiles = previous_textfile_extensions.replace(",yaml", "").replace(",yml", "").replace("yaml,", "").replace("yml,", "") editor_settings.set_setting("docks/filesystem/textfile_extensions", new_textfiles) func _restore_file_extensions() -> void: if previous_textfile_extensions.is_empty(): return var editor_settings: EditorSettings = EditorInterface.get_editor_settings() editor_settings.set_setting("docks/filesystem/textfile_extensions", previous_textfile_extensions) func _on_filesystem_changed() -> void: # Notify the YAML editor that the filesystem has changed if yaml_editor_instance and is_instance_valid(yaml_editor_instance): yaml_editor_instance.handle_filesystem_change() func _on_resources_reimported(resources: PackedStringArray) -> void: # Check if any of our open YAML files were reimported if yaml_editor_instance and is_instance_valid(yaml_editor_instance): var file_system = YAMLFileSystem.get_singleton() for path in resources: if file_system.is_yaml_file(path): # Notify the file system singleton about the update file_system.notify_file_updated(path) func _has_main_screen() -> bool: return true func _make_visible(visible: bool) -> void: if yaml_editor_instance: yaml_editor_instance.visible = visible # Focus the code editor when becoming visible if visible and is_instance_valid(yaml_editor_instance.code_edit): yaml_editor_instance.code_edit.grab_focus() func _handles(object: Object) -> bool: # Handle YAMLResource (from our resource loader) if object is YAMLResource: return true # Handle Resource objects that are YAML files if object is Resource and YAMLFileSystem.get_singleton().is_yaml_file(object.resource_path): return true return false func _edit(object: Object) -> void: if !object or !is_instance_valid(yaml_editor_instance): return if not _handles(object): return var file_path = object.resource_path # Check if file is already open before trying to open it if yaml_editor_instance.file_manager.has_document(file_path): # File is already open, just switch to it var document = yaml_editor_instance.file_manager.get_document(file_path) yaml_editor_instance.file_manager.set_current_document(document) else: # File is not open, open it normally yaml_editor_instance.file_manager.open_file(file_path) _make_visible(true) func _get_plugin_name() -> String: return "YAML" func get_plugin_path() -> String: return get_script().resource_path.get_base_dir() func _get_plugin_icon() -> Texture2D: return load(get_plugin_path() + "/icon.svg")