341 lines
22 KiB
GDScript
341 lines
22 KiB
GDScript
class_name configure extends Panel
|
||
|
||
const TableHeader = preload('res://table/header.tscn')
|
||
const TableToggle = preload('res://table/settings-toggle.tscn')
|
||
const TableEdit = preload('res://table/ячейка-2.tscn')
|
||
const TableColorPick = preload('res://table/ячейка-цвет.tscn')
|
||
|
||
const ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
|
||
const HEADER_ROW = [TableHeader, TableHeader]
|
||
const HEADER_ROW_TEXT = ['Параметр', 'Значение']
|
||
const SETTING_TABLE = [
|
||
['Ограниченный режим', TableEdit, TableToggle, 'Ограничть возможности по постановке помех'],
|
||
['Кнопка «ПД-М4»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «ПД-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «ОЗП-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «МЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «ОРН-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «ОРН-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «ЛЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «ПД-М4С»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «ПД-ЧМ»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «СВ-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «К1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «СВ-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'],
|
||
['Внешнее указание Трасса', TableEdit, TableToggle, 'Разрешить постановку помех от Трасса'],
|
||
['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||
['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'],
|
||
['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \"ЭМС-2\"'],
|
||
['Отладка контроля', TableEdit, TableToggle, 'Отображать отладку контроля'],
|
||
['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'],
|
||
['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'],
|
||
['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'],
|
||
['уарэп-капсрпб', TableEdit, TableEdit, 'IP-адрес для связи с КАПС-РПБ [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
|
||
['уарэп-эмс', TableEdit, TableEdit, 'IP-адрес для связи с ЭМС'],
|
||
['уарэп-яу07-2в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 2'],
|
||
['уарэп-яу07-2н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 2'],
|
||
['уарэп-яу07-2к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 2'],
|
||
['уарэп-яу07-4в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 4'],
|
||
['уарэп-яу07-4н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 4'],
|
||
['уарэп-яу07-4к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 4'],
|
||
['уарэп-яу07-1в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 1'],
|
||
['уарэп-яу07-1н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 1'],
|
||
['уарэп-яу07-1к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 1'],
|
||
['уарэп-яу07-3в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 3'],
|
||
['уарэп-яу07-3н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 3'],
|
||
['уарэп-яу07-3к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 3'],
|
||
['уарэп-5п28', TableEdit, TableEdit, 'IP-адрес для связи с 5П28'],
|
||
['навигация', TableEdit, TableEdit, 'Порт назначения для получения данных от АКНГ'],
|
||
['уарэп-щ3', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором Щ3'],
|
||
['уарэп-спт25-1', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 1'],
|
||
['уарэп-спт25-2', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 2'],
|
||
['Шаблон адреса сервера карт', TableEdit, TableEdit, 'Шаблон URL-адреса сервера карт, должен содержать поля \"{x}\", \"{y}\", \"{z}\" для подстановки индекса плитки'],
|
||
['Адрес АФСП левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'],
|
||
['Адрес АФСП правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'],
|
||
['Адрес БПО левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
|
||
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
|
||
['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ],
|
||
['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ],
|
||
['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
|
||
['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'],
|
||
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ],
|
||
['Цвет кнопки \"Подавление\"', TableEdit, TableColorPick, 'Цвет кнопки. Введено по требованию ПЗ' ],
|
||
['Цвет фона схемы', TableEdit, TableColorPick, 'Схема прибора Э2. Изменение цвет фона'],
|
||
['Цвет схемы', TableEdit, TableColorPick, 'Схема прибора Э2. Изменение цвет схемы '] ]
|
||
|
||
|
||
## TODO: Придумать как избавиться от индексов
|
||
## Индексы строк таблицы.
|
||
const EXTERNAL_CU = 16 ## Внешнее целеуказание
|
||
const TRASSA = 17 ## Строка - Трасса
|
||
const SUPPRESS = 18 ## Строка - Подавление
|
||
const KEYBOARD = 19 ## Строка - Виртуальная клавиатура
|
||
const HIDE_EMS2 = 20 ## Строка - Скрыть вкладку ЭМС 2
|
||
const DEBAG_CONTROL = 21 ## Строка - Отладка контроля
|
||
const COMMIT = 22 ## Строка - Версия УАРЭП
|
||
const GOS_BTN = 52 ## Разрешить работу по своим целям
|
||
const COLOR_BTN_ACT = 54 ## Цвет кнопки "Подавление"
|
||
const COLOR_WHITE = 55 ## Цвет фона схемы
|
||
const COLOR_BLACK = 56 ## Цвет схемы
|
||
|
||
|
||
var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки
|
||
var table_color_instance: Node ## Нода цвета кнопки подавления
|
||
|
||
func on_checkbutton_pressed(i_row: int): on_row_pressed(i_row)
|
||
|
||
|
||
## Вызывается, когда узел впервые попадает в дерево сцены.
|
||
func _ready() -> void:
|
||
setting_tab()
|
||
if not OS.get_cmdline_args().has('++ограниченный'):
|
||
return
|
||
$Label2.text = 'Текущий режим доступа: ограниченный'
|
||
for node in $GridContainer.get_children().filter(func(b): return b is Button):
|
||
node.disabled = true
|
||
|
||
|
||
func on_external_cu_btn_pressed(btn) -> void:
|
||
ProjectSettings.set_setting('application/config/Внешнее управление', btn.button_pressed)
|
||
if btn.button_pressed:
|
||
signaller.emit_signal('interfer_off_all')
|
||
|
||
|
||
func on_trassa_btn_pressed(btn) -> void:
|
||
ProjectSettings.set_setting('application/config/Внешнее указание Трасса', btn.button_pressed)
|
||
|
||
|
||
func on_vk_pressed(btn) -> void:
|
||
signaller.emit_signal('kb_pressed', btn.button_pressed)
|
||
|
||
|
||
func on_gos_pressed(btn) -> void:
|
||
ProjectSettings.set_setting('application/config/Включить работу по своим целям', btn.button_pressed)
|
||
|
||
|
||
func on_ems2_pressed(btn) -> void:
|
||
var state = btn.button_pressed
|
||
signaller.emit_signal('ems2_hide_pressed', state)
|
||
|
||
|
||
func on_debag_control_pressed(btn) -> void:
|
||
var state = btn.button_pressed
|
||
signaller.emit_signal("debag_control_pressed", state)
|
||
|
||
|
||
func on_row_pressed(i_row: int):
|
||
$scroll_set/table.clear_rows_selected()
|
||
$scroll_set/table.set_row_selected(i_row, true)
|
||
|
||
|
||
func parse_cmd_line_args(settings_data: Dictionary):
|
||
var args = OS.get_cmdline_args()
|
||
for i in range(0, args.size(), 2):
|
||
var key: String = args[i]
|
||
key = key.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes()
|
||
if not settings_data.has(key):
|
||
continue
|
||
if not ((i + 1) < args.size()):
|
||
push_error('для аргумента \"%s\" не указано значение.' % key)
|
||
break
|
||
var val0 = args[i + 1]
|
||
var val1 = settings_data[key]
|
||
val0 = val0.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes()
|
||
if typeof(val1) == TYPE_BOOL:
|
||
if val0 not in ['yes', 'true', 'да', 'no', 'false', 'нет']:
|
||
push_error('для аргумента \"%s\" указано неверное значение \"%s\".' % [key, val0])
|
||
break
|
||
settings_data[key] = true if val0 in ['yes', 'true', 'да'] else false
|
||
elif typeof(val1) == TYPE_ARRAY:
|
||
var val0s = val0.split(',')
|
||
if val0s.size() != val1.size():
|
||
push_error('для аргумента \"%s\" указано неверное значение \"%s\" (исходное: \"%s\").' % [key, val0, val1])
|
||
break
|
||
for j in val0s.size():
|
||
var val: String = val0s[j]
|
||
val = val.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes()
|
||
if tools.type_is_num(val):
|
||
val0s[j] = int(val)
|
||
elif val in ['true', 'false']:
|
||
val0s[j] = true if val == 'true' else false
|
||
else:
|
||
val0s[j] = val
|
||
elif typeof(val1) == TYPE_STRING:
|
||
settings_data[key] = val0
|
||
|
||
|
||
func setting_tab():
|
||
$heard_table.set_header(HEADER_ROW)
|
||
$heard_table.set_header_text(HEADER_ROW_TEXT)
|
||
$heard_table.set_columns_min_size([600, 950])
|
||
$heard_table.set_columns_alignments(ALIGNMENT)
|
||
var settings_data = {}
|
||
parse_cmd_line_args(settings_data)
|
||
for key in settings_data:
|
||
ProjectSettings.set_setting('application/config/%s' % key, settings_data[key])
|
||
for i in SETTING_TABLE.size():
|
||
var tbl_row = SETTING_TABLE[i]
|
||
var param_name = tbl_row[0]
|
||
var node_label = tbl_row[1]
|
||
var node_value = tbl_row[2]
|
||
var tootip_text = tbl_row[3]
|
||
name_to_line_index[param_name] = i
|
||
$scroll_set/table.add_row([node_label, node_value])
|
||
var label_instance = $scroll_set/table.get_node2(0, i)
|
||
label_instance.text = param_name
|
||
label_instance.tooltip_text = tootip_text
|
||
$scroll_set/table.set_node_editable(0, i, false)
|
||
var node_values = $scroll_set/table.get_node2(1, i).get_children()
|
||
var edit_node = $scroll_set/table.get_node2(1, i)
|
||
if node_values.size():
|
||
var child = node_values[0]
|
||
if child is CheckButton:
|
||
child.connect('pressed', Callable(self, 'on_checkbutton_pressed').bind(i))
|
||
var val = ProjectSettings.get_setting('application/config/%s' % param_name, true)
|
||
child.set_pressed(val)
|
||
else:
|
||
if settings_data.has(param_name):
|
||
var val = settings_data[param_name]
|
||
if typeof(val) == TYPE_STRING:
|
||
$scroll_set/table.get_node2(1, i).text = settings_data[param_name]
|
||
if edit_node:
|
||
if edit_node is LineEdit:
|
||
$scroll_set/table.set_node_control(1, i, true)
|
||
$scroll_set/table.set_node_editable(1, COMMIT, false)
|
||
$scroll_set/table.set_columns_min_size([600, 950])
|
||
$scroll_set/table.set_columns_alignments(ALIGNMENT)
|
||
$scroll_set/table.connect('row_pressed', Callable(self, 'on_row_pressed'))
|
||
var commit_instance = $scroll_set/table.get_node2(1, COMMIT)
|
||
commit_instance.text = '%s' % commit.VCS_HEAD
|
||
for i in SETTING_TABLE.size():
|
||
var param_name = SETTING_TABLE[i][0]
|
||
var profile = $scroll_set/table.get_node2(1, i)
|
||
if settings.UnitProfiles.has(param_name):
|
||
var unit_data = settings.UnitProfiles[param_name][1]
|
||
profile.text = ''
|
||
for val in unit_data:
|
||
profile.text += str(val) + ','
|
||
profile.text = profile.text.trim_suffix(',')
|
||
continue
|
||
var psk = 'application/config/%s' % param_name
|
||
if ProjectSettings.has_setting(psk):
|
||
var unit_data = ProjectSettings.get_setting(psk)
|
||
if is_instance_of(unit_data, TYPE_STRING):
|
||
profile.text = unit_data
|
||
button_settings()
|
||
|
||
|
||
func button_settings():
|
||
var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0]
|
||
extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node))
|
||
on_external_cu_btn_pressed(extern_cu_node)
|
||
var trassa_node = $scroll_set/table.get_node2(1, TRASSA).get_children()
|
||
trassa_node = trassa_node[0]
|
||
trassa_node.connect('pressed', on_trassa_btn_pressed.bind(trassa_node))
|
||
var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0]
|
||
vk_node.connect('pressed', on_vk_pressed.bind(vk_node))
|
||
var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0]
|
||
ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node))
|
||
ems2_hide_node.set_pressed(true)
|
||
on_ems2_pressed(ems2_hide_node)
|
||
var gos_node = $scroll_set/table.get_node2(1, GOS_BTN).get_children()[0]
|
||
gos_node.connect('pressed', on_gos_pressed.bind(gos_node))
|
||
var debag_control = $scroll_set/table.get_node2(1, DEBAG_CONTROL).get_children()[0]
|
||
debag_control.connect('pressed', on_debag_control_pressed.bind(debag_control))
|
||
debag_control.set_pressed(false)
|
||
on_debag_control_pressed(debag_control)
|
||
var color_btn_act = $scroll_set/table.get_node2(1, COLOR_BTN_ACT)
|
||
color_btn_act.connect('popup_closed', on_color_closed.bind(color_btn_act))
|
||
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_btn_act.color = Color(arr_col[0], arr_col[1], arr_col[2], arr_col[3]) if arr_col else Color.WHITE
|
||
color_btn_act.text = JSON.stringify(arr_col)
|
||
var color_white = $scroll_set/table.get_node2(1, COLOR_WHITE)
|
||
color_white.connect('popup_closed', on_color_closed_w.bind(color_white))
|
||
var json_col_w = ProjectSettings.get_setting('application/config/%s' % 'Цвет фона схемы', '[0.0, 0.0, 0.0, 0.0]')
|
||
var arr_col_w = JSON.parse_string(json_col_w)
|
||
color_white.color = Color(arr_col_w[0], arr_col_w[1], arr_col_w[2], arr_col_w[3]) if arr_col_w else Color.DIM_GRAY
|
||
color_white.text = JSON.stringify(arr_col_w)
|
||
var color_black = $scroll_set/table.get_node2(1, COLOR_BLACK)
|
||
color_black.connect('popup_closed', on_color_closed_b.bind(color_black))
|
||
var json_col_b = ProjectSettings.get_setting('application/config/%s' % 'Цвет схемы', '[1.0, 1.0, 1.0, 1.0]')
|
||
var arr_col_b = JSON.parse_string(json_col_b)
|
||
color_black.color = Color(arr_col_b[0], arr_col_b[1], arr_col_b[2], arr_col_b[3]) if arr_col_b else Color.WHITE_SMOKE
|
||
color_black.text = JSON.stringify(arr_col_b)
|
||
|
||
|
||
func _update_theme_colors():
|
||
var color_white = $scroll_set/table.get_node2(1, COLOR_WHITE)
|
||
var color_black = $scroll_set/table.get_node2(1, COLOR_BLACK)
|
||
on_color_closed_w(color_white)
|
||
on_color_closed_b(color_black)
|
||
|
||
|
||
func on_color_closed_w(color_white: ColorPickerButton):
|
||
var col_w = [color_white.color.r, color_white.color.g, color_white.color.b, color_white.color.a]
|
||
color_white.text = JSON.stringify(col_w)
|
||
ProjectSettings.set_setting('application/config/%s' % 'Цвет фона схемы', color_white.text)
|
||
|
||
|
||
func on_color_closed_b(color_black: ColorPickerButton):
|
||
var col_b = [color_black.color.r, color_black.color.g, color_black.color.b, color_black.color.a]
|
||
color_black.text = JSON.stringify(col_b)
|
||
ProjectSettings.set_setting('application/config/%s' % 'Цвет схемы', color_black.text)
|
||
|
||
|
||
func on_color_closed(color_btn_act: ColorPickerButton):
|
||
var col = [color_btn_act.color.r, color_btn_act.color.g, color_btn_act.color.b, color_btn_act.color.a]
|
||
color_btn_act.text = JSON.stringify(col)
|
||
ProjectSettings.set_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', color_btn_act.text)
|
||
|
||
|
||
func _on_btn_save_settings_pressed():
|
||
var json_data = {}
|
||
for i in SETTING_TABLE.size():
|
||
var parameter = SETTING_TABLE[i][0]
|
||
if parameter in settings.UnitProfiles:
|
||
var ref_profile = settings.UnitProfiles[parameter][1]
|
||
var profiles = $scroll_set/table.get_node2(1, i)
|
||
var value = profiles.get_text()
|
||
if parameter not in json_data:
|
||
var row: = []
|
||
for token in value.split(','):
|
||
var j: = row.size()
|
||
if token.is_valid_int():
|
||
token = int(token)
|
||
elif token == 'false':
|
||
token = false
|
||
elif token == 'true':
|
||
token = true
|
||
if typeof(ref_profile[j]) == typeof(token):
|
||
row.append(token)
|
||
else:
|
||
# TODO: Это надо вывести на экран пользователю
|
||
push_error([parameter, j, type_string(typeof(ref_profile[j])), type_string(typeof(token))])
|
||
row.append(ref_profile[j])
|
||
json_data[parameter] = row
|
||
else:
|
||
var children = $scroll_set/table.get_node2(1, i).get_children()
|
||
if len(children):
|
||
var child = children[0]
|
||
json_data[parameter] = child.is_pressed()
|
||
else:
|
||
var row = $scroll_set/table.get_row(i)
|
||
json_data[parameter] = row[1].text
|
||
for key in json_data:
|
||
ProjectSettings.set_setting('application/config/%s' % key, json_data[key])
|
||
var settings_file: = settings.get_settings_file_path()
|
||
var file: = FileAccess.open(settings_file, FileAccess.WRITE)
|
||
var abs_path: = ProjectSettings.globalize_path(settings_file)
|
||
if not file:
|
||
log.error('Не удалось открыть файл для записи \"%s\"' % abs_path)
|
||
return
|
||
var json_string: = JSON.stringify(json_data, ' ', true)
|
||
if file.store_string(json_string):
|
||
log.info('Настройки сохранены в файл \"%s\"' % abs_path)
|
||
file.close()
|