@tool class_name ImplantPanel extends PanelContainer ## Root container for any implant UI overlay (D-169). ## Add ImplantHeader, ImplantSeparator, ImplantDataRow, ImplantTextBlock ## as children — they auto-style from the shared theme. @export var theme_resource: ImplantTheme: set(value): theme_resource = value _apply_theme() var _vbox: VBoxContainer func _ready() -> void: # Constrain panel to its custom_minimum_size width size_flags_horizontal = Control.SIZE_SHRINK_END clip_contents = true _vbox = VBoxContainer.new() _vbox.name = "Content" add_child(_vbox) _apply_theme() func _apply_theme() -> void: if not theme_resource: return # Panel background var style := StyleBoxFlat.new() style.bg_color = theme_resource.panel_bg style.border_color = theme_resource.separator style.border_width_top = int(theme_resource.border_width) style.border_width_bottom = int(theme_resource.border_width) style.border_width_left = int(theme_resource.border_width) style.border_width_right = int(theme_resource.border_width) style.content_margin_top = theme_resource.padding style.content_margin_bottom = theme_resource.padding style.content_margin_left = theme_resource.padding style.content_margin_right = theme_resource.padding add_theme_stylebox_override("panel", style) # VBox spacing if _vbox: _vbox.add_theme_constant_override("separation", 0) # Propagate theme to existing children for child in get_implant_children(): if child.has_method("apply_implant_theme"): child.apply_implant_theme(theme_resource) ## Add an implant component to the panel. func add_component(component: Control) -> void: if not _vbox: _vbox = VBoxContainer.new() _vbox.name = "Content" add_child(_vbox) _vbox.add_child(component) if theme_resource and component.has_method("apply_implant_theme"): component.apply_implant_theme(theme_resource) ## Get all implant component children. func get_implant_children() -> Array: if not _vbox: return [] return _vbox.get_children() ## Clear all components. func clear() -> void: if not _vbox: return for child in _vbox.get_children(): child.queue_free()