Рефактор.

This commit is contained in:
sasha80
2023-08-17 13:43:38 +03:00
parent 17e5efedbc
commit 09e485acf2
14 changed files with 122 additions and 121 deletions

View File

@@ -11,7 +11,7 @@ config_version=5
[application]
config/name="uarep-ctl"
run/main_scene="res://scenes/tab_switch.tscn"
run/main_scene="res://scenes/tab-switch.tscn"
config/features=PackedStringArray("4.1")
run/low_processor_mode=true
run/delta_smoothing=false

View File

@@ -1,7 +1,7 @@
[gd_scene load_steps=9 format=3 uid="uid://da7w3vkhadfwe"]
[ext_resource type="Script" path="res://scenes/nine-patch-button.gd" id="1_mjhcv"]
[ext_resource type="Texture2D" uid="uid://ct0ajcwno03h7" path="res://data/кнопка-квадрат-0.png" id="2_fosdr"]
[ext_resource type="Script" path="res://scenes/nine-patch-button.gd" id="1_uqldr"]
[ext_resource type="Texture2D" uid="uid://ct0ajcwno03h7" path="res://data/кнопка-квадрат-0.png" id="2_0loew"]
[sub_resource type="StyleBoxEmpty" id="1"]
@@ -19,13 +19,13 @@
offset_right = 30.0
offset_bottom = 30.0
theme_override_styles/panel = SubResource("1")
script = ExtResource("1_mjhcv")
script = ExtResource("1_uqldr")
toggle_mode = true
[node name="state" type="NinePatchRect" parent="."]
show_behind_parent = true
layout_mode = 2
texture = ExtResource("2_fosdr")
texture = ExtResource("2_0loew")
patch_margin_left = 10
patch_margin_top = 10
patch_margin_right = 10

View File

@@ -8,7 +8,7 @@
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2bft1"]
size = Vector2(1600, 1200)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_dklk6"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_24d36"]
resource_local_to_scene = true
shader = ExtResource("4_gb4a1")
shader_parameter/color = Color(1, 1, 1, 0.168627)
@@ -26,6 +26,6 @@ centered = false
script = ExtResource("2_vkwmy")
[node name="строб" parent="." instance=ExtResource("3_uhdvc")]
material = SubResource("ShaderMaterial_dklk6")
material = SubResource("ShaderMaterial_24d36")
position = Vector2(560, 560)
scale = Vector2(1100, 1100)

View File

@@ -3,13 +3,3 @@ extends Control
@export var text: String = '':
set(val): $label.set_text(val)
get: return $label.get_text()
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
pass

77
scenes/scrl-threats.gd Normal file
View File

