From 416e93c4e42627e234f4e3bf6710f56414225ae2 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Wed, 28 Jan 2026 13:53:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF?= =?UTF-8?q?=D1=83=D1=82=D0=B8=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=81=D1=86=D0=B5=D0=BD=20=D1=83=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D1=8F=D1=8E=D1=82=D1=81=D1=8F=20=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.gd | 70 ++++++++++++++++++--------------- scenes/настройки/настройки.tscn | 10 ++++- scenes/работа/работа.tscn | 1 - scenes/эмс/кнопка-эмс.gd | 32 ++++++++++++--- scenes/эмс/кнопка-эмс.tscn | 7 +++- scripts/prd-ctl-config.gd | 69 ++++++++++++++++---------------- 6 files changed, 112 insertions(+), 77 deletions(-) diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index d6ade08a..dd1ba51d 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -1,14 +1,42 @@ 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') +@export var TableHeader: PackedScene +@export var TableToggle: PackedScene +@export var TableEdit: PackedScene +@export var TableColorPick: PackedScene const ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] -const HEADER_ROW = [TableHeader, TableHeader] -const HEADER_ROW_TEXT = ['Параметр', 'Значение'] -const SETTING_TABLE = [ +const HEADER_ROW_TEXT: = ['Параметр', 'Значение'] + +var HEADER_ROW: Array + +## 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 ## Цвет схемы +const COLOR_THEME = 57 ## Цвет темы + +var SETTING_TABLE: Array + +var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки +var table_color_instance: Node ## Нода цвета кнопки подавления + +func on_checkbutton_pressed(i_row: int): + on_row_pressed(i_row) + + +func _init_scene_arrays(): + HEADER_ROW = [TableHeader, TableHeader] + SETTING_TABLE = [ ['Ограниченный режим', TableEdit, TableToggle, 'Ограничть возможности по постановке помех'], # 0 ['Кнопка «ПД-М4»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 1 ['Кнопка «ПД-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], # 2 @@ -71,29 +99,6 @@ const SETTING_TABLE = [ ['Время повторной отправки помехи', TableEdit, TableEdit, 'Изменение времени повторной отправки помехи'] ] # 59 -## 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 ## Цвет схемы -const COLOR_THEME = 57 ## Цвет темы - - -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() @@ -105,14 +110,14 @@ func _ready() -> void: func on_external_cu_btn_pressed(btn) -> void: - ProjectSettings.set_setting('application/config/Внешнее управление', btn.button_pressed) + ProjectSettings.set_setting('application/config/%s' % 'Внешнее управление', btn.button_pressed) if btn.button_pressed: signaller.emit_signal('interfer_off_all') _autosave_now() func on_trassa_btn_pressed(btn) -> void: - ProjectSettings.set_setting('application/config/Внешнее указание Трасса', btn.button_pressed) + ProjectSettings.set_setting('application/config/%s' % 'Внешнее указание Трасса', btn.button_pressed) _autosave_now() @@ -180,6 +185,7 @@ func parse_cmd_line_args(settings_data: Dictionary): func setting_tab(): + _init_scene_arrays() $heard_table.set_header(HEADER_ROW) $heard_table.set_header_text(HEADER_ROW_TEXT) $heard_table.set_columns_min_size([600, 950]) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 88f5604f..586733e5 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -1,10 +1,18 @@ -[gd_scene load_steps=3 format=3 uid="uid://bnptm4rlp60dq"] +[gd_scene load_steps=7 format=3 uid="uid://bnptm4rlp60dq"] [ext_resource type="Script" uid="uid://dabpum5iqxc7y" path="res://scenes/настройки/настройки.gd" id="1_60bya"] [ext_resource type="Script" uid="uid://c5pq0hbrij34d" path="res://table/table.gd" id="2_6sx73"] +[ext_resource type="PackedScene" uid="uid://ch14g46swx74h" path="res://table/header.tscn" id="2_l8r7w"] +[ext_resource type="PackedScene" uid="uid://5rw652cmnybi" path="res://table/settings-toggle.tscn" id="3_6e5sv"] +[ext_resource type="PackedScene" uid="uid://dspa16ufrpanp" path="res://table/ячейка-2.tscn" id="4_i0f0r"] +[ext_resource type="PackedScene" uid="uid://cug5xjbfdm7x7" path="res://table/ячейка-цвет.tscn" id="5_h2mq4"] [node name="Настройки" type="Panel"] script = ExtResource("1_60bya") +TableHeader = ExtResource("2_l8r7w") +TableToggle = ExtResource("3_6e5sv") +TableEdit = ExtResource("4_i0f0r") +TableColorPick = ExtResource("5_h2mq4") [node name="heard_table" type="GridContainer" parent="."] layout_mode = 0 diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 6220c622..96f87bf0 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -96,7 +96,6 @@ text = "Обзорная карта" self_modulate = Color(1, 1, 1, 0.415686) position = Vector2(360, 360) min_zoom_level = 3 -max_zoom_level_server = 11 ship_radius_km = 3.0 az = 3.0 diff --git a/scenes/эмс/кнопка-эмс.gd b/scenes/эмс/кнопка-эмс.gd index 4937b7de..511d4e40 100644 --- a/scenes/эмс/кнопка-эмс.gd +++ b/scenes/эмс/кнопка-эмс.gd @@ -3,21 +3,33 @@ extends PanelContainer -@export var texture_state0: Texture2D = preload('res://data/кнопка-эмс-1.png'): - set(val): $state.set_texture(val) +@export var texture_state0: Texture2D: + set(val): + texture_state0 = val + if is_inside_tree(): + $state.set_texture(val) -@export var texture_state1: Texture2D = preload('res://data/кнопка-эмс-0.png'): - set(val): $state.set_texture(val) +@export var texture_state1: Texture2D: + set(val): + texture_state1 = val + if is_inside_tree(): + $state.set_texture(val) @export var text: String = '': - set(val): $button.set_text(val) + set(val): + text = val + if is_inside_tree(): + $button.set_text(val) get: return $button.get_text() @export var pressed: bool = false: - set(val): $button.set_pressed(val) + set(val): + pressed = val + if is_inside_tree(): + $button.set_pressed(val) get: return $button.is_pressed() @@ -28,6 +40,14 @@ extends PanelContainer get: return $button.is_toggle_mode() +func _enter_tree() -> void: + var tst = texture_state1 if $button.pressed else texture_state0 + $state.set_texture(tst) + $button.set_text(text) + $button.set_pressed(pressed) + $button.set_toggle_mode(toggle_mode) + + func set_text (val: String): $button.set_text(val) func set_pressed (val: bool): $button.set_pressed(val) diff --git a/scenes/эмс/кнопка-эмс.tscn b/scenes/эмс/кнопка-эмс.tscn index 3b55dc2d..93979030 100644 --- a/scenes/эмс/кнопка-эмс.tscn +++ b/scenes/эмс/кнопка-эмс.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=9 format=3 uid="uid://gh3wqymu7cub"] +[gd_scene load_steps=10 format=3 uid="uid://gh3wqymu7cub"] [ext_resource type="Script" uid="uid://dhqqyf2pd1scs" path="res://scenes/эмс/кнопка-эмс.gd" id="1_pmsh3"] [ext_resource type="Texture2D" uid="uid://nfpish471rjj" path="res://data/кнопка-эмс-1.png" id="2_0o537"] +[ext_resource type="Texture2D" uid="uid://bvxv33noium2h" path="res://data/кнопка-эмс-0.png" id="3_okiyh"] [sub_resource type="StyleBoxEmpty" id="1"] @@ -20,12 +21,14 @@ offset_right = 30.0 offset_bottom = 30.0 theme_override_styles/panel = SubResource("1") script = ExtResource("1_pmsh3") +texture_state0 = ExtResource("2_0o537") +texture_state1 = ExtResource("3_okiyh") toggle_mode = true [node name="state" type="NinePatchRect" parent="."] show_behind_parent = true layout_mode = 2 -texture = ExtResource("2_0o537") +texture = ExtResource("3_okiyh") region_rect = Rect2(-1.60803, -1.94625, 31.9305, 25.9868) patch_margin_left = 6 patch_margin_top = 5 diff --git a/scripts/prd-ctl-config.gd b/scripts/prd-ctl-config.gd index c21ca4c8..fb886959 100644 --- a/scripts/prd-ctl-config.gd +++ b/scripts/prd-ctl-config.gd @@ -1,28 +1,28 @@ class_name PRDConfigManager extends RefCounted -## Менеджер конфигурации для системы контроля ПРД -## Загружает и управляет настройками из JSON-конфигурации +## Менеджер конфигурации для системы контроля ПРД. +## Загружает и управляет настройками из JSON-конфигурации. #region CONSTANTS -const CONFIG_PATH = "user://config/setting_prd_control.json" -const DEFAULT_CONFIG_PATH = "res://config/setting_prd_control.json" -const CONFIG_VERSION = "1.0.0" # Версия конфигурации - увеличивать при изменениях +const CONFIG_PATH = 'user://config/setting_prd_control.json' +const DEFAULT_CONFIG_PATH = 'res://config/setting_prd_control.json' +const CONFIG_VERSION = '1.0.0' # Версия конфигурации - увеличивать при изменениях #endregion #region PRIVATE_VARIABLES -var _config_data: Dictionary # Все данные конфигурации -var _device_constants: Dictionary # Константы устройств -var _base_configs: Dictionary # Базовые конфигурации -var _device_configs: Dictionary # Конфигурации устройств -var _data_indices: Dictionary # Индексы данных -var _fs_keys: Dictionary # Ключи ФС (функциональных систем) -var _temperature_constants: Dictionary # Константы температуры -var _ems_input_bits_config: Dictionary # Конфигурация битов ввода ЭМС -var _fs_rules: Array # Правила ФС +var _config_data: Dictionary ## Все данные конфигурации +var _device_constants: Dictionary ## Константы устройств +var _base_configs: Dictionary ## Базовые конфигурации +var _device_configs: Dictionary ## Конфигурации устройств +var _data_indices: Dictionary ## Индексы данных +var _fs_keys: Dictionary ## Ключи ФС (функциональных систем) +var _temperature_constants: Dictionary ## Константы температуры +var _ems_input_bits_config: Dictionary ## Конфигурация битов ввода ЭМС +var _fs_rules: Array ## Правила ФС -var _is_loaded: bool = false # Флаг успешной загрузки -var _current_version: String = "" # Текущая версия загруженной конфигурации +var _is_loaded: bool = false ## Флаг успешной загрузки +var _current_version: String ## Текущая версия загруженной конфигурации #endregion #region INITIALIZATION @@ -101,27 +101,27 @@ func _load_configuration() -> void: var parse_result = json.parse(json_text) if parse_result == OK: _config_data = json.data - _current_version = _config_data.get("config_version", "0.0.0") + _current_version = _config_data.get('config_version', '0.0.0') _parse_config_data() _is_loaded = true else: - push_error("Ошибка разбора JSON конфигурации: " + json.get_error_message()) + push_error('Ошибка разбора JSON конфигурации: ' + json.get_error_message()) _is_loaded = false else: - push_error("Ошибка загрузки файла конфигурации: " + CONFIG_PATH) + push_error('Ошибка загрузки файла конфигурации: ' + CONFIG_PATH) _is_loaded = false ## Парсит данные конфигурации по секциям func _parse_config_data() -> void: - _device_constants = _convert_numbers(_config_data.get("device_constants", {})) - _base_configs = _convert_numbers(_config_data.get("base_configs", {})) - _device_configs = _convert_numbers(_config_data.get("device_configs", {})) - _data_indices = _convert_numbers(_config_data.get("data_indices", {})) - _fs_keys = _convert_numbers(_config_data.get("fs_keys", {})) - _temperature_constants = _convert_numbers(_config_data.get("temperature_constants", {})) - _ems_input_bits_config = _convert_numbers(_config_data.get("ems_input_bits_config", {})) - _fs_rules = _convert_numbers(_config_data.get("fs_rules", [])) + _device_constants = _convert_numbers(_config_data.get('device_constants', {})) + _base_configs = _convert_numbers(_config_data.get('base_configs', {})) + _device_configs = _convert_numbers(_config_data.get('device_configs', {})) + _data_indices = _convert_numbers(_config_data.get('data_indices', {})) + _fs_keys = _convert_numbers(_config_data.get('fs_keys', {})) + _temperature_constants = _convert_numbers(_config_data.get('temperature_constants', {})) + _ems_input_bits_config = _convert_numbers(_config_data.get('ems_input_bits_config', {})) + _fs_rules = _convert_numbers(_config_data.get('fs_rules', [])) ## Конвертирует числовые значения в правильные типы (float -> int если возможно) @@ -149,7 +149,7 @@ static func _convert_numbers(value): ## Создает папку и копирует дефолтный файл если нужно func _ensure_config_exists() -> bool: # Создаем папку конфигурации если не существует - DirAccess.make_dir_recursive_absolute("user://config") + DirAccess.make_dir_recursive_absolute('user://config') # Проверяем, нужно ли обновить конфигурацию if _should_update_config(): @@ -181,7 +181,7 @@ func _should_update_config() -> bool: var json = JSON.new() if json.parse(json_text) == OK: - var existing_version = json.data.get("config_version", "0.0.0") + var existing_version = json.data.get('config_version', '0.0.0') # Сравниваем версии return _compare_versions(existing_version, CONFIG_VERSION) < 0 else: @@ -194,8 +194,8 @@ func _should_update_config() -> bool: ## Сравнивает две версии (semantic versioning) ## Возвращает -1 если version1 < version2, 0 если равны, 1 если version1 > version2 static func _compare_versions(version1: String, version2: String) -> int: - var v1_parts = version1.split(".") - var v2_parts = version2.split(".") + var v1_parts = version1.split('.') + var v2_parts = version2.split('.') for i in range(max(v1_parts.size(), v2_parts.size())): var v1_part = int(v1_parts[i]) if i < v1_parts.size() else 0 @@ -213,9 +213,8 @@ static func _compare_versions(version1: String, version2: String) -> int: func _update_config() -> bool: # Создаем резервную копию старой конфигурации if FileAccess.file_exists(CONFIG_PATH): - var backup_path = CONFIG_PATH + ".backup_v" + _current_version + var backup_path = CONFIG_PATH + '.backup_v' + _current_version DirAccess.copy_absolute(CONFIG_PATH, backup_path) - print("Создана резервная копия: ", backup_path) # Копируем актуальную конфигурацию return _copy_default_config() @@ -224,13 +223,13 @@ func _update_config() -> bool: ## Копирует дефолтную конфигурацию в user директорию func _copy_default_config() -> bool: if not FileAccess.file_exists(DEFAULT_CONFIG_PATH): - push_error("Дефолтный файл конфигурации не найден: " + DEFAULT_CONFIG_PATH) + push_error('Файл конфигурации не найден: ' + DEFAULT_CONFIG_PATH) return false var src := FileAccess.open(DEFAULT_CONFIG_PATH, FileAccess.READ) var dst := FileAccess.open(CONFIG_PATH, FileAccess.WRITE) if src == null or dst == null: - push_error("Ошибка копирования конфигурации") + push_error('Ошибка копирования конфигурации') return false dst.store_string(src.get_as_text())