SIZE_FLAGS_FILL → SIZE_FILL, SIZE_FLAGS_SHRINK_END → SIZE_SHRINK_END. The _FLAGS_ prefix was removed in Godot 4.6. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
79 lines
2.1 KiB
GDScript
79 lines
2.1 KiB
GDScript
@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()
|