149 lines
5.3 KiB
GDScript
149 lines
5.3 KiB
GDScript
extends ScrollContainer
|
||
|
||
|
||
## Отображает список помех в таблице.
|
||
const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
|
||
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
|
||
|
||
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
|
||
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда.
|
||
const TABLE_HEADERS_TEXT = ['Номер', 'Название', 'Частота, МГц', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
|
||
const TABLE_COLUMN_SIZE = [ 65, 80, 120, 70, 100 ] ## Ширины колонок.
|
||
|
||
## Состояние выполнения сеанса помехи
|
||
const INTERFER_STATE = {
|
||
0: 'Подготовка',
|
||
1: 'Выполняется',
|
||
2: 'Ошибка',
|
||
3: 'Занято',
|
||
4: 'Неисправность',
|
||
5: 'Передача' }
|
||
|
||
|
||
## Состояние выполнения сеанса помехи
|
||
const INTERFER_NAMES = {
|
||
'off': 'Откл',
|
||
'mchm1': 'МЧМ-1',
|
||
'srni1': 'СРН-И1',
|
||
'srnm2': 'СРН-М2',
|
||
'pdm4': 'ПД-М4',
|
||
'pdm2': 'ПД-М2',
|
||
'lchm1': 'ЛЧМ-1',
|
||
'pdm4s': 'ПД-М4С',
|
||
'pdchm': 'ПД-ЧМ',
|
||
'svi1': 'СВ-И1',
|
||
'k1': 'K1',
|
||
'svm2': 'СВ-М2',
|
||
'ozp1': 'ОЗП-1'}
|
||
|
||
|
||
## Индексы колонок
|
||
const COLUMN_NUMBER = 0
|
||
const COLUMN_NAME = 1
|
||
const COLUMN_FREQ = 2
|
||
const COLUMN_AOA = 3
|
||
const COLUMN_STATE = 4
|
||
|
||
|
||
## Вызывается при нажатии указателем мыши на выбранный ряд.
|
||
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:
|
||
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))
|
||
$table.connect('row_pressed', Callable(self, 'on_row_pressed'))
|
||
call_deferred('init_table')
|
||
|
||
|
||
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.clear_rows_selected()
|
||
$table.set_row_selected(i_row, true)
|
||
signaller.emit_signal('interfer_selected', ecm)
|
||
|
||
|
||
func on_interfer_off(ecm, ecms, thrs, table_index):
|
||
$table.remove_row(table_index[ecm.ispp])
|
||
table_index.clear()
|
||
rehash(table_index)
|
||
ecms.erase(ecm.ispp)
|
||
thrs.erase(ecm.ispp)
|
||
|
||
|
||
## Перестраивает индекс таблицы. Вызывать при удалении строки
|
||
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
|
||
|
||
|
||
## Преобразует цель в строку таблицы
|
||
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]
|
||
row[COLUMN_FREQ] = '%s' % ecm.params['freq']
|
||
row[COLUMN_AOA] = '%s' % ecm.kni
|
||
row[COLUMN_STATE] = ''
|
||
if INTERFER_STATE.has(ecm.svk):
|
||
row[COLUMN_STATE] = '%s' % INTERFER_STATE[ecm.svk]
|
||
return row
|
||
|
||
|
||
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()
|