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)