TheFlipSide/addons/_Godot-IDE_/plugin.gd
2026-01-27 13:00:27 -05:00

299 lines
10 KiB
GDScript

@tool
extends IDE
# =============================================================================
# Author: Twister
# Godot-IDE Extension
#
# ./plugins: Folder for extensions.
# ./shared_resources: Free use for any purposes.
# =============================================================================
var _plugins : Array[EditorPlugin] = []
var _enable_plugins : Dictionary = {}
func _ready() -> void:
debug = false
main_screen_changed.connect(_on_main_screen_changed)
resource_saved.connect(_on_resource_saved)
scene_closed.connect(_on_scene_closed)
scene_changed.connect(_on_scene_changed)
scene_saved.connect(_on_scene_saved)
_initialize()
func _on_resource_saved(resource : Resource) -> void:
for x : EditorPlugin in _plugins:
x.resource_saved.emit(resource)
func _on_scene_closed(filepath: String) -> void:
for x : EditorPlugin in _plugins:
x.scene_closed.emit(filepath)
func _on_scene_changed(scene_root: Node) -> void:
for x : EditorPlugin in _plugins:
x.scene_changed.emit(scene_root)
func _on_scene_saved(filepath: String) -> void:
for x : EditorPlugin in _plugins:
x.scene_saved.emit(filepath)
func _on_main_screen_changed(screen_name : String) -> void:
for x : EditorPlugin in _plugins:
x.main_screen_changed.emit(screen_name)
func _enter_tree() -> void:
set_process(true)
func _process(_delta: float) -> void:
var editor : EditorFileSystem = EditorInterface.get_resource_filesystem()
if !editor:
return
if editor.is_scanning():
return
set_process(false)
#Self-Secure All Loaded
_initialize()
var base : String = get_script().resource_path.get_base_dir()
var path : String = base.path_join("plugins")
_init_config(1)
_load_plugins(path)
_sugar_godot(path)
_sugar_godot(base.path_join("shared_resources"), "teal")
func _init_config(init : int) -> void:
const PATH : String = "res://.godot_ide/"
var cfg_path : String = PATH.path_join("config.ini")
if !DirAccess.dir_exists_absolute(PATH):
DirAccess.make_dir_absolute(PATH)
var file : FileAccess = FileAccess.open(PATH.path_join(".gdignore"), FileAccess.WRITE)
if file:
file.store_string("IDE CONFIG")
file.close()
if init == 1:
if FileAccess.file_exists(cfg_path):
var cfg : ConfigFile = ConfigFile.new()
if cfg.load(cfg_path) == OK:
var value : Variant = cfg.get_value("config", "plugin", {})
if value is Dictionary:
_enable_plugins = value
else:
var cfg : ConfigFile = ConfigFile.new()
cfg.set_value("config", "plugin", _enable_plugins)
if cfg.save(cfg_path) != OK:
push_warning("Can not save plugin changes!")
#if Engine.get_version_info().minor > 4:
#_enable_plugins["res://addons/_Godot-IDE_/plugins/script_spliter/plugin.gd"] = false
#region __PRX__
func _apply_changes() -> void:
_callback(&"_apply_changes")
func _set_window_layout(configuration: ConfigFile) -> void:
for plugin : EditorPlugin in _plugins:
if plugin.has_method(&"_set_window_layout"):
plugin.call(&"_set_window_layout", configuration)
func _build() -> bool:
for plugin : EditorPlugin in _plugins:
if plugin.has_method(&"_build"):
if !plugin.call(&"_build"):
return false
return true
func _clear() -> void:
_callback(&"_build")
func _disable_plugin() -> void:
_callback(&"_disable_plugin")
func _edit(object: Object) -> void:
for plugin : EditorPlugin in _plugins:
if plugin.has_method(&"_edit"):
plugin.call(&"_edit", object)
func _forward_3d_draw_over_viewport(viewport_control: Control) -> void:
for plugin : EditorPlugin in _plugins:
if plugin.has_method(&"_forward_3d_draw_over_viewport"):
plugin.call(&"_forward_3d_draw_over_viewport", viewport_control)
func _forward_3d_force_draw_over_viewport(viewport_control: Control) -> void:
for plugin : EditorPlugin in _plugins:
if plugin.has_method(&"_forward_3d_force_draw_over_viewport"):
plugin.call(&"_forward_3d_force_draw_over_viewport", viewport_control)
func _forward_canvas_draw_over_viewport(viewport_control: Control) -> void:
for plugin : EditorPlugin in _plugins:
if plugin.has_method(&"_forward_canvas_draw_over_viewport"):
plugin.call(&"_forward_canvas_draw_over_viewport", viewport_control)
func _forward_canvas_force_draw_over_viewport(viewport_control: Control) -> void:
for plugin : EditorPlugin in _plugins:
if plugin.has_method(&"_forward_canvas_force_draw_over_viewport"):
plugin.call(&"_forward_canvas_force_draw_over_viewport", viewport_control)
func _forward_canvas_gui_input(event: InputEvent) -> bool:
var out : bool = false
for plugin : EditorPlugin in _plugins:
if plugin.has_method(&"_forward_canvas_gui_input"):
out = plugin.call(&"_forward_canvas_gui_input", event) or out
return out
#endregion
func _callback(method : StringName) -> void:
for plugin : EditorPlugin in _plugins:
if plugin.has_method(method):
plugin.call(method)
func _exit_tree() -> void:
for x : Node in _plugins:
if is_instance_valid(x):
if !x.is_queued_for_deletion():
x.queue_free()
_plugins.clear()
_init_config(0)
var editor : EditorSettings = EditorInterface.get_editor_settings()
if editor:
if editor.settings_changed.is_connected(_on_changes):
editor.settings_changed.disconnect(_on_changes)
if is_instance_valid(IDE._menu):
IDE._menu.queue_free()
IDE._menu = null
func _load_plugins(path : String) -> void:
if !is_instance_valid(IDE._menu):
var file : MenuButton = get_file_menu_button()
if is_instance_valid(file):
var root : Node = file.get_parent()
IDE._menu = MenuButton.new()
IDE._menu.text = "Godot-IDE"
root.add_child(_menu)
root.move_child(_menu, mini(1, root.get_child_count() - 1))
if !DirAccess.dir_exists_absolute(path):
path = path.get_base_dir().get_file()
if EditorInterface.is_plugin_enabled(path):
EditorInterface.set_plugin_enabled(path, false)
printerr("{0}: Error, can not find 'plugins' folder! [0x00000003]".format([path.capitalize().to_upper()]))
return
var dir :DirAccess = DirAccess.open(path)
var plugins_dir : Array = []
var plugins_file : Array = []
var authors : PackedStringArray = []
if dir:
dir.list_dir_begin()
var file_name : String = dir.get_next()
while !file_name.is_empty():
if dir.current_is_dir():
plugins_dir.append(path.path_join(file_name))
file_name = dir.get_next()
dir.list_dir_end()
else:
printerr("{0}:error, can not open 'plugins' folder! [0x00000005]".format([path.get_base_dir().get_file().capitalize().to_upper()]))
while plugins_dir.size() > 0:
var current_path : String = plugins_dir.pop_back()
var plugin_path : String = current_path.path_join("plugin.gd")
var plugin_cfg : String = current_path.path_join("plugin.cfg")
if FileAccess.file_exists(plugin_cfg):
var cfg : ConfigFile = ConfigFile.new()
if cfg.load(plugin_cfg) == OK:
if cfg.has_section_key("plugin", "script"):
plugin_path = current_path.path_join(str(cfg.get_value("plugin", "script")))
if cfg.has_section_key("plugin", "author"):
var value : String = str(cfg.get_value("plugin", "author"))
if !value.is_empty() and !authors.has(value):
authors.append(value)
if !FileAccess.file_exists(plugin_path):
plugin_path = current_path.path_join(current_path.get_file())
if !FileAccess.file_exists(plugin_path):
printerr("{0}:error, can not open 'plugin/{1}' folder! [0x00000005]".format([path.get_base_dir().get_file().capitalize().to_upper(), current_path.get_file()]))
continue
plugins_file.append(plugin_path)
var current_plugins : Dictionary = {}
for plugin : String in plugins_file:
if _enable_plugins.has(plugin):
if _enable_plugins[plugin] == false:
continue
var variant : Variant = ResourceLoader.load(plugin)
if variant is Script:
if variant.can_instantiate():
if !variant.is_tool():
push_warning("Plugin script is not tool: {0}".format([plugin]))
variant = variant.new()
if variant is EditorPlugin:
_plugins.append(variant)
current_plugins[plugin] = true
_enable_plugins = current_plugins
for plugin : EditorPlugin in _plugins:
get_parent().add_child(plugin)
if plugin.has_method(&"_enable_plugin"):
plugin.call(&"_enable_plugin")
print("[Godot-IDE Extension]")
if authors.size() > 0:
print("> Plugin Contributors: {0}".format([", ".join(authors)]))
func _sugar_godot(dir : String, col : String = "blue") -> void:
if !ProjectSettings.has_setting("file_customization/folder_colors"):
ProjectSettings.set_setting("file_customization/folder_colors", {dir: col})
else:
if !dir.ends_with("/"):
dir += "/"
var data : Dictionary = ProjectSettings.get_setting("file_customization/folder_colors", {})
if !data.has(dir):
data[dir] = col
ProjectSettings.set_setting("file_customization/folder_colors", data)
else:
return
var editor : EditorFileSystem = EditorInterface.get_resource_filesystem()
if editor:
editor.scan.call_deferred()
func _on_changes() -> void:
var editor : EditorSettings = EditorInterface.get_editor_settings()
if editor:
var changes : PackedStringArray = editor.get_changed_settings()
if "plugin/gd_override_functions/inheritance/virtual_functions_begins_with" in changes:
IDE.VIRTUAL_METHODS = editor.get_setting("plugin/gd_override_functions/inheritance/virtual_functions_begins_with")
if "plugin/gd_override_functions/inheritance/private_functions_begins_with" in changes:
IDE.PRIVATE_METHODS = editor.get_setting("plugin/gd_override_functions/inheritance/private_functions_begins_with")
func _initialize() -> void:
var dirt : Dictionary = {}
var dat : Array[Dictionary] = (get_script() as Script).get_script_method_list()
for dct : Dictionary in dat:
var key : String = dct["name"]
if dirt.has(key):
continue
dirt[key] = true
if has_method(key):
if key.begins_with("get_"):
if !dct.has("args") or dct["args"].size() == 0:
call(key)
var editor : EditorSettings = EditorInterface.get_editor_settings()
if editor:
if editor.has_setting("plugin/gd_override_functions/inheritance/virtual_functions_begins_with"):
IDE.VIRTUAL_METHODS = editor.get_setting("plugin/gd_override_functions/inheritance/virtual_functions_begins_with")
if editor.has_setting("plugin/gd_override_functions/inheritance/private_functions_begins_with"):
IDE.PRIVATE_METHODS = editor.get_setting("plugin/gd_override_functions/inheritance/private_functions_begins_with")
if !editor.settings_changed.is_connected(_on_changes):
editor.settings_changed.connect(_on_changes)