Files
uarep-ctl/scenes/hranges/panel.gd
2026-04-02 10:58:13 +03:00

102 lines
2.9 KiB
GDScript

@tool
extends PanelContainer
## Предназначено для отображения диапазонов на горизонтальной шкале
@export_range(0.0, 1.0) var gap_top: float = 0.05 ## Зазор сверху
@export_range(0.0, 1.0) var gap_bottom: float = 0.05 ## Зазор снизу
var ranges_save: Dictionary[StringName, Array] ## <имя диапазона>: [диапазон(x - начало, y - конец), цвет]
@export_file var image_file: String:
set(val):
image_file = val
if is_inside_tree():
_enter_tree()
@export var back_color: Color:
set(val):
back_color = val
if is_inside_tree():
_enter_tree()
func _enter_tree() -> void:
if ResourceLoader.exists(image_file):
$grid/image.texture = load(image_file)
$grid/canvas.self_modulate = back_color
## Добавляет новый диапазон.
func set_range(nm: StringName, x0: float, x1: float, col: Color) -> void:
ranges_save[nm] = [Vector2(x0, x1), col]
_on_resized()
func set_range_color(nm: StringName, col: Color):
if not ranges_save.has(nm):
push_error('нет такого диапазона: \"%s\"' % nm)
return false
ranges_save[nm][1] = col
var rng: = get_node_or_null(NodePath(nm))
if not rng:
push_error('нет такого элемента: \"%s\"' % nm)
return false
rng.color = col
return true
func clear_ranges():
var l0 = ranges_save.size()
ranges_save.clear()
var l1 = ranges_save.size()
_on_resized()
return l1 < l0
func del_range(nm: StringName) -> bool:
var rc = ranges_save.erase(nm)
_on_resized()
return rc
func _add_range_view(nm: StringName, x0: float, x1: float, col: Color):
var rng = Polygon2D.new()
var canvas = $grid/canvas
var canvas_size = canvas.size
var point0 = canvas_size * Vector2(x0, gap_bottom) ## лево низ
var point1 = canvas_size * Vector2(x0, 1.0 - gap_top) ## лево верх
var point2 = canvas_size * Vector2(x1, 1.0 - gap_top) ## право верх
var point3 = canvas_size * Vector2(x1, gap_bottom) ## право низ
rng.polygon = [point0, point1, point2, point3]
rng.name = nm
rng.color = col
canvas.add_child(rng)
## Удаляет заданный диапазон.
func _del_range_view(nm: StringName) -> void:
var canvas: = $grid/canvas
var rng: = canvas.get_node(NodePath(nm))
canvas.remove_child(rng)
rng.queue_free()
func _clear_ranges_view():
var canvas: = $grid/canvas
var range_views: = canvas.get_children()
for rng in range_views:
canvas.remove_child(rng)
rng.queue_free()
func _on_resized() -> void:
_clear_ranges_view()
for nm in ranges_save:
var range_save = ranges_save[nm]
var rng = range_save[0]
var col = range_save[1]
_add_range_view(nm, rng.x, rng.y, col)