@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_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()


var ranges_save: Dictionary[StringName, Array]  ## <имя диапазона>: [диапазон(x - начало, y - конец), цвет]


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)
