Files
TheTree_mock/scripts/ui/layer_interface_skin.gd
Takeshi 5dde0c5ec2 Record original-alignment implementation and traceability checkpoint
Capture current source, content data, tests, asset licenses, and original-specification traceability. Original implementation remains incomplete. The accepted matching UI generation passed 154 suites and 12,253 checks, with eight rendered staff-contract screens reviewed. Latest native Windows and full-original acceptance remain outstanding.
2026-09-30 23:52:24 +09:00

60 lines
3.6 KiB
GDScript

class_name LayerInterfaceSkin
extends RefCounted
## Visual-only palette for the persistent HUD. No simulation state is owned here.
const STYLE_META := &"layer_interface_front_style"
const TEXT_META := &"layer_interface_front_text"
const BACK_TEXT_META := &"layer_interface_back_text"
const BACK_PANELS := {
&"panel_outer": Color("10191e"), &"panel_wood": Color("1a282e"),
&"panel_leather": Color("172229"), &"panel_parchment": Color("202e34"),
&"button_normal": Color("293c43"), &"button_hover": Color("385860"),
&"button_pressed": Color("275954"), &"button_disabled": Color("293135"),
}
static func register_style(style: StyleBoxFlat, role: StringName, layer: int) -> void:
style.set_meta(STYLE_META, {&"role":role, &"background":style.bg_color, &"border":style.border_color})
apply_style(style, layer)
static func apply_style(style: StyleBoxFlat, layer: int) -> void:
if not style.has_meta(STYLE_META): return
var front: Dictionary = style.get_meta(STYLE_META)
var background: Color = BACK_PANELS.get(front[&"role"], Color("202e34")) if layer == 1 else front[&"background"]
var border: Color = Color("73989a") if layer == 1 else front[&"border"]
if style.bg_color != background: style.bg_color = background
if style.border_color != border: style.border_color = border
static func register_text(label: Label, layer: int) -> void:
if not label.has_meta(TEXT_META): label.set_meta(TEXT_META, label.get_theme_color("font_color"))
var color: Color = label.get_meta(BACK_TEXT_META, Color("d8eeea")) if layer == 1 else label.get_meta(TEXT_META)
if label.get_theme_color("font_color") != color: label.add_theme_color_override("font_color", color)
static func register_status_text(label: Label, success: bool, layer: int) -> void:
label.set_meta(TEXT_META, Color("397346") if success else Color("a7402e"))
label.set_meta(BACK_TEXT_META, Color("b5e7ba") if success else Color("ffb498"))
register_text(label, layer)
static func active_layer(node: Node) -> int:
if not node.is_inside_tree(): return 0
var state := node.get_node_or_null("/root/GameState")
return int(state.get("active_layer")) if state != null else 0
static func register_toggle_text(button: BaseButton, layer: int) -> void:
const META := &"layer_interface_toggle_text"
if not button.has_meta(META):
var colors := {}
for key: StringName in [&"font_color", &"font_pressed_color", &"font_hover_color", &"font_hover_pressed_color", &"font_focus_color", &"font_disabled_color"]:
colors[key] = button.get_theme_color(key)
button.set_meta(META, colors)
var front: Dictionary = button.get_meta(META)
for key: StringName in front:
var color: Color = front[key] if layer == 0 else (Color("8da4a4") if key == &"font_disabled_color" else Color("d8eeea"))
if button.get_theme_color(key) != color: button.add_theme_color_override(key, color)
static func apply_tree(node: Node, layer: int) -> void:
if node is Window and node.theme != null:
for entry: Array in [[&"panel", &"AcceptDialog"], [&"embedded_border", &"Window"]]:
if node.theme.has_stylebox(entry[0], entry[1]):
var window_style: StyleBox = node.theme.get_stylebox(entry[0], entry[1])
if window_style is StyleBoxFlat: apply_style(window_style, layer)
if node is Control:
for key: StringName in [&"panel", &"normal", &"hover", &"pressed", &"focus", &"disabled"]:
if node.has_theme_stylebox_override(key):
var style: StyleBox = node.get_theme_stylebox(key)
if style is StyleBoxFlat: apply_style(style, layer)
if node is Label and node.has_meta(TEXT_META): register_text(node, layer)
if node is BaseButton and node.has_meta(&"layer_interface_toggle_text"): register_toggle_text(node, layer)
for child: Node in node.get_children(): apply_tree(child, layer)