From f407578a4477bbb746eb3530c1dc23040df4ae82 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 5 Apr 2026 16:36:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B5=D1=81=D1=81=20=D0=B1=D0=B0=D1=80=D0=BE=D0=B2=20=D0=B2=20?= =?UTF-8?q?=D0=90=D0=A4=D0=A1=D0=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-afsp/pribor-afsp.gd | 26 +++++++-------- scenes/контроль/node-maper.gd | 53 +++++++++++++++++++++++++++++-- 2 files changed, 64 insertions(+), 15 deletions(-) diff --git a/scenes/pribor-afsp/pribor-afsp.gd b/scenes/pribor-afsp/pribor-afsp.gd index ae0e565a..7fca921d 100644 --- a/scenes/pribor-afsp/pribor-afsp.gd +++ b/scenes/pribor-afsp/pribor-afsp.gd @@ -68,28 +68,28 @@ func _on_response_received(response: String, success: bool) -> void: func _update_ui(json_data: Dictionary) -> void: # Конвертер for child in $bort.get_node('konverter/grid').get_children(): - node_maper.map_value_to_item(json_data, child, 'value0') - node_maper.map_value_to_item(json_data, child, 'value1') - node_maper.map_value_to_item(json_data, child, 'value2') - node_maper.map_error_codes_to_item(json_data, child, 'state', 0) + node_maper.map_value_to_item_animated(json_data, child, 'value0') + node_maper.map_value_to_item_animated(json_data, child, 'value1') + node_maper.map_value_to_item_animated(json_data, child, 'value2') + node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0) # Антенна 1 for child in $bort.get_node('antenna1/grid').get_children(): - node_maper.map_value_to_item(json_data, child, 'value0') - node_maper.map_value_to_item(json_data, child, 'value1') - node_maper.map_error_codes_to_item(json_data, child, 'state', 0) + node_maper.map_value_to_item_animated(json_data, child, 'value0') + node_maper.map_value_to_item_animated(json_data, child, 'value1') + node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0) # Антенна 2 for child in $bort.get_node('antenna2/grid').get_children(): - node_maper.map_value_to_item(json_data, child, 'value0') - node_maper.map_value_to_item(json_data, child, 'value1') - node_maper.map_error_codes_to_item(json_data, child, 'state', 0) + node_maper.map_value_to_item_animated(json_data, child, 'value0') + node_maper.map_value_to_item_animated(json_data, child, 'value1') + node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0) # Остальные элементы for child in $bort.get_children(): - node_maper.map_value_to_item(json_data, child, 'value0') - node_maper.map_value_to_item(json_data, child, 'value1') - node_maper.map_error_codes_to_item(json_data, child, 'state', 0) + node_maper.map_value_to_item_animated(json_data, child, 'value0') + node_maper.map_value_to_item_animated(json_data, child, 'value1') + node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0) # Сброс всех UI элементов в 0 (при отсутствии данных) diff --git a/scenes/контроль/node-maper.gd b/scenes/контроль/node-maper.gd index b42f1890..5394f24b 100644 --- a/scenes/контроль/node-maper.gd +++ b/scenes/контроль/node-maper.gd @@ -1,6 +1,5 @@ extends Node - static func map_value_to_item(data, item, value_name: StringName): var meta = item.get_meta(value_name, '') if meta == '': @@ -17,7 +16,6 @@ static func map_value_to_item(data, item, value_name: StringName): else: push_error('не найден путь %s (%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text]) - static func map_error_codes_to_item(data, item, value_name: StringName, value_init: int): var metas = item.get_meta(value_name, '') if not (metas is Array): @@ -38,3 +36,54 @@ static func map_error_codes_to_item(data, item, value_name: StringName, value_in item.set(value_name, test_res) else: item.set(value_name, value_init) + +# Плавное обновление с анимацией +static func map_value_to_item_animated(data, item, value_name: StringName): + var meta = item.get_meta(value_name, '') + if meta == '' or not (meta is String): + return + + var paths: = Array() + tools.map_solid_to_array(meta, paths) + var ret_val: = [null, false, 0] + tools.get_value_by_path(data, paths, ret_val) + + if ret_val[1]: + _animate_property(item, value_name, ret_val[0]) + else: + push_error('не найден путь для $%s.%s' % [item.name, value_name]) + +static func map_error_codes_to_item_animated(data, item, value_name: StringName, value_init: int): + var metas = item.get_meta(value_name, '') + if not (metas is Array): + return + + var paths: = Array() + var values: = Array() + for meta in metas: + tools.map_solid_to_array(meta, paths) + var ret_val: = [null, false, 0] + tools.get_value_by_path(data, paths, ret_val) + if ret_val[1]: + values.append(ret_val[0]) + else: + push_error('не найден путь для $%s.%s' % [item.name, value_name]) + + var target_value: int + if values.size() == metas.size(): + target_value = 1 if values.count(true) == values.size() else 2 + else: + target_value = value_init + + _animate_property(item, value_name, target_value) + +static func _animate_property(item, property: StringName, target_value): + var current = item.get(property) + if current == target_value: + return + + # Исправление: преобразуем StringName в String для NodePath + var tween = item.create_tween() + tween.set_trans(Tween.TRANS_QUINT) + tween.set_ease(Tween.EASE_OUT) + tween.tween_property(item, NodePath(String(property)), target_value, 0.3)