41 lines
1.3 KiB
GDScript
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)
|