class_name scroll_threats extends ScrollContainer

## Отображает список целей в таблице.


const CellLineEdit = preload('res://table/ячейка-2.tscn')  ## Ячейка таблицы.
const TableHeader  = preload('res://table/header.tscn')     ## Ячейка заголовок таблицы.
const EmitLed      = preload('res://scenes/frame-threats/emit-led.tscn')     ## Ячейка заголовок таблицы.

const TABLE_HEADER       = [ TableHeader,   TableHeader,   TableHeader,     TableHeader ,     TableHeader ]   ## Описание ряда заголовка.
const TABLE_ROW          = [ CellLineEdit,  CellLineEdit,  CellLineEdit,    CellLineEdit,    EmitLed ]  ## Описание ряда.
const TABLE_COLUMN_PARAM = ['id',          'aoa',         'freq',          'proto',          'emit' ]        ## Параметры цели отображаемые в таблице.
const TABLE_HEADERS_TEXT = ['№',       'Пеленг',      'Частота, МГц',  'Протокол',      'Помеха' ]     ## Заголовки таблицы.
const TABLE_COLUMN_SIZE  = [ 65,            70,           110,             140,          65]            ## Ширины колонок.

const TABLE_TEXT_ROWS = 4
const EMIT_STATE_COL = 4

## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()


## Вызывается при нажатии указателем мыши на выбранный ряд.
func on_row_pressed(i_row: int):
    row_pressed(i_row)
    signaller.emit_signal('rto_threat_sel', $table.get_node_user_data(0, i_row).id)


func row_pressed(i_row: int):
    $table.clear_rows_selected()
    $table.set_row_selected(i_row, true)
    $table.ensure_row_visible(i_row)
    var threat = $table.get_node_user_data(0, i_row)
    signaller.emit_signal('threat_selected', threat)


func init_table():
    $table.set_header(TABLE_HEADER)
    $table.set_header_text(TABLE_HEADERS_TEXT)
    $table.set_columns_min_size(TABLE_COLUMN_SIZE)
    $table.pin_header(self, get_parent())


func _ready() -> void:
    var table_index: = Dictionary()
    threats.connect('threat_new',    Callable(self, 'on_threat_new').bind(table_index))
    threats.connect('threat_lost',   Callable(self, 'on_threat_lost').bind(table_index))
    threats.connect('threat_update', Callable(self, 'on_threat_update').bind(table_index))
    signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind($table))
    signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel'))
    $table.connect('row_pressed',    Callable(self, 'on_row_pressed'))
    call_deferred('init_table')


## Перестраивает индекс таблицы. Вызывать при удалении строки.
func rehash(table_index: Dictionary):
    var rows_count = $table.get_rows_count()
    for i_row in rows_count:
        var item = $table.get_node2(0, i_row)
        table_index[int(item.text)] = i_row


## Обрабатывает сигнал [b]threat_update[/b].
func on_threat_update(th, table_index: Dictionary):
    var row = map_th_to_row(th)
    var i_row = table_index[th.id]
    $table.set_row_text(i_row, row)
    var emit_node = $table.get_node2(EMIT_STATE_COL, i_row)
    var emit_txr = emit_node.get_node('texture-led')
    if th.emit_state == 0:
        emit_txr.visible = false
    elif th.emit_state == 1:
        emit_txr.visible = true
        emit_txr.self_modulate = Color.ORANGE
    elif th.emit_state == 2:
        emit_txr.visible = true
        emit_txr.self_modulate = Color.RED
    


## Обрабатывает сигнал [b]threat_lost[/b].
func on_threat_lost(th, table_index: Dictionary):
    $table.remove_row(table_index[th.id])
    table_index.clear()
    rehash(table_index)


## Обрабатывает сигнал [b]threat_new[/b].
func on_threat_new(th, table_index):
    var i_row = $table.get_rows_count()
    $table.add_row(TABLE_ROW)
    var row = map_th_to_row(th)
    $table.set_row_text(i_row, row)
    disable_edit($table, TABLE_TEXT_ROWS, i_row)
    $table.set_node_user_data(0, i_row, th)
    table_index[th.id] = i_row


## Преобразует цель в строку таблицы.
func map_th_to_row(th) -> Array:
    var row: = Array()
    row.resize(TABLE_TEXT_ROWS)
    var i_col: int = 0
    for param_name in TABLE_COLUMN_PARAM:
        var val = th.get(param_name)
        if val == null: continue
        row[i_col] = '%0.1f' % val if val is float else '%s' % val
        if not th.fflags[param_name]:
            row[i_col] = ''
        i_col += 1
    return row


## Выделяет выбранную цель в таблице.
func on_rto_threat_sel(th_id, tbl):
    for i in tbl.get_rows_count():
        var node = tbl.get_node2(0, i)
        if node.text.to_int() == th_id:
            row_pressed(i)
            break


## Отключает возможность редактирования LineEdit в таблице.[br]
## [param tbl] - таблица,[br]
## [param num_col] - номер колонки,[br]
## [param i_row] - номер столбца.[br]
func disable_edit(tbl, num_col: int, i_row: int):
    for col in num_col:
        var node: LineEdit = tbl.get_node2(col, i_row)
        node.editable = false
