Files
uarep-ctl/scenes/hranges/panel.gd

77 lines
2.4 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 ## Зазор снизу
@export var ranges_group_name: StringName = 'ranges' ## Имя группы для диапазонов
@export var ranges_save: Dictionary[StringName, Array] ## <имя диапазона>: [диапазон(x - начало, y - конец), цвет]
## Добавляет новый диапазон.
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 point0 = size * Vector2(x0, gap_bottom) ## лево низ
var point1 = size * Vector2(x0, 1.0 - gap_top) ## лево верх
var point2 = size * Vector2(x1, 1.0 - gap_top) ## право верх
var point3 = size * Vector2(x1, gap_bottom) ## право низ
rng.polygon = [point0, point1, point2, point3]
rng.name = nm
rng.color = col
add_child(rng)
rng.add_to_group(ranges_group_name)
## Удаляет заданный диапазон.
func _del_range_view(nm: StringName) -> void:
var rng: = get_node(NodePath(nm))
remove_child(rng)
rng.queue_free()
func _clear_ranges_view():
var range_views = get_tree().get_nodes_in_group(ranges_group_name)
for rng in range_views:
remove_child(rng)
rng.queue_free()
func _on_resized() -> void:
_clear_ranges_view()
for nm in ranges_save:
var rng = ranges_save[nm][0]
var col = ranges_save[nm][1]
_add_range_view(nm, rng.x, rng.y, col)