Files
SurfaceSide-UI/scripts/status_gauge.gd
T

41 lines
1.3 KiB
GDScript

@tool
extends Control
@export var minimum := 0.0
@export var maximum := 36.0
@export var warning_low := 0.0
@export var warning_high := 24.0
@export var fault_low := 0.0
@export var fault_high := 30.0
@export var nominal := NAN
var value := 0.0
var available := false
func _ready() -> void:
resized.connect(queue_redraw)
theme_changed.connect(queue_redraw)
func _x(number: float) -> float:
return 4 + clampf((number - minimum) / maxf(maximum - minimum, 0.001), 0, 1) * (size.x - 8)
func _zone(low: float, high: float, role: String) -> void:
if high <= low:
return
var color := get_theme_color(role, "SurfaceSide")
color.a = 0.65
draw_rect(Rect2(_x(low), 4, _x(high) - _x(low), 6), color)
func _draw() -> void:
draw_rect(Rect2(4, 4, maxf(size.x - 8, 0), 6), get_theme_color("instrument_grid", "SurfaceSide"))
_zone(minimum, fault_low, "fault")
_zone(fault_low, warning_low, "warning")
_zone(warning_high, fault_high, "warning")
_zone(fault_high, maximum, "fault")
if is_finite(nominal):
draw_line(Vector2(_x(nominal), 0), Vector2(_x(nominal), 16), get_theme_color("instrument_accent", "SurfaceSide"), 2)
if available:
var x := _x(value)
var ink := get_theme_color("font_color", "Label")
draw_line(Vector2(x, 0), Vector2(x, 14), ink, 3)
draw_colored_polygon(PackedVector2Array([Vector2(x - 5, 0), Vector2(x + 5, 0), Vector2(x, 4)]), ink)