Files
uarep-ctl/scenes/настройки/настройки.gd

265 lines
16 KiB
GDScript
Raw 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.

class_name setting 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 ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
const HEADER_ROW = [TableHeader, TableHeader]
const HEADER_ROW_TEXT = ['Параметр', 'Значение']
const SETTING_TABLE = [
['Ограниченный режим', TableEdit, TableToggle, 'Ограничть возможности по постановке помех'],
['Кнопка «ПД-М', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «ПД-М', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «ОЗП-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «МЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «ОРН-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «ОРН-М', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «ЛЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «ПД-М4С»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «ПД-ЧМ»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «СВ-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «К', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «СВ-М', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'],
['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'],
['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \"ЭМС-2\"'],
['Текущая версия ПО УАРЭП', 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}\" для подстановки индекса плитки'] ]
const EXTERNAL_CU = 16 ## Внешнее целееуказание
const SUPPRESS = 17 ## Строка - Подавление
const KEYBOARD = 18 ## Строка - Виртуальная клавиатура
const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2
const COMMIT = 20 ## Строка - Версия УАРЭП
var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки
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:
var state = btn.button_pressed
ProjectSettings.set_setting('application/config/Внешнее управление', state)
if state:
signaller.emit_signal('interfer_off_all')
func on_vk_pressed(btn) -> void:
var state = btn.button_pressed
signaller.emit_signal('kb_pressed', state)
func on_ems2_pressed(btn) -> void:
var state = btn.button_pressed
signaller.emit_signal('ems2_hide_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 load_settings(settings_data: Dictionary):
var settings_file = settings.get_settings_file_path()
var file = FileAccess.open(settings_file, FileAccess.READ)
var abs_path = ProjectSettings.globalize_path(settings_file)
if file:
var read = file.get_as_text()
file.close()
var json_conv = JSON.new()
if json_conv.parse(read) == OK:
settings_data.merge(json_conv.get_data())
else:
log.warning('Не удалось разобрать \"%s\", будут использованы настройки по умолчанию' % abs_path)
else:
log.warning('Файл \"%s\" не найден, будут использованы настройки по умолчанию' % abs_path)
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 = {}
load_settings(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 = settings_data[param_name] if settings_data.has(param_name) else false
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]
if not settings.UnitProfiles.has(param_name):
continue
var unit_data = settings.UnitProfiles[param_name]
var profile = $scroll_set/table.get_node2(1, i)
var joined_data = ''
for j in unit_data[2].size():
joined_data += str(unit_data[2][j])
if j < unit_data[2].size() - 1:
joined_data += ','
profile.text = '%s : %s' % [str(unit_data[1]), joined_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 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)
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 profiles = $scroll_set/table.get_node2(1, i)
var value = profiles.get_text()
if parameter not in json_data:
json_data[parameter] = []
if value.find(':') != -1:
var parts = value.split(':')
var ip = parts[0].strip_edges()
var ports = parts[1].split(',')
json_data[parameter].append(ip)
for port in ports:
if port == 'true':
json_data[parameter].append(true)
elif port == 'false':
json_data[parameter].append(false)
else:
port = port.strip_edges()
if port.is_valid_int():
port = int(port)
json_data[parameter].append(port)
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()