TowerDefense/addons/signal_lens/plugin.gd
2025-08-25 23:23:03 +02:00

121 lines
4.1 KiB
GDScript

## Initializes Signal Lens plugin and its internal components
@tool
extends EditorPlugin
## Preloaded reference to the editor panel that will be added to
## Godot's debugger bottom panel
const SIGNAL_LENS_EDITOR_PANEL = preload("res://addons/signal_lens/editor/signal_lens_editor_panel.tscn")
## Name of autoload node/class that will be instantiated in the remote scene
## so we can retrieve/send data to it
const AUTOLOAD_NAME = "SignalLens"
## Debugger object that listens to Godot's callbacks
var debugger: SignalLensDebugger = null
## Inspector plugin that allows selecting remote scene nodes
var remote_node_inspector: SignalLensRemoteNodeInspector = null
## Editor panel that draws data received from remote scene
var editor_panel: SignalLensEditorPanel = null
## Setups the plugin and connects internal components
## Called on enter editor scene tree
func initialize():
# Create debugger and inspector objects
debugger = SignalLensDebugger.new()
remote_node_inspector = SignalLensRemoteNodeInspector.new()
# Register plugins in the engine
add_inspector_plugin(remote_node_inspector)
add_debugger_plugin(debugger)
# Add plugin project settings
setup_project_settings()
# Connect node selection in scene tree to backend request for
# that node's signal data
remote_node_inspector.node_selected.connect(debugger.request_node_data_from_remote)
# Create editor panel and add it to the debugger
editor_panel = SIGNAL_LENS_EDITOR_PANEL.instantiate()
debugger.setup_editor_panel(editor_panel)
# Connect data received from debugger to editor panel so data can be
# rendered in graph form
debugger.received_node_data_from_remote.connect(editor_panel.draw_node_data)
# Connect signal emissions from targeted node to editor panel
# so they can be rendered in the graph
debugger.received_signal_emission_from_remote.connect(editor_panel.draw_signal_emission)
# Connect refresh request to debugger so we can retrieve data from
# currently selected node on demand
editor_panel.node_data_requested.connect(debugger.request_node_data_from_remote)
# Connect start and stop debugging signals for editor panel setup/cleanup
debugger.started.connect(editor_panel.start_session)
debugger.stopped.connect(editor_panel.stop_session)
# Connect node selection to editor panel so line edit can reflect currently
# selected node's path
remote_node_inspector.node_selected.connect(editor_panel.assign_node_path)
## Creates and sets default values for Project Settings related to the plugin
func setup_project_settings():
# Resize on open
var setting_resize_panel_on_open = "addons/Signal Lens/resize_panel_on_open"
if not ProjectSettings.has_setting(setting_resize_panel_on_open):
ProjectSettings.set_setting(setting_resize_panel_on_open, true)
ProjectSettings.add_property_info({
"name": setting_resize_panel_on_open,
"type": TYPE_BOOL,
"hint": TYPE_BOOL,
"hint_string": TYPE_BOOL
})
ProjectSettings.set_initial_value(setting_resize_panel_on_open, true)
ProjectSettings.set_as_basic(setting_resize_panel_on_open, true)
# Resize on open
var setting_height_to_resize_to = "addons/Signal Lens/height_to_resize_to"
if not ProjectSettings.has_setting(setting_height_to_resize_to):
ProjectSettings.set_setting(setting_height_to_resize_to, 500)
ProjectSettings.add_property_info({
"name": setting_height_to_resize_to,
"type": TYPE_FLOAT,
"hint": PROPERTY_HINT_RANGE,
"hint_string": "200, 900"
})
ProjectSettings.set_initial_value(setting_height_to_resize_to, 500)
ProjectSettings.set_as_basic(setting_height_to_resize_to, true)
## Removes plugin from editor and cleans references
func cleanup():
# De-register plugins from engine
remove_debugger_plugin(debugger)
remove_inspector_plugin(remote_node_inspector)
# Remove references to initialized components
remote_node_inspector = null
debugger = null
editor_panel = null
#region Engine Callbacks
func _enter_tree() -> void:
initialize()
func _exit_tree() -> void:
cleanup()
func _enable_plugin():
add_autoload_singleton(AUTOLOAD_NAME, "res://addons/signal_lens/autoload/signal_lens_autoload.gd")
func _disable_plugin():
remove_autoload_singleton(AUTOLOAD_NAME)
#endregion