Files
aetherbound-guild/runtime/ui/shared/ui_icon.gd
T

152 lines
6.4 KiB
GDScript

class_name ABGUIIcon
extends Control
const Tokens = preload("res://foundation/ui_tokens.gd")
## Small owned vector icon used by shared command surfaces. It intentionally
## stays presentation-only so page Views can replace Unicode glyphs without
## depending on gameplay, Save or EntryShell state.
var icon_kind := "generic"
var icon_tone := "dark"
var disabled := false
var hot := false
func configure(next_kind: String, next_tone := "dark") -> ABGUIIcon:
icon_kind = next_kind.to_lower() if Tokens.icon_kind_supported(next_kind) else "generic"
icon_tone = next_tone
queue_redraw()
return self
func set_state(next_disabled := false, next_hot := false) -> void:
disabled = next_disabled
hot = next_hot
queue_redraw()
func _ready() -> void:
mouse_filter = Control.MOUSE_FILTER_IGNORE
set_process(true)
queue_redraw()
func _process(_delta: float) -> void:
var parent_button := get_parent() as BaseButton
if parent_button != null:
var next_disabled := parent_button.disabled
var next_hot := not next_disabled and (parent_button.is_hovered() or parent_button.has_focus())
if next_disabled != disabled or next_hot != hot:
set_state(next_disabled, next_hot)
func _draw() -> void:
if size.x <= 1.0 or size.y <= 1.0:
return
var center := size * 0.5
var radius := minf(size.x, size.y) * 0.31
var scale := maxf(0.65, minf(size.x, size.y) / 24.0)
var color := Tokens.icon_color(disabled, hot, icon_tone != "light")
var width := maxf(1.2, 1.8 * scale)
match icon_kind:
"back":
draw_polyline(PackedVector2Array([
center + Vector2(5.5, -6.5) * scale,
center + Vector2(-3.5, 0.0) * scale,
center + Vector2(5.5, 6.5) * scale,
]), color, width, true)
draw_line(center + Vector2(-3.0, 0.0) * scale, center + Vector2(8.0, 0.0) * scale, color, width, true)
"confirm":
draw_polyline(PackedVector2Array([
center + Vector2(-7.0, 0.0) * scale,
center + Vector2(-2.0, 5.0) * scale,
center + Vector2(8.0, -6.0) * scale,
]), color, width, true)
"settings":
draw_arc(center, radius * 0.62, 0.0, TAU, 20, color, width, true)
draw_circle(center, radius * 0.18, color)
for angle in range(0, 360, 45):
var direction := Vector2.RIGHT.rotated(deg_to_rad(float(angle)))
draw_line(center + direction * radius * 0.72, center + direction * radius * 1.06, color, width, true)
"inspect":
draw_circle(center + Vector2(-2.5, -2.5) * scale, radius * 0.58, Color(color, 0.08))
draw_arc(center + Vector2(-2.5, -2.5) * scale, radius * 0.58, 0.0, TAU, 20, color, width, true)
draw_line(center + Vector2(2.0, 2.0) * scale, center + Vector2(8.0, 8.0) * scale, color, width, true)
"company":
_draw_people(center, radius, color, width)
"coin":
var gem := PackedVector2Array([
center + Vector2(0.0, -radius * 1.15),
center + Vector2(radius * 0.82, -radius * 0.22),
center + Vector2(radius * 0.56, radius * 0.96),
center + Vector2(-radius * 0.56, radius * 0.96),
center + Vector2(-radius * 0.82, -radius * 0.22),
])
draw_colored_polygon(gem, Color(color, 0.24))
draw_polyline(gem, color, width, true)
draw_line(center + Vector2(0.0, -radius * 0.92), center + Vector2(0.0, radius * 0.82), color, width * 0.72, true)
"equipment":
var shield := PackedVector2Array([
center + Vector2(-radius * 0.86, -radius * 0.72),
center + Vector2(radius * 0.86, -radius * 0.72),
center + Vector2(radius * 0.70, radius * 0.26),
center + Vector2(0.0, radius * 1.02),
center + Vector2(-radius * 0.70, radius * 0.26),
])
draw_colored_polygon(shield, Color(color, 0.16))
draw_polyline(shield, color, width, true)
draw_line(center + Vector2(0.0, -radius * 0.60), center + Vector2(0.0, radius * 0.72), color, width * 0.72, true)
"party":
draw_line(center + Vector2(-radius * 0.72, -radius), center + Vector2(-radius * 0.72, radius), color, width, true)
draw_colored_polygon(PackedVector2Array([
center + Vector2(-radius * 0.56, -radius * 0.82),
center + Vector2(radius * 0.92, -radius * 0.50),
center + Vector2(radius * 0.30, radius * 0.16),
center + Vector2(-radius * 0.56, -radius * 0.10),
]), Color(color, 0.90))
"risk":
var flame := PackedVector2Array([
center + Vector2(0.0, -radius * 1.12),
center + Vector2(radius * 0.70, -radius * 0.10),
center + Vector2(radius * 0.54, radius * 0.70),
center + Vector2(0.0, radius * 1.04),
center + Vector2(-radius * 0.64, radius * 0.62),
center + Vector2(-radius * 0.50, -radius * 0.16),
center + Vector2(-radius * 0.08, radius * 0.20),
center + Vector2(0.0, -radius * 1.12),
])
draw_polyline(flame, color, width, true)
"pause":
draw_line(center + Vector2(-4.0, -7.0) * scale, center + Vector2(-4.0, 7.0) * scale, color, width, true)
draw_line(center + Vector2(4.0, -7.0) * scale, center + Vector2(4.0, 7.0) * scale, color, width, true)
"speed":
draw_line(center + Vector2(-8.0, 4.0) * scale, center + Vector2(0.0, -4.0) * scale, color, width, true)
draw_line(center + Vector2(0.0, -4.0) * scale, center + Vector2(8.0, 4.0) * scale, color, width, true)
draw_line(center + Vector2(-8.0, 8.0) * scale, center + Vector2(0.0, 0.0) * scale, Color(color, 0.64), width * 0.8, true)
"retry":
draw_arc(center, radius * 0.75, -PI * 0.18, PI * 1.45, 18, color, width, true)
draw_polyline(PackedVector2Array([
center + Vector2(-8.0, -4.0) * scale,
center + Vector2(-8.0, 3.0) * scale,
center + Vector2(-2.0, 2.0) * scale,
]), color, width, true)
"close":
draw_line(center + Vector2(-6.0, -6.0) * scale, center + Vector2(6.0, 6.0) * scale, color, width, true)
draw_line(center + Vector2(6.0, -6.0) * scale, center + Vector2(-6.0, 6.0) * scale, color, width, true)
"help":
draw_arc(center, radius * 0.92, 0.0, TAU, 24, color, width, true)
draw_circle(center + Vector2(0.0, 6.0) * scale, width * 0.60, color)
draw_arc(center + Vector2(0.0, -2.0) * scale, radius * 0.30, PI, TAU, 12, color, width, true)
"generic":
draw_arc(center, radius * 0.88, 0.0, TAU, 24, color, width, true)
func _draw_people(center: Vector2, radius: float, color: Color, width: float) -> void:
for offset in [-0.48, 0.0, 0.48]:
var head := center + Vector2(radius * offset, -radius * (0.26 if offset == 0.0 else 0.16))
var head_radius := radius * (0.23 if offset == 0.0 else 0.18)
draw_arc(head, head_radius, 0.0, TAU, 14, color, width, true)
var shoulder := Vector2(head.x, center.y + radius * (0.28 if offset == 0.0 else 0.34))
draw_arc(shoulder, radius * (0.36 if offset == 0.0 else 0.28), PI, TAU, 12, color, width, true)