102 lines
2.9 KiB
GDScript
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)
|