@@ -0,0 +1,77 @@
extends ScrollContainer
## Отображение списка целей в таблицу.
const CellLineEdit = preload('res://scenes/ячейка-2.tscn') ## Ячейка таблицы.
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader ] ## Описание ряда заголовка.
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit ] ## Описание ряда.
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto' ] ## Параметры цели отображаемые в таблице.
const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Частота, МГц', 'Протокол' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 50, 140, 140, 100 ] ## Ширины колонок.
func on_row_pressed(i_row: int):
var selected = $tbl_threats.is_row_selected(i_row)
$tbl_threats.set_row_selected(i_row, not selected)
func init_table():
$tbl_threats.set_header(TABLE_HEADER)
$tbl_threats.set_header_text(TABLE_HEADERS_TEXT)
$tbl_threats.set_columns_min_size(TABLE_COLUMN_SIZE)
$tbl_threats.pin_header(self, get_parent())
$tbl_threats.connect('row_pressed', Callable(self, 'on_row_pressed'))
func _ready() -> void:
var th_table_id: = Dictionary()
Threats.connect('threat_new', Callable(self, 'on_threat_new').bind(th_table_id))
Threats.connect('threat_lost', Callable(self, 'on_threat_lost').bind(th_table_id))
Threats.connect('threat_update', Callable(self, 'on_threat_update').bind(th_table_id))
call_deferred('init_table')
## Перестраивает индекс таблицы
func rehash(th_table_id: Dictionary):
var rows_count = $tbl_threats.get_rows_count()
for i_row in rows_count:
var item = $tbl_threats.get_node2(0, i_row)
th_table_id[int(item.text)] = i_row
## Обрабатывает сигнал [b]threat_update[/b]
func on_threat_update(_threats, th, th_table_id: Dictionary):
var row = map_th_to_row(th)
var i_row = th_table_id[th.id]
$tbl_threats.set_row_text(i_row, row)
## Обрабатывает сигнал [b]threat_lost[/b]
func on_threat_lost(_threats, th, th_table_id: Dictionary):
$tbl_threats.remove_row(th_table_id[th.id])
th_table_id.clear()
rehash(th_table_id)
## Обрабатывает сигнал [b]threat_new[/b]
func on_threat_new(_threats, th, th_table_id):
var i_row = $tbl_threats.get_rows_count()
$tbl_threats.add_row(TABLE_ROW)
var row = map_th_to_row(th)
$tbl_threats.set_row_text(i_row, row)
th_table_id[th.id] = i_row
## Преобразует цель в строку таблицы
func map_th_to_row(th) -> Array:
var row: = Array()
row.resize(TABLE_COLUMN_PARAM.size())
var i_col: int = 0
for param_name in TABLE_COLUMN_PARAM:
row[i_col] = '%s' % th.get(param_name)
i_col += 1
return row

View File

@@ -1,61 +0,0 @@
extends ScrollContainer
const CellLineEdit = preload('res://scenes/ячейка-2.tscn')
const TableHeader = preload('res://table/header.tscn')
const TableNode = preload('res://table/node.tscn')
const TABLE_ROW = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit]
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto'] ## Параметры цели отображаемые в таблице.
const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Частота, МГц', 'Протокол'] ##
func on_row_pressed(i_row: int):
var selected = $tbl_threats.is_row_selected(i_row)
$tbl_threats.set_row_selected(i_row, not selected)
func init_table():
$tbl_threats.set_header([TableHeader, TableHeader, TableHeader, TableHeader])
$tbl_threats.set_header_text(TABLE_HEADERS_TEXT)
$tbl_threats.set_columns_min_size([50, 140, 140, 100])
$tbl_threats.pin_header(self, get_parent())
$tbl_threats.connect('row_pressed', Callable(self, 'on_row_pressed'))
func _ready() -> void:
var th_table_id: = Dictionary()
Threats.connect('threat_new', Callable(self, 'on_threat_new').bind(th_table_id))
Threats.connect('threat_lost', Callable(self, 'on_threat_lost').bind(th_table_id))
call_deferred('init_table')
func rehash(th_table_id: Dictionary):
var rows_count = $tbl_threats.get_rows_count()
for i_row in rows_count:
var item = $tbl_threats.get_node2(0, i_row)
th_table_id[int(item.text)] = i_row
func on_threat_lost(_threats, th, th_table_id: Dictionary):
$tbl_threats.remove_row(th_table_id[th.id])
th_table_id.clear()
rehash(th_table_id)
func on_threat_new(_threats, th, th_table_id):
var i_row = $tbl_threats.get_rows_count()
$tbl_threats.add_row(TABLE_ROW)
var row = map_th_to_row(th)
$tbl_threats.set_row_text(i_row, row)
th_table_id[th.id] = i_row
func map_th_to_row(th):
var row: = Array()
row.resize(TABLE_COLUMN_PARAM.size())
var i_col: int = 0
for param_name in TABLE_COLUMN_PARAM:
row[i_col] = '%s' % th.get(param_name)
i_col += 1
return row

View File

