Files
uarep-ctl/scenes/frame-ecm-list/scroll-ecm-list.gd

176 lines
6.3 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends ScrollContainer
## Отображает список помех в таблице.
const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда.
const TABLE_HEADERS_TEXT = ['', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 65, 100, 90, 170 ] ## Ширины колонок.
## Состояние выполнения сеанса помехи
const INTERFER_STATE = {
0: 'Подготовка',
1: 'Выполняется',
2: 'Ошибка',
3: 'Занято',
4: 'Неисправность',
5: '' }
## Названия помех
const INTERFER_NAMES = {
'off': 'Откл',
'mchm1': 'МЧМ-1',
'srni1': 'СРН-И1',
'srnm2': 'СРН-М2',
'srngps': 'СРН-GPS',
'pdm4': 'ПД-М4',
'pdm2': 'ПД-М2',
'lchm1': 'ЛЧМ-1',
'lchm2': 'ЛЧМ-2',
'pdm4s': 'ПД-М4С',
'pdchm': 'ПД-ЧМ',
'svi1': 'СВ-И1',
'k1': 'K1',
'svm2': 'СВ-М2',
'ozp1': 'ОЗП-1',
'eprls': 'ЕПРЛС',}
## Индексы колонок
const COLUMN_NUMBER = 0
const COLUMN_NAME = 1
const COLUMN_AOA = 2
const COLUMN_STATE = 3
var course = 0.0 ## Курс корабля
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()
## Вызывается при нажатии указателем мыши на выбранный ряд.
func on_row_pressed(i_row: int):
$table.clear_rows_selected()
$table.set_row_selected(i_row, true)
var ecm = $table.get_node_user_data(0, i_row)
if interfer.thrs.has(ecm.ispp):
signaller.emit_signal('rto_threat_sel', interfer.thrs[ecm.ispp])
else:
if interfer.fs.has(ecm.ispp):
signaller.emit_signal('fs_selected', ecm)
signaller.emit_signal('interfer_selected', ecm)
## Вызывается при выборе цели
func on_rto_threat_sel(th_id: int, table_index):
var ecm_ispp = interfer.thrs.find_key(th_id)
var ecm = null
if ecm_ispp != null:
var i_row = table_index[int(ecm_ispp)]
ecm = $table.get_node_user_data(0, i_row)
$table.clear_rows_selected()
$table.set_row_selected(i_row, true)
else:
$table.clear_rows_selected()
signaller.emit_signal('interfer_selected', ecm)
# Called when the node enters the scene tree for the first time.
func _ready():
var table_index: = Dictionary()
signaller.connect('interfer_new', Callable(self, 'on_interfer_new').bind(table_index))
signaller.connect('interfer_off', Callable(self, 'on_interfer_off').bind(table_index))
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel'))
signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(table_index))
interfer.connect('interfer_update', Callable(self, 'on_interfer_update').bind(table_index))
interfer.connect('interfer_recommendate', Callable(self, 'on_interfer_recommendate'))
$table.connect('row_pressed', Callable(self, 'on_row_pressed'))
call_deferred('init_table')
var unit_nav = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_navi_data_received)
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 on_interfer_update(ecm, table_index):
var row = map_th_to_row(ecm)
if table_index.has(ecm.ispp):
var i_row = table_index[ecm.ispp]
$table.set_row_text(i_row, row)
func on_interfer_new(ecm, table_index):
var row = map_th_to_row(ecm)
if table_index.has(ecm.ispp):
var i_row = table_index[ecm.ispp]
$table.set_row_text(i_row, row)
else:
var i_row = $table.get_rows_count()
$table.add_row(TABLE_ROW)
$table.set_row_text(i_row, row)
$table.set_row_editable(i_row, false)
$table.set_node_user_data(0, i_row, ecm)
table_index[ecm.ispp] = i_row
# Будем надеяться, что отложенные вызовы производятся в том же порядке
$table.call_deferred('clear_rows_selected')
$table.call_deferred('set_row_selected', i_row, true)
if not interfer.auto_enabled:
signaller.emit_signal('interfer_selected', ecm)
func on_interfer_off(ecm, table_index):
$table.remove_row(table_index[ecm.ispp])
rehash(table_index)
var sel_rows: Array
$table.get_selected_rows(sel_rows)
if not len(sel_rows):
signaller.emit_signal('interfer_selected', null)
## Перестраивает индекс таблицы. Вызывать при удалении строки
func rehash(table_index: Dictionary):
table_index.clear()
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
## Преобразует цель в строку таблицы
func map_th_to_row(ecm) -> Array:
var row: = Array()
row.resize(TABLE_ROW.size())
row[COLUMN_NUMBER] = '%s' % ecm.ispp
row[COLUMN_NAME] = ''
if INTERFER_NAMES.has(ecm.krp):
row[COLUMN_NAME] = '%s' % INTERFER_NAMES[ecm.krp]
var aoa = ecm.kni + course
if aoa > 360.0:
aoa -= 360.0
row[COLUMN_AOA] = '%5.1f' % aoa
row[COLUMN_STATE] = ''
if INTERFER_STATE.has(ecm.svk):
row[COLUMN_STATE] = '%s' % INTERFER_STATE[ecm.svk]
return row
func on_interfer_recommendate(ecm):
var sel_rows: Array
$table.get_selected_rows(sel_rows)
if not len(sel_rows): return
var sel_ecm = $table.get_node_user_data(0, sel_rows[0])
if ecm == sel_ecm:
signaller.emit_signal('interfer_selected', ecm)
func on_navi_data_received(data: Dictionary):
course = data.get('k', 0.0)