140 lines
5.6 KiB
GDScript
140 lines
5.6 KiB
GDScript
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
|
|
|
|
var color_emit: Color
|
|
|
|
## Снимает выделение цели.
|
|
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'))
|
|
ProjectSettings.connect('settings_changed', on_settings_changed)
|
|
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_emit
|
|
|
|
|
|
|
|
## Обрабатывает сигнал [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
|
|
|
|
|
|
func on_settings_changed():
|
|
var json_col = ProjectSettings.get_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', '[1.0, 1.0, 1.0, 1.0]')
|
|
var arr_col = JSON.parse_string(json_col)
|
|
color_emit = Color(arr_col[0], arr_col[1], arr_col[2], arr_col[3])
|