@@ -1,29 +1,28 @@
[gd_scene load_steps=6 format=3 uid="uid://3slb0i3pvowc"]
[ext_resource type="Script" path="res://scenes/tab_switch.gd" id="1_wyyi7"]
[ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа.tscn" id="2_r1u0h"]
[ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль.tscn" id="3_dmb4a"]
[ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал.tscn" id="4_pp7si"]
[ext_resource type="PackedScene" uid="uid://dab6loryocc73" path="res://scenes/ЭМС.tscn" id="5_kbxv3"]
[ext_resource type="Script" path="res://scenes/tab-switch.gd" id="1_qroqt"]
[ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа.tscn" id="2_pdbvn"]
[ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль.tscn" id="3_2apbp"]
[ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал.tscn" id="4_yq6c0"]
[ext_resource type="PackedScene" uid="uid://dab6loryocc73" path="res://scenes/ЭМС.tscn" id="5_tlyql"]
[node name="tab_switch" type="TabContainer"]
offset_right = 1600.0
offset_bottom = 1200.0
script = ExtResource("1_wyyi7")
script = ExtResource("1_qroqt")
[node name="работа" parent="." instance=ExtResource("2_r1u0h")]
[node name="работа" parent="." instance=ExtResource("2_pdbvn")]
layout_mode = 2
[node name="контроль" parent="." instance=ExtResource("3_2apbp")]
visible = false
layout_mode = 2
[node name="контроль" parent="." instance=ExtResource("3_dmb4a")]
[node name="журнал" parent="." instance=ExtResource("4_yq6c0")]
visible = false
layout_mode = 2
[node name="журнал" parent="." instance=ExtResource("4_pp7si")]
visible = false
layout_mode = 2
[node name="ЭМС" parent="." instance=ExtResource("5_kbxv3")]
[node name="ЭМС" parent="." instance=ExtResource("5_tlyql")]
visible = false
layout_mode = 2

View File

@@ -1,7 +1,7 @@
[gd_scene load_steps=9 format=3 uid="uid://dab6loryocc73"]
[ext_resource type="Script" path="res://scenes/ЭМС.gd" id="1_7ip0t"]
[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button_flat.tscn" id="2_85cl8"]
[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button-flat.tscn" id="2_85cl8"]
[ext_resource type="Texture2D" uid="uid://dd60btbqnpiqw" path="res://data/document-new-0.png" id="3_mtj4x"]
[ext_resource type="Texture2D" uid="uid://coqg6wsftvtxr" path="res://data/document-save-0.png" id="4_m4ucm"]
[ext_resource type="Texture2D" uid="uid://cywuevvpkxl7v" path="res://data/edit-copy-0.png" id="5_eeb4o"]

View File

@@ -4,9 +4,9 @@
[ext_resource type="PackedScene" uid="uid://nl1vklubr5kr" path="res://scenes/bip.tscn" id="2_ijbv2"]
[ext_resource type="PackedScene" uid="uid://b5kjdyxuwsot5" path="res://scenes/canvas.tscn" id="3_fppu7"]
[ext_resource type="PackedScene" uid="uid://bq7haw1ypiv48" path="res://scenes/frame.tscn" id="4_35qoc"]
[ext_resource type="Script" path="res://scenes/scrl_threats.gd" id="5_j58w3"]
[ext_resource type="Script" path="res://scenes/scrl-threats.gd" id="5_tr3hj"]
[ext_resource type="Script" path="res://table/table.gd" id="6_fpdpm"]
[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button_flat.tscn" id="7_2sxkw"]
[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button-flat.tscn" id="7_2sxkw"]
[ext_resource type="FontFile" uid="uid://befva8r034a4v" path="res://data/DSEG7Classic-Regular.ttf" id="8_68ssn"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5ugj8"]
@@ -203,7 +203,7 @@ offset_top = 57.0
offset_right = 464.0
offset_bottom = 306.0
horizontal_scroll_mode = 0
script = ExtResource("5_j58w3")
script = ExtResource("5_tr3hj")
[node name="tbl_threats" type="GridContainer" parent="frm_threats/scrl_threats"]
layout_mode = 2
@@ -701,7 +701,3 @@ offset_top = 50.0
offset_right = 83.0
offset_bottom = 72.0
text = "Опасных:"
[connection signal="drag_begin" from="." to="." method="_on_drag_begin"]
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
[connection signal="full_screen" from="." to="." method="_on_full_screen" flags=3]

View File

@@ -1,6 +1,6 @@
extends Node
##
## Работа с целями
## Цель
@@ -12,6 +12,7 @@ class Threat:
var fflags: Dictionary ## Флаги достоверности полей.
var freq: float ## Частота несущей или центральная частота, МГц.
var freqm: String ## Режим смены частоты.
var id: int ## Идентификатор цели.
var lat: float ## Текущие координаты, долгота в градусах.
var lon: float ## Текущие координаты, широта в градусах.
var power: float ## Уровень принимаемого сигнала, дБм.
@@ -24,7 +25,6 @@ class Threat:
var tick: int ## Тик время приёма сигнала, мс.
var tmod: String ## Тип модуляции.
var width: float ## Ширина занимаемого диапазона частот, МГц.
var id: int ## Идентификатор цели.
func _init(): Tools.get_members_names(self).any(func(vn): fflags[vn] = false)
func _to_string() -> String: return 'номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq]
@@ -53,7 +53,7 @@ func _ready() -> void:
timer_check_lost.start(REPSettings.ThreatParams.time_lost / 1000.0)
## Периодически проверяет приборы на связи
## Периодически удаляет устаревшие цели
func on_timer_check_lost(time_lost: int):
var tick = Time.get_ticks_msec()
for th in threats.values():
@@ -64,7 +64,7 @@ func on_timer_check_lost(time_lost: int):
## Производит приём целей
func on_data_capsrpb_received(unit: capsrpb.CapsRpb):
if 'mis' not in unit.json_dic:
if not unit.json_dic.has('mis'):
return
var mis = unit.json_dic['mis']
for dic_th in mis:

View File

@@ -73,10 +73,11 @@ func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
## Возвращает true, если точка внутри заданного полигона
func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
assert(len(p))
var j: int = len(p) - 1
var sz: = p.size()
assert(sz)
var j: int = sz - 1
var odd_nodes: int = 0
for i in len(p):
for i in sz:
if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)):
odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x))
j = i
@@ -85,6 +86,6 @@ func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
## Записывает слово [param val] в элемент байтовго массива [param buf]
## расположенный по индексу [param index]. Младшее слово
func set_wordi(buf: Array, index: int, val: int) -> void:
func set_wordi(buf: PackedByteArray, index: int, val: int) -> void:
buf[index] = val & 0xff
buf[index + 1] = (val >> 8) & 0xff

View File

@@ -28,7 +28,7 @@ var nodes: = {} ## Все ячейки таблицы и до
var ScnNode: PackedScene ## Прототип ячейки таблицы
var ScnSelector: PackedScene ## Прототип индикатора выбранного ряда
var selector_color_proc: Callable ## Ссылка на процедуру генератора цвета индикатора выбранного ряда
var selector_size_proc: Callable ## Ссылка на процедуру генератора размера индикатора выбранного ряда
var selector_size_proc: Callable ## Ссылка на процедуру генератора размера индикатора выбранного ряда
signal row_pressed(i_row: int) ## Вызывается при нажатии кнопкой мыши на строку
signal selected_changed(i_row: int) ## Вызывается при изменении выбранного ряда. i_row - текущий выбранный ряд
@@ -48,7 +48,6 @@ func set_node_user_data(i_col: int, i_row: int, val) -> void: set_node_meta(i_co
func pin_header(scrl: ScrollContainer, prnt: Control):
scrl.remove_child(header)
prnt.add_child(header)
## TODO: Это значение следует получить из темы
var v_separation = get_theme_constant('v_separation')
header.position = scrl.position - Vector2(0, header.size.y + v_separation)
scroll = scrl
@@ -129,14 +128,14 @@ func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)):
position.y = hdr.position.y + hdr.size.y + gap.y
## [param i_col] - индекс колонки. [param i_row] - индекс ряда.
## [param i_col] - Индекс колонки. [param i_row] - Индекс ряда.
func set_node_meta(i_col: int, i_row: int, pname: String, val) -> void:
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
var node = nodes[key]
node.set_meta(pname, val)
## [param i_col] - индекс колонки. [param i_row] - индекс ряда.
## [param i_col] - Индекс колонки. [param i_row] - Индекс ряда.
func get_node_meta(i_col: int, i_row: int, pname: String):
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
var node = nodes[key]
@@ -144,21 +143,21 @@ func get_node_meta(i_col: int, i_row: int, pname: String):
return node.get_meta(pname)
## [param i_col] - индекс колонки. [param i_row] - индекс ряда.
## [param i_col] - Индекс колонки. [param i_row] - Индекс ряда.
func set_node_property(i_col: int, i_row: int, pname: String, val) -> void:
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
var node = nodes[key]
node.set(pname, val)
## [param i_col] - индекс колонки. [param i_row] - индекс ряда.
## [param i_col] - Индекс колонки. [param i_row] - Индекс ряда.
func get_node_property(i_col: int, i_row: int, pname: String):
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
var node = nodes[key]
return node.get(pname)
## [param i_col] - индекс колонки. [param i_row] - индекс ряда
## [param i_col] - Индекс колонки. [param i_row] - Индекс ряда
func get_node_key(format: String, i_col: int, i_row: int) -> String:
var key: String = format % [i_row, i_col]
assert(nodes.has(key), 'ошибка: нет такой ячейки - колонка:%d ряд:%d' % [i_col, i_row])
@@ -303,13 +302,13 @@ func get_rows_count() -> int:
return nodes_count / columns
##
## [param i_col] - Индекс колонки. [param i_row] - Индекс ряда.
func get_node2(i_col: int, i_row: int) -> Node:
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
return nodes[key]
##
## Добавляет ряд. [param row_types] - Массив типов ячеек ряда
func add_row(row_types: Array) -> void:
assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1))
if columns == 1:
@@ -323,7 +322,7 @@ func add_row(row_types: Array) -> void:
var node = node_type.instantiate()
assert(node.name == node.name, 'ошибка: экземпляр не имеет поля \"name\"')
var head = nodes[HEAD_KEY_FORMAT % [0, i_col]]
node.custom_minimum_size.x = head.custom_minimum_size.x
node.set_deferred('custom_minimum_size.x', head.custom_minimum_size.x)
node.set_deferred('size.x', head.size.x)
var node_key: String = NODE_KEY_FORMAT % [i_row, i_col]
node.name = node_key
@@ -380,7 +379,7 @@ func set_header_text(headers: Array):
set_row_text(0, headers, 0, HEAD_KEY_FORMAT)
##
## [param i_row] - индекс ряда.
func remove_row(i_row: int):
var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0]
@@ -485,7 +484,7 @@ func set_rows_text(rows: Array) -> void:
node.text = rows[i_row][i_col]
##
## [param i_row] - индекс ряда.
func set_nodes_min_size(i_row: int, sizes: Array, key_format: String = NODE_KEY_FORMAT) -> void:
for i_col in columns:
var key: = get_node_key(key_format, i_col, i_row)
@@ -494,7 +493,7 @@ func set_nodes_min_size(i_row: int, sizes: Array, key_format: String = NODE_KEY_
node.set_deferred('size.x', sizes[i_col])
##
## [param i_col] - индекс колонки. [param i_row] - индекс ряда.
func set_node_text(i_col: int, i_row: int, val: String) -> void:
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
nodes[key].text = val
@@ -508,7 +507,7 @@ func set_rows_state(rows: Array) -> void:
nodes[key].button_pressed = rows[i_row][i_col]
##
## [param i_col] - индекс колонки. [param i_row] - индекс ряда.
func set_node_state(i_col: int, i_row: int, val: bool) -> void:
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
nodes[key].button_pressed = val