Разработка. На вкладке ЭМС добавлены таблицы входов и выходов.
This commit is contained in:
BIN
data/кнопка-эмс-0.png
Normal file
BIN
data/кнопка-эмс-0.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 574 B |
34
data/кнопка-эмс-0.png.import
Normal file
34
data/кнопка-эмс-0.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bvxv33noium2h"
|
||||
path="res://.godot/imported/кнопка-эмс-0.png-55c9c814b93a55a54b5133cafc1cc584.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/кнопка-эмс-0.png"
|
||||
dest_files=["res://.godot/imported/кнопка-эмс-0.png-55c9c814b93a55a54b5133cafc1cc584.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/кнопка-эмс-1.png
Normal file
BIN
data/кнопка-эмс-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 509 B |
34
data/кнопка-эмс-1.png.import
Normal file
34
data/кнопка-эмс-1.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://nfpish471rjj"
|
||||
path="res://.godot/imported/кнопка-эмс-1.png-5000e69bb949ac3e094bd419f59b8ee8.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/кнопка-эмс-1.png"
|
||||
dest_files=["res://.godot/imported/кнопка-эмс-1.png-5000e69bb949ac3e094bd419f59b8ee8.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/эмс-бланк-замыкание.png
Normal file
BIN
data/эмс-бланк-замыкание.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 989 B |
34
data/эмс-бланк-замыкание.png.import
Normal file
34
data/эмс-бланк-замыкание.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dvl3sq036gn75"
|
||||
path="res://.godot/imported/эмс-бланк-замыкание.png-4318b52796ef34b4e1884210148903b1.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/эмс-бланк-замыкание.png"
|
||||
dest_files=["res://.godot/imported/эмс-бланк-замыкание.png-4318b52796ef34b4e1884210148903b1.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/эмс-бланк-перем.png
Normal file
BIN
data/эмс-бланк-перем.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 704 B |
34
data/эмс-бланк-перем.png.import
Normal file
34
data/эмс-бланк-перем.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://pfoscstbm025"
|
||||
path="res://.godot/imported/эмс-бланк-перем.png-46e3d2ae09c41e17eda0c5c975f3d6f1.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/эмс-бланк-перем.png"
|
||||
dest_files=["res://.godot/imported/эмс-бланк-перем.png-46e3d2ae09c41e17eda0c5c975f3d6f1.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/эмс-бланк-пост.png
Normal file
BIN
data/эмс-бланк-пост.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 483 B |
34
data/эмс-бланк-пост.png.import
Normal file
34
data/эмс-бланк-пост.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bwddxs24es81u"
|
||||
path="res://.godot/imported/эмс-бланк-пост.png-26bac763879d76be257d6217d43b0164.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/эмс-бланк-пост.png"
|
||||
dest_files=["res://.godot/imported/эмс-бланк-пост.png-26bac763879d76be257d6217d43b0164.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
data/эмс-бланк.png
Normal file
BIN
data/эмс-бланк.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 787 B |
34
data/эмс-бланк.png.import
Normal file
34
data/эмс-бланк.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://belwchvdktrw0"
|
||||
path="res://.godot/imported/эмс-бланк.png-da5900abaf207dcfac692be656729ba5.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/эмс-бланк.png"
|
||||
dest_files=["res://.godot/imported/эмс-бланк.png-da5900abaf207dcfac692be656729ba5.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
@@ -29,6 +29,7 @@ Log="*res://addons/godot-logger/scripts/logger.gd"
|
||||
Table="*res://table/table.gd"
|
||||
Bip="*res://scenes/bip.tscn"
|
||||
Threats="*res://scripts/threats.gd"
|
||||
YemsDevs="*res://scripts/yems_devs.gd"
|
||||
|
||||
[debug]
|
||||
|
||||
@@ -38,7 +39,6 @@ file_logging/enable_file_logging=true
|
||||
|
||||
window/size/viewport_width=1600
|
||||
window/size/viewport_height=1200
|
||||
window/size/mode=3
|
||||
window/subwindows/embed_subwindows=false
|
||||
window/stretch/mode="viewport"
|
||||
window/vsync/vsync_mode=false
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
[gd_scene format=2]
|
||||
[gd_scene format=3 uid="uid://bnfmccbgrffps"]
|
||||
|
||||
[node name="Label" type="Label"]
|
||||
margin_right = 122.0
|
||||
margin_bottom = 34.0
|
||||
custom_colors/font_color = Color( 1, 0.596078, 0.4, 1 )
|
||||
valign = 1
|
||||
clip_text = true
|
||||
|
||||
@@ -4,28 +4,28 @@ extends PanelContainer
|
||||
|
||||
|
||||
@export var texture_state0: Texture2D = preload('res://data/кнопка-квадрат-0.png'):
|
||||
set(val): $state.set_texture(val)
|
||||
set(val): $state.set_texture(val)
|
||||
|
||||
|
||||
@export var texture_state1: Texture2D = preload('res://data/кнопка-квадрат-1.png'):
|
||||
set(val): $state.set_texture(val)
|
||||
set(val): $state.set_texture(val)
|
||||
|
||||
|
||||
@export var text: String = '':
|
||||
set(val): $button.set_text(val)
|
||||
get: return $button.get_text()
|
||||
set(val): $button.set_text(val)
|
||||
get: return $button.get_text()
|
||||
|
||||
|
||||
@export var pressed: bool = false:
|
||||
set(val): $button.set_pressed(val)
|
||||
get: return $button.is_pressed()
|
||||
set(val): $button.set_pressed(val)
|
||||
get: return $button.is_pressed()
|
||||
|
||||
|
||||
@export var toggle_mode: bool = false:
|
||||
set(val):
|
||||
if is_inside_tree():
|
||||
$button.set_toggle_mode(val)
|
||||
get: return $button.is_toggle_mode()
|
||||
set(val):
|
||||
if is_inside_tree():
|
||||
$button.set_toggle_mode(val)
|
||||
get: return $button.is_toggle_mode()
|
||||
|
||||
|
||||
func set_text (val: String): $button.set_text(val)
|
||||
@@ -33,8 +33,8 @@ func set_pressed (val: bool): $button.set_pressed(val)
|
||||
|
||||
|
||||
func set_toggle_mode (val: bool):
|
||||
if is_inside_tree():
|
||||
$button.set_toggle_mode(val)
|
||||
if is_inside_tree():
|
||||
$button.set_toggle_mode(val)
|
||||
|
||||
|
||||
func get_text(): return $button.get_text()
|
||||
@@ -43,9 +43,9 @@ func is_toggle_mode(): return $button.is_toggle_mode()
|
||||
|
||||
|
||||
func _on_button_toggled(val: bool):
|
||||
if val: $state.set_texture(texture_state1)
|
||||
else: $state.set_texture(texture_state0)
|
||||
if val: $state.set_texture(texture_state1)
|
||||
else: $state.set_texture(texture_state0)
|
||||
|
||||
|
||||
func button_connect(button_signal: String, proc: Callable):
|
||||
$button.connect(button_signal, proc)
|
||||
$button.connect(button_signal, proc)
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://3slb0i3pvowc"]
|
||||
[gd_scene load_steps=5 format=3 uid="uid://3slb0i3pvowc"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа.tscn" id="1_uow82"]
|
||||
[ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль.tscn" id="2_83m7a"]
|
||||
[ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал.tscn" id="3_hgnup"]
|
||||
[ext_resource type="PackedScene" uid="uid://c6uls7q4e2m4h" path="res://scenes/ЭМС.tscn" id="4_2bmbm"]
|
||||
|
||||
[node name="tab_switch" type="TabContainer"]
|
||||
offset_right = 1600.0
|
||||
@@ -18,3 +19,7 @@ layout_mode = 2
|
||||
[node name="журнал" parent="." instance=ExtResource("3_hgnup")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ЭМС" parent="." instance=ExtResource("4_2bmbm")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
101
scenes/ЭМС.gd
Normal file
101
scenes/ЭМС.gd
Normal file
@@ -0,0 +1,101 @@
|
||||
extends Panel
|
||||
|
||||
var TableHeader = preload('res://table/header.tscn')
|
||||
var TableNode = preload('res://scenes/ячейка-1.tscn')
|
||||
var CellYemsButton = preload('res://scenes/кнопка-эмс.tscn')
|
||||
var CellLineEdit = preload('res://scenes/ячейка-2.tscn')
|
||||
var CellState = preload('res://scenes/состояния-эмс.tscn')
|
||||
|
||||
var g_in_devices : Dictionary # Словарь с входными устройствами КЭМС
|
||||
var g_out_devices : Dictionary # Словарь с выходными устройствами КЭМС
|
||||
|
||||
# Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС
|
||||
const INPUT_ROWS = [
|
||||
[1,['НРЛС МР-231S, УИЗП', 'X31', '0', '0']],
|
||||
[2,['НРЛС МР-231S, Строб ЭМС', 'X32', '0', '0']],
|
||||
[3,['НРЛС МР-231-3, УИЗП', 'X34', '0', '0']],
|
||||
[4,['НРЛС МР-231-3, Строб ЭМС', 'X35', '0', '0']],
|
||||
[5,['ЦИСВС-1010, УИЗП', 'X43', '0', '0']],
|
||||
[6,['4302-01, 4302-04, УИЗП', 'X46', '0', '0']]]
|
||||
|
||||
# Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС
|
||||
const OUTPUT_ROWS = [
|
||||
[41,['НРЛС МР-231S, БИ', 'X61', '0', '0']],
|
||||
[42,['НРЛС МР-231S', 'X62', '0', '0']],
|
||||
[43,['НРЛС МР-231-3, БИ', 'X64', '0', '0']],
|
||||
[44,['НРЛС МР-231-3', 'X65', '0', '0']],
|
||||
[45,['ЦИСВС-1010, БИ', 'X63', '0', '0']],
|
||||
[46,['4302-01, 4302-04, БИ', 'X66', '0', '0']],
|
||||
[48,['НРЛС 11111111', 'X69', '0', '0']],
|
||||
[49,['НРЛС-222222, БИ', 'X62', '0', '0']]]
|
||||
|
||||
func _ready() -> void:
|
||||
var posx: int = 30
|
||||
var posy: int = 30
|
||||
$tbl_in.set_position(Vector2(posx,posy))
|
||||
$tbl_out.set_position(Vector2(posx,len(INPUT_ROWS)*35+posy+10))
|
||||
$lbl_online.set_position(Vector2(posx,posy-25))
|
||||
init_tbl_out()
|
||||
init_tbl_in()
|
||||
$tbl_in.connect('row_pressed', Callable(self, 'on_row_pressed'))
|
||||
|
||||
|
||||
func on_row_pressed(i_row: int):
|
||||
$tbl_in.set_row_selected(i_row, false)
|
||||
|
||||
|
||||
func init_tbl_out():
|
||||
$tbl_out.set_header([TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader])
|
||||
$tbl_out.set_header_text(['Выходы', 'Разъём', 'мкс', 'мкс', 'Состояние', 'Частота, Мгц', 'Режим'])
|
||||
for item in OUTPUT_ROWS:
|
||||
$tbl_out.add_row([TableNode, TableNode, CellLineEdit, CellLineEdit, CellState, CellLineEdit, CellLineEdit])
|
||||
var row_index : int = $tbl_out.get_rows_count() - 1
|
||||
var params : Array = item[1]
|
||||
var out_dev = YemsDevs.OutDev.new(item[0], params, row_index)
|
||||
g_out_devices[item[0]] = out_dev
|
||||
for i in range(len(params)):
|
||||
var node = $tbl_out.get_node2(i, row_index)
|
||||
node.text = params[i]
|
||||
$tbl_out.set_columns_min_size([270, 100, 70, 70, 100, 100, 100])
|
||||
|
||||
|
||||
func init_tbl_in():
|
||||
var header_type: Array = [TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader]
|
||||
var header_text: Array = ['Входы', 'Разъём', 'мкс', 'мкс', 'Состояние', 'Частота, Мгц',' ']
|
||||
var row_type: Array = [TableNode, TableNode, CellLineEdit, CellLineEdit, CellState, CellLineEdit, TableNode]
|
||||
var yams_alligment_in: Array = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
|
||||
var column_size: Array = [270, 100, 70, 70, 100, 100, 100]
|
||||
var dot_collums: Array
|
||||
var column_offset: int = 7
|
||||
for i in range(len(OUTPUT_ROWS)):
|
||||
header_type.append(TableHeader)
|
||||
header_text.append('...')
|
||||
row_type.append(CellYemsButton)
|
||||
yams_alligment_in.append(HORIZONTAL_ALIGNMENT_LEFT)
|
||||
column_size.append(25)
|
||||
dot_collums.append(column_offset+i)
|
||||
$tbl_in.set_header(header_type)
|
||||
$tbl_in.set_header_text(header_text)
|
||||
$tbl_in.set_columns_alignments(yams_alligment_in)
|
||||
for item in INPUT_ROWS:
|
||||
$tbl_in.add_row(row_type)
|
||||
var row_index : int = $tbl_in.get_rows_count() - 1
|
||||
var params : Array = item[1]
|
||||
var in_dev: YemsDevs.InDev = YemsDevs.InDev.new(item[0], params, row_index)
|
||||
g_in_devices[item[0]] = in_dev
|
||||
for i in range(len(params)):
|
||||
var node = $tbl_in.get_node2(i, row_index)
|
||||
node.text = params[i]
|
||||
for i_col in dot_collums:
|
||||
var btn = $tbl_in.get_node2(i_col, row_index)
|
||||
var out_dev = g_out_devices[OUTPUT_ROWS[i_col-column_offset][0]]
|
||||
in_dev.out_dots = [btn, out_dev]
|
||||
btn.button_connect('pressed', Callable(self, 'on_dot_button').bind(i_col, row_index))
|
||||
|
||||
$tbl_in.set_columns_min_size(column_size)
|
||||
|
||||
|
||||
func on_dot_button(i: int, j: int):
|
||||
""" Вызывается при нажатии на кнопку-точку (соединение)
|
||||
i - индекс входа, j - индекс выхода """
|
||||
print('on_dot_button(%d, %d)' % [i, j])
|
||||
34
scenes/ЭМС.tscn
Normal file
34
scenes/ЭМС.tscn
Normal file
@@ -0,0 +1,34 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://c6uls7q4e2m4h"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/ЭМС.gd" id="1_t1s35"]
|
||||
[ext_resource type="Script" path="res://table/table.gd" id="2_6x8yw"]
|
||||
|
||||
[node name="ЭМС" type="Panel"]
|
||||
offset_right = 1598.0
|
||||
offset_bottom = 1201.0
|
||||
script = ExtResource("1_t1s35")
|
||||
|
||||
[node name="lbl_online" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 30.0
|
||||
offset_top = 4.0
|
||||
offset_right = 166.0
|
||||
offset_bottom = 30.0
|
||||
theme_override_colors/font_color = Color(1, 0, 0, 1)
|
||||
text = "Ячейка не на связи"
|
||||
|
||||
[node name="tbl_in" type="GridContainer" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 30.0
|
||||
offset_top = 46.0
|
||||
offset_right = 825.0
|
||||
offset_bottom = 182.0
|
||||
script = ExtResource("2_6x8yw")
|
||||
|
||||
[node name="tbl_out" type="GridContainer" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 46.0
|
||||
offset_top = 588.0
|
||||
offset_right = 598.0
|
||||
offset_bottom = 688.0
|
||||
script = ExtResource("2_6x8yw")
|
||||
@@ -2,19 +2,19 @@ extends Control
|
||||
|
||||
|
||||
func _on_clear_button_down() -> void:
|
||||
$content.clear()
|
||||
Log.info('содержание журнала очищено оператором')
|
||||
$content.clear()
|
||||
Log.info('содержание журнала очищено оператором')
|
||||
|
||||
|
||||
func _on_btn_save_button_down() -> void:
|
||||
$content.hide()
|
||||
$btn_clear.hide()
|
||||
$btn_save.hide()
|
||||
$dlg_file.show()
|
||||
$content.hide()
|
||||
$btn_clear.hide()
|
||||
$btn_save.hide()
|
||||
$dlg_file.show()
|
||||
|
||||
|
||||
func _on_dlg_file_confirmed() -> void:
|
||||
$content.show()
|
||||
$btn_clear.show()
|
||||
$btn_save.show()
|
||||
$dlg_file.hide()
|
||||
$content.show()
|
||||
$btn_clear.show()
|
||||
$btn_save.show()
|
||||
$dlg_file.hide()
|
||||
|
||||
13
scenes/кнопка-3.tscn
Normal file
13
scenes/кнопка-3.tscn
Normal file
@@ -0,0 +1,13 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://b37dpuas0emkc"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://bgekehgbqyddu" path="res://кнопка-3-1.png" id="1"]
|
||||
[ext_resource type="Texture2D" uid="uid://caj3qxh8fo025" path="res://кнопка-3-0.png" id="2"]
|
||||
|
||||
[node name="TextureButton" type="TextureButton"]
|
||||
modulate = Color(1.5, 1.5, 1.5, 1)
|
||||
offset_right = 140.0
|
||||
offset_bottom = 34.0
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
texture_normal = ExtResource("2")
|
||||
texture_pressed = ExtResource("1")
|
||||
13
scenes/кнопка-4.tscn
Normal file
13
scenes/кнопка-4.tscn
Normal file
@@ -0,0 +1,13 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://bsafiravyb8yf"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://c2tdcajjqjxa0" path="res://индикатор-1-1.png" id="1"]
|
||||
[ext_resource type="Texture2D" uid="uid://c0hlip7h568qk" path="res://индикатор-1-0.png" id="2"]
|
||||
|
||||
[node name="indicator_1" type="TextureButton"]
|
||||
modulate = Color(1, 0.596078, 0.4, 1)
|
||||
offset_right = 35.0
|
||||
offset_bottom = 29.0
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2")
|
||||
texture_pressed = ExtResource("1")
|
||||
51
scenes/кнопка-эмс.gd
Normal file
51
scenes/кнопка-эмс.gd
Normal file
@@ -0,0 +1,51 @@
|
||||
@tool
|
||||
|
||||
extends PanelContainer
|
||||
|
||||
|
||||
@export var texture_state0: Texture2D = preload('res://data/кнопка-эмс-1.png'):
|
||||
set(val): $state.set_texture(val)
|
||||
|
||||
|
||||
@export var texture_state1: Texture2D = preload('res://data/кнопка-эмс-0.png'):
|
||||
set(val): $state.set_texture(val)
|
||||
|
||||
|
||||
@export var text: String = '':
|
||||
set(val): $button.set_text(val)
|
||||
get: return $button.get_text()
|
||||
|
||||
|
||||
@export var pressed: bool = false:
|
||||
set(val): $button.set_pressed(val)
|
||||
get: return $button.is_pressed()
|
||||
|
||||
|
||||
@export var toggle_mode: bool = false:
|
||||
set(val):
|
||||
if is_inside_tree():
|
||||
$button.set_toggle_mode(val)
|
||||
get: return $button.is_toggle_mode()
|
||||
|
||||
|
||||
func set_text (val: String): $button.set_text(val)
|
||||
func set_pressed (val: bool): $button.set_pressed(val)
|
||||
|
||||
|
||||
func set_toggle_mode (val: bool):
|
||||
if is_inside_tree():
|
||||
$button.set_toggle_mode(val)
|
||||
|
||||
|
||||
func get_text(): return $button.get_text()
|
||||
func is_pressed(): return $button.is_pressed()
|
||||
func is_toggle_mode(): return $button.is_toggle_mode()
|
||||
|
||||
|
||||
func _on_button_toggled(val: bool):
|
||||
if val: $state.set_texture(texture_state1)
|
||||
else: $state.set_texture(texture_state0)
|
||||
|
||||
|
||||
func button_connect(button_signal: String, proc: Callable):
|
||||
$button.connect(button_signal, proc)
|
||||
50
scenes/кнопка-эмс.tscn
Normal file
50
scenes/кнопка-эмс.tscn
Normal file
@@ -0,0 +1,50 @@
|
||||
[gd_scene load_steps=9 format=3 uid="uid://gh3wqymu7cub"]
|
||||
|
||||
[ext_resource type="Script" path="res://scenes/кнопка-эмс.gd" id="1_pmsh3"]
|
||||
[ext_resource type="Texture2D" uid="uid://nfpish471rjj" path="res://data/кнопка-эмс-1.png" id="2_0o537"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="1"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="6"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="2"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="3"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="5"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="4"]
|
||||
|
||||
[node name="container" type="PanelContainer"]
|
||||
offset_right = 30.0
|
||||
offset_bottom = 30.0
|
||||
theme_override_styles/panel = SubResource("1")
|
||||
script = ExtResource("1_pmsh3")
|
||||
toggle_mode = true
|
||||
|
||||
[node name="state" type="NinePatchRect" parent="."]
|
||||
show_behind_parent = true
|
||||
layout_mode = 2
|
||||
texture = ExtResource("2_0o537")
|
||||
region_rect = Rect2(-1.60803, -1.9046, 32.1611, 25.9451)
|
||||
patch_margin_left = 4
|
||||
patch_margin_top = 2
|
||||
patch_margin_right = 5
|
||||
patch_margin_bottom = 2
|
||||
axis_stretch_horizontal = 2
|
||||
axis_stretch_vertical = 2
|
||||
|
||||
[node name="button" type="Button" parent="."]
|
||||
layout_mode = 2
|
||||
theme_override_styles/normal = SubResource("6")
|
||||
theme_override_styles/hover = SubResource("2")
|
||||
theme_override_styles/pressed = SubResource("3")
|
||||
theme_override_styles/disabled = SubResource("5")
|
||||
theme_override_styles/focus = SubResource("4")
|
||||
toggle_mode = true
|
||||
clip_text = true
|
||||
|
||||
[node name="label" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
|
||||
[connection signal="toggled" from="button" to="." method="_on_button_toggled"]
|
||||
@@ -2,41 +2,41 @@ extends Panel
|
||||
|
||||
const PRIBORS_RES = \
|
||||
[['pribor_uf', 'res://scenes/pribor_uf.tscn'],
|
||||
['pribor_rtr', 'res://scenes/pribor_rtr.tscn'],
|
||||
['pribor_afsp_l', 'res://scenes/pribor_afsp_l.tscn'],
|
||||
['pribor_afsp_r', 'res://scenes/pribor_afsp_r.tscn'],
|
||||
['pribor_sch3', 'res://scenes/pribor_sch3.tscn'],
|
||||
['pribor_spt_l', 'res://scenes/pribor_spt_l.tscn'],
|
||||
['pribor_spt_r', 'res://scenes/pribor_spt_r.tscn'],
|
||||
['pribor_prd_v_1', 'res://scenes/pribor_prd_v_1.tscn'],
|
||||
['pribor_prd_n_1', 'res://scenes/pribor_prd_n_1.tscn'],
|
||||
['pribor_prd_k_1', 'res://scenes/pribor_prd_k_1.tscn'],
|
||||
['pribor_prd_v_2', 'res://scenes/pribor_prd_v_2.tscn'],
|
||||
['pribor_prd_n_2', 'res://scenes/pribor_prd_n_2.tscn'],
|
||||
['pribor_prd_k_2', 'res://scenes/pribor_prd_k_2.tscn'],
|
||||
['pribor_prd_v_3', 'res://scenes/pribor_prd_v_3.tscn'],
|
||||
['pribor_prd_n_3', 'res://scenes/pribor_prd_n_3.tscn'],
|
||||
['pribor_prd_k_3', 'res://scenes/pribor_prd_k_3.tscn'],
|
||||
['pribor_prd_v_4', 'res://scenes/pribor_prd_v_4.tscn'],
|
||||
['pribor_prd_n_4', 'res://scenes/pribor_prd_n_4.tscn'],
|
||||
['pribor_prd_k_4', 'res://scenes/pribor_prd_k_4.tscn']]
|
||||
['pribor_rtr', 'res://scenes/pribor_rtr.tscn'],
|
||||
['pribor_afsp_l', 'res://scenes/pribor_afsp_l.tscn'],
|
||||
['pribor_afsp_r', 'res://scenes/pribor_afsp_r.tscn'],
|
||||
['pribor_sch3', 'res://scenes/pribor_sch3.tscn'],
|
||||
['pribor_spt_l', 'res://scenes/pribor_spt_l.tscn'],
|
||||
['pribor_spt_r', 'res://scenes/pribor_spt_r.tscn'],
|
||||
['pribor_prd_v_1', 'res://scenes/pribor_prd_v_1.tscn'],
|
||||
['pribor_prd_n_1', 'res://scenes/pribor_prd_n_1.tscn'],
|
||||
['pribor_prd_k_1', 'res://scenes/pribor_prd_k_1.tscn'],
|
||||
['pribor_prd_v_2', 'res://scenes/pribor_prd_v_2.tscn'],
|
||||
['pribor_prd_n_2', 'res://scenes/pribor_prd_n_2.tscn'],
|
||||
['pribor_prd_k_2', 'res://scenes/pribor_prd_k_2.tscn'],
|
||||
['pribor_prd_v_3', 'res://scenes/pribor_prd_v_3.tscn'],
|
||||
['pribor_prd_n_3', 'res://scenes/pribor_prd_n_3.tscn'],
|
||||
['pribor_prd_k_3', 'res://scenes/pribor_prd_k_3.tscn'],
|
||||
['pribor_prd_v_4', 'res://scenes/pribor_prd_v_4.tscn'],
|
||||
['pribor_prd_n_4', 'res://scenes/pribor_prd_n_4.tscn'],
|
||||
['pribor_prd_k_4', 'res://scenes/pribor_prd_k_4.tscn']]
|
||||
|
||||
|
||||
func _ready():
|
||||
for item in PRIBORS_RES:
|
||||
var pribor_node = get_node(item[0])
|
||||
var pribor_sch_path = item[1]
|
||||
pribor_node.connect('button_up', Callable(self, 'on_pribor_press').bind(pribor_sch_path))
|
||||
for item in PRIBORS_RES:
|
||||
var pribor_node = get_node(item[0])
|
||||
var pribor_sch_path = item[1]
|
||||
pribor_node.connect('button_up', Callable(self, 'on_pribor_press').bind(pribor_sch_path))
|
||||
|
||||
|
||||
func on_pribor_press(pribor_sch_path):
|
||||
clear_obj($pribor_sch)
|
||||
var pribor_sch = load(pribor_sch_path).instantiate()
|
||||
$pribor_sch.add_child(pribor_sch)
|
||||
clear_obj($pribor_sch)
|
||||
var pribor_sch = load(pribor_sch_path).instantiate()
|
||||
$pribor_sch.add_child(pribor_sch)
|
||||
|
||||
|
||||
func clear_obj(obj: Object):
|
||||
var items = obj.get_children()
|
||||
for item in items:
|
||||
obj.remove_child(item)
|
||||
item.free()
|
||||
var items = obj.get_children()
|
||||
for item in items:
|
||||
obj.remove_child(item)
|
||||
item.free()
|
||||
|
||||
24
scenes/переключатель-эмс.tscn
Normal file
24
scenes/переключатель-эмс.tscn
Normal file
@@ -0,0 +1,24 @@
|
||||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=1]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=2]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=3]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=4]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id=5]
|
||||
|
||||
[node name="Node2D" type="OptionButton"]
|
||||
self_modulate = Color( 1, 0.596078, 0.4, 1 )
|
||||
offset_right = 70.0
|
||||
offset_bottom = 23.0
|
||||
custom_minimum_size = Vector2( 60, 0 )
|
||||
size_flags_horizontal = 15
|
||||
size_flags_vertical = 15
|
||||
theme_override_styles/hover = SubResource( 1 )
|
||||
theme_override_styles/pressed = SubResource( 2 )
|
||||
theme_override_styles/focus = SubResource( 3 )
|
||||
theme_override_styles/disabled = SubResource( 4 )
|
||||
theme_override_styles/normal = SubResource( 5 )
|
||||
142
scenes/работа.gd
142
scenes/работа.gd
@@ -55,110 +55,110 @@ signal full_screen
|
||||
|
||||
|
||||
func _ready():
|
||||
$btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed'))
|
||||
$btn_off.set_pressed(true)
|
||||
strob_center = $canvas.get_strob_center()
|
||||
on_button_strobe_pressed()
|
||||
drag_fsm = DRAG_FSM.OFF
|
||||
var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи')
|
||||
for btn in nodes:
|
||||
btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes))
|
||||
$btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed'))
|
||||
$btn_off.set_pressed(true)
|
||||
strob_center = $canvas.get_strob_center()
|
||||
on_button_strobe_pressed()
|
||||
drag_fsm = DRAG_FSM.OFF
|
||||
var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи')
|
||||
for btn in nodes:
|
||||
btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes))
|
||||
|
||||
|
||||
func on_button_strobe_pressed():
|
||||
if $btn_strobe.is_pressed():
|
||||
$canvas.set_strob_visible(true)
|
||||
drag_fsm = DRAG_FSM.IDLE
|
||||
else:
|
||||
$canvas.set_strob_visible(false)
|
||||
drag_fsm = DRAG_FSM.OFF
|
||||
if $btn_strobe.is_pressed():
|
||||
$canvas.set_strob_visible(true)
|
||||
drag_fsm = DRAG_FSM.IDLE
|
||||
else:
|
||||
$canvas.set_strob_visible(false)
|
||||
drag_fsm = DRAG_FSM.OFF
|
||||
|
||||
|
||||
func on_button_pressed(btn_this, btn_others):
|
||||
# поведение радиокнопок в группе
|
||||
for btn_other in btn_others:
|
||||
btn_other.set_pressed(btn_this == btn_other)
|
||||
# поведение радиокнопок в группе
|
||||
for btn_other in btn_others:
|
||||
btn_other.set_pressed(btn_this == btn_other)
|
||||
|
||||
|
||||
func clip_value(val, val_min, val_max):
|
||||
if val < val_min: val = val_min
|
||||
if val > val_max: val = val_max
|
||||
return val
|
||||
if val < val_min: val = val_min
|
||||
if val > val_max: val = val_max
|
||||
return val
|
||||
|
||||
|
||||
func get_strob_width(pos: Vector2, prev: float) -> float:
|
||||
var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width
|
||||
strob_dir_width = clip_value(strob_dir_width, strob_min_width, strob_max_width)
|
||||
return strob_dir_width
|
||||
var strob_dir_width: float = prev + (drag_pos_begin.y - pos.y) * drag_scale_width
|
||||
strob_dir_width = clip_value(strob_dir_width, strob_min_width, strob_max_width)
|
||||
return strob_dir_width
|
||||
|
||||
|
||||
func get_strob_band(pos: Vector2, prev: float) -> float:
|
||||
var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band
|
||||
strob_dir_band = clip_value(strob_dir_band, strob_min_band, strob_max_band)
|
||||
return strob_dir_band
|
||||
var strob_dir_band: float = prev - (drag_pos_begin.y - pos.y) * drag_scale_band
|
||||
strob_dir_band = clip_value(strob_dir_band, strob_min_band, strob_max_band)
|
||||
return strob_dir_band
|
||||
|
||||
|
||||
func set_strob(pos: Vector2):
|
||||
var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos)
|
||||
if radp.y < $canvas.get_radius_max():
|
||||
$canvas.set_strob_dir(radp.x)
|
||||
$canvas.set_strob_radius(radp.y)
|
||||
var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos)
|
||||
if radp.y < $canvas.get_radius_max():
|
||||
$canvas.set_strob_dir(radp.x)
|
||||
$canvas.set_strob_radius(radp.y)
|
||||
|
||||
|
||||
func _on_drag_continue(event):
|
||||
if drag_button == MOUSE_BUTTON_RIGHT:
|
||||
if shift_pressed:
|
||||
var strob_width: float = get_strob_width(event.position, strob_width_begin)
|
||||
$canvas.set_strob_width(strob_width)
|
||||
else:
|
||||
var strob_band: float = get_strob_band(event.position, strob_band_begin)
|
||||
$canvas.set_strob_band(strob_band)
|
||||
elif drag_button == MOUSE_BUTTON_LEFT:
|
||||
set_strob(event.position)
|
||||
if drag_button == MOUSE_BUTTON_RIGHT:
|
||||
if shift_pressed:
|
||||
var strob_width: float = get_strob_width(event.position, strob_width_begin)
|
||||
$canvas.set_strob_width(strob_width)
|
||||
else:
|
||||
var strob_band: float = get_strob_band(event.position, strob_band_begin)
|
||||
$canvas.set_strob_band(strob_band)
|
||||
elif drag_button == MOUSE_BUTTON_LEFT:
|
||||
set_strob(event.position)
|
||||
|
||||
|
||||
func _on_drag_begin(event):
|
||||
drag_pos_begin = event.position
|
||||
if drag_button == MOUSE_BUTTON_LEFT:
|
||||
set_strob(event.position)
|
||||
elif drag_button == MOUSE_BUTTON_RIGHT:
|
||||
strob_width_begin = $canvas.get_strob_width()
|
||||
strob_band_begin = $canvas.get_strob_band()
|
||||
drag_pos_begin = event.position
|
||||
if drag_button == MOUSE_BUTTON_LEFT:
|
||||
set_strob(event.position)
|
||||
elif drag_button == MOUSE_BUTTON_RIGHT:
|
||||
strob_width_begin = $canvas.get_strob_width()
|
||||
strob_band_begin = $canvas.get_strob_band()
|
||||
|
||||
|
||||
func _input(event):
|
||||
if event is InputEventMouseMotion:
|
||||
if drag_fsm == DRAG_FSM.DRAG:
|
||||
emit_signal('drag_continue', event)
|
||||
elif event is InputEventMouseButton:
|
||||
drag_button = event.button_index
|
||||
if event.pressed:
|
||||
if drag_fsm == DRAG_FSM.IDLE:
|
||||
drag_fsm = DRAG_FSM.DRAG
|
||||
emit_signal('drag_begin', event)
|
||||
else:
|
||||
drag_fsm = DRAG_FSM.IDLE
|
||||
emit_signal('drag_end', event)
|
||||
elif event is InputEventKey:
|
||||
if event.pressed and event.physical_keycode == KEY_F11:
|
||||
emit_signal('full_screen')
|
||||
elif event.physical_keycode == KEY_SHIFT:
|
||||
shift_pressed = event.pressed
|
||||
if event is InputEventMouseMotion:
|
||||
if drag_fsm == DRAG_FSM.DRAG:
|
||||
emit_signal('drag_continue', event)
|
||||
elif event is InputEventMouseButton:
|
||||
drag_button = event.button_index
|
||||
if event.pressed:
|
||||
if drag_fsm == DRAG_FSM.IDLE:
|
||||
drag_fsm = DRAG_FSM.DRAG
|
||||
emit_signal('drag_begin', event)
|
||||
else:
|
||||
drag_fsm = DRAG_FSM.IDLE
|
||||
emit_signal('drag_end', event)
|
||||
elif event is InputEventKey:
|
||||
if event.pressed and event.physical_keycode == KEY_F11:
|
||||
emit_signal('full_screen')
|
||||
elif event.physical_keycode == KEY_SHIFT:
|
||||
shift_pressed = event.pressed
|
||||
|
||||
|
||||
func toggle_full_screen(id: int):
|
||||
var mode = DisplayServer.window_get_mode(id)
|
||||
if mode == DisplayServer.WINDOW_MODE_FULLSCREEN:
|
||||
mode = DisplayServer.WINDOW_MODE_WINDOWED
|
||||
else:
|
||||
mode = DisplayServer.WINDOW_MODE_FULLSCREEN
|
||||
DisplayServer.window_set_mode(mode, id)
|
||||
var mode = DisplayServer.window_get_mode(id)
|
||||
if mode == DisplayServer.WINDOW_MODE_FULLSCREEN:
|
||||
mode = DisplayServer.WINDOW_MODE_WINDOWED
|
||||
else:
|
||||
mode = DisplayServer.WINDOW_MODE_FULLSCREEN
|
||||
DisplayServer.window_set_mode(mode, id)
|
||||
|
||||
|
||||
func _on_full_screen():
|
||||
toggle_full_screen(window_1_id)
|
||||
toggle_full_screen(window_0_id)
|
||||
toggle_full_screen(window_1_id)
|
||||
toggle_full_screen(window_0_id)
|
||||
|
||||
|
||||
func _on_btn_down(signal_name: String) -> void:
|
||||
emit_signal(signal_name)
|
||||
emit_signal(signal_name)
|
||||
|
||||
@@ -4,15 +4,15 @@ extends NinePatchRect
|
||||
|
||||
|
||||
@export var horizontal_alignment: HorizontalAlignment = HorizontalAlignment.HORIZONTAL_ALIGNMENT_CENTER:
|
||||
get: return $header.horizontal_alignment
|
||||
set(val): $header.horizontal_alignment = val
|
||||
get: return $header.horizontal_alignment
|
||||
set(val): $header.horizontal_alignment = val
|
||||
|
||||
|
||||
@export var vertical_alignment: VerticalAlignment = VerticalAlignment.VERTICAL_ALIGNMENT_CENTER:
|
||||
get: return $header.vertical_alignment
|
||||
set(val): $header.vertical_alignment = val
|
||||
get: return $header.vertical_alignment
|
||||
set(val): $header.vertical_alignment = val
|
||||
|
||||
|
||||
@export var text: String = 'caption text':
|
||||
get: return $header.text
|
||||
set(val): $header.text = val
|
||||
get: return $header.text
|
||||
set(val): $header.text = val
|
||||
|
||||
5
scenes/состояния-эмс.gd
Normal file
5
scenes/состояния-эмс.gd
Normal file
@@ -0,0 +1,5 @@
|
||||
extends Control
|
||||
var align : get = get_align, set = set_align
|
||||
var _align: int = 0
|
||||
func set_align(align: int): _align = align
|
||||
func get_align(): return _align
|
||||
40
scenes/состояния-эмс.tscn
Normal file
40
scenes/состояния-эмс.tscn
Normal file
@@ -0,0 +1,40 @@
|
||||
[gd_scene load_steps=7 format=3 uid="uid://by22sta8tt8dn"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://belwchvdktrw0" path="res://data/эмс-бланк.png" id="1_0wisd"]
|
||||
[ext_resource type="Script" path="res://scenes/состояния-эмс.gd" id="1_vw38j"]
|
||||
[ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="2_nbah5"]
|
||||
[ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="3_vsgfs"]
|
||||
[ext_resource type="Texture2D" uid="uid://dvl3sq036gn75" path="res://data/эмс-бланк-замыкание.png" id="4_qu3c5"]
|
||||
|
||||
[sub_resource type="SpriteFrames" id="SpriteFrames_ow7xh"]
|
||||
animations = [{
|
||||
"frames": [{
|
||||
"duration": 1.0,
|
||||
"texture": ExtResource("1_0wisd")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": ExtResource("2_nbah5")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": ExtResource("3_vsgfs")
|
||||
}, {
|
||||
"duration": 1.0,
|
||||
"texture": ExtResource("4_qu3c5")
|
||||
}],
|
||||
"loop": true,
|
||||
"name": &"default",
|
||||
"speed": 5.0
|
||||
}]
|
||||
|
||||
[node name="Control" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_vw38j")
|
||||
|
||||
[node name="sprite" type="AnimatedSprite2D" parent="."]
|
||||
position = Vector2(14, 9)
|
||||
sprite_frames = SubResource("SpriteFrames_ow7xh")
|
||||
7
scenes/ячейка-1.tscn
Normal file
7
scenes/ячейка-1.tscn
Normal file
@@ -0,0 +1,7 @@
|
||||
[gd_scene format=3 uid="uid://dqcfr20vovhq5"]
|
||||
|
||||
[node name="Label" type="Label"]
|
||||
offset_right = 122.0
|
||||
offset_bottom = 34.0
|
||||
theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1)
|
||||
clip_text = true
|
||||
11
scenes/ячейка-2.tscn
Normal file
11
scenes/ячейка-2.tscn
Normal file
@@ -0,0 +1,11 @@
|
||||
[gd_scene format=3 uid="uid://c65331tnwfcfa"]
|
||||
|
||||
[node name="LineEdit" type="LineEdit"]
|
||||
offset_right = 58.0
|
||||
offset_bottom = 33.0
|
||||
theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1)
|
||||
context_menu_enabled = false
|
||||
shortcut_keys_enabled = false
|
||||
middle_mouse_paste_enabled = false
|
||||
caret_blink = true
|
||||
caret_blink_interval = 0.13
|
||||
@@ -3,27 +3,27 @@ extends Node
|
||||
|
||||
class Threat:
|
||||
|
||||
enum FFlags { # Допустимые значения для Threat.fflags
|
||||
NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4,
|
||||
SLON = 8, SLAT = 16, SALT = 32, LAT = 64,
|
||||
LON = 128, ALT = 256 }
|
||||
enum FFlags { # Допустимые значения для Threat.fflags
|
||||
NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4,
|
||||
SLON = 8, SLAT = 16, SALT = 32, LAT = 64,
|
||||
LON = 128, ALT = 256 }
|
||||
|
||||
var id: int # Идентификатор цели
|
||||
var aoa: float # Курсовой угол на источник сигнала, градусы.
|
||||
var freq: float # Частота несущей или центральная частота, МГц
|
||||
var width: float # Ширина занимаемого диапазона частот, МГц
|
||||
var pow_rx: float # Уровень принимаемого сигнала, дБм
|
||||
var tick: int # Уровень принимаемого сигнала, дБм
|
||||
var freqm: String # Режим смены частоты
|
||||
var rkrp: String # Рекомендуемый режим помехи
|
||||
var rparams: String # Рекомендуемые параметры помехи
|
||||
var tmod: String # Тип модуляции
|
||||
var baud: float # Модуляционная скорость
|
||||
var proto: String # Тип протокола источника сигнала
|
||||
var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags
|
||||
var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags
|
||||
var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags
|
||||
var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags
|
||||
var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags
|
||||
var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags
|
||||
var fflags: FFlags # Флаги достоверности полей
|
||||
var id: int # Идентификатор цели
|
||||
var aoa: float # Курсовой угол на источник сигнала, градусы.
|
||||
var freq: float # Частота несущей или центральная частота, МГц
|
||||
var width: float # Ширина занимаемого диапазона частот, МГц
|
||||
var pow_rx: float # Уровень принимаемого сигнала, дБм
|
||||
var tick: int # Уровень принимаемого сигнала, дБм
|
||||
var freqm: String # Режим смены частоты
|
||||
var rkrp: String # Рекомендуемый режим помехи
|
||||
var rparams: String # Рекомендуемые параметры помехи
|
||||
var tmod: String # Тип модуляции
|
||||
var baud: float # Модуляционная скорость
|
||||
var proto: String # Тип протокола источника сигнала
|
||||
var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags
|
||||
var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags
|
||||
var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags
|
||||
var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags
|
||||
var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags
|
||||
var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags
|
||||
var fflags: FFlags # Флаги достоверности полей
|
||||
|
||||
@@ -2,59 +2,59 @@ extends Node
|
||||
|
||||
|
||||
func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2:
|
||||
""" Преобразует декартовые координаты в полярные """
|
||||
var x1: float = pos.x - pos0.x
|
||||
var y1: float = pos.y - pos0.y
|
||||
var ang: float = (atan2(y1, x1) * 180.0) / PI
|
||||
ang += 360.0 * float(ang < 0.0)
|
||||
var radius: float = hypot(x1, y1)
|
||||
return Vector2(ang, radius)
|
||||
""" Преобразует декартовые координаты в полярные """
|
||||
var x1: float = pos.x - pos0.x
|
||||
var y1: float = pos.y - pos0.y
|
||||
var ang: float = (atan2(y1, x1) * 180.0) / PI
|
||||
ang += 360.0 * float(ang < 0.0)
|
||||
var radius: float = hypot(x1, y1)
|
||||
return Vector2(ang, radius)
|
||||
|
||||
|
||||
func hypot(x: float, y: float) -> float:
|
||||
return sqrt(x * x + y * y)
|
||||
return sqrt(x * x + y * y)
|
||||
|
||||
|
||||
func is_overlap(x1, x2, y1, y2):
|
||||
""" Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """
|
||||
return max(x1, y1) <= min(x2, y2)
|
||||
""" Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """
|
||||
return max(x1, y1) <= min(x2, y2)
|
||||
|
||||
|
||||
func ibytes_to_word(buf: PackedByteArray, i: int) -> int:
|
||||
return buf[i] + (buf[i + 1] * 256)
|
||||
return buf[i] + (buf[i + 1] * 256)
|
||||
|
||||
|
||||
func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
|
||||
""" Переводит значение val из диапазона a0...a1 в диапазон b0...b1 """
|
||||
return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0
|
||||
""" Переводит значение val из диапазона a0...a1 в диапазон b0...b1 """
|
||||
return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0
|
||||
|
||||
|
||||
func type_is_num(val) -> bool:
|
||||
""" Возвращает true, если val число, false - если иначе """
|
||||
return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0))
|
||||
""" Возвращает true, если val число, false - если иначе """
|
||||
return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0))
|
||||
|
||||
|
||||
func sort_ascending_0(a, b) -> bool:
|
||||
return a[0] < b[0]
|
||||
return a[0] < b[0]
|
||||
|
||||
|
||||
func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
|
||||
var j: int = len(p) - 1
|
||||
var odd_nodes: int = 0
|
||||
for i in range(len(p)):
|
||||
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
|
||||
return odd_nodes > 0
|
||||
var j: int = len(p) - 1
|
||||
var odd_nodes: int = 0
|
||||
for i in range(len(p)):
|
||||
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
|
||||
return odd_nodes > 0
|
||||
|
||||
|
||||
func set_wordi(buf: Array, index, val):
|
||||
"""
|
||||
Устанавливает слово в байтовом массиве
|
||||
:param buf: Байтовый массив
|
||||
:param index: Индекс младшего байта слова в массиве
|
||||
:param val: Значение слова для записи в батовый массив
|
||||
:return: None """
|
||||
buf[index] = val & 0xff
|
||||
buf[index + 1] = (val >> 8) & 0xff
|
||||
"""
|
||||
Устанавливает слово в байтовом массиве
|
||||
:param buf: Байтовый массив
|
||||
:param index: Индекс младшего байта слова в массиве
|
||||
:param val: Значение слова для записи в батовый массив
|
||||
:return: None """
|
||||
buf[index] = val & 0xff
|
||||
buf[index + 1] = (val >> 8) & 0xff
|
||||
|
||||
|
||||
43
scripts/yems_devs.gd
Normal file
43
scripts/yems_devs.gd
Normal file
@@ -0,0 +1,43 @@
|
||||
extends Node
|
||||
|
||||
|
||||
class InDev:
|
||||
var id: int # Идентификатор индекс устройства
|
||||
var dev_name: String # Имя подключаемого комплекса
|
||||
var connector: String # Номер разъёма в приборе
|
||||
var delay: float # Задержка фронта импульса
|
||||
var offset: float # Смещение фронта импульса
|
||||
var state: int # Состояние входа
|
||||
var freq: int # Предполагаемая частота на которой работает комплекс
|
||||
var ports_data: Dictionary # Словарь состояния портов устройства
|
||||
var tbl_row_id: int # Индекс устройства в таблице входов
|
||||
var out_dots: Array # Список выходных устройств в порядке, как в таблице и точки матрицы
|
||||
|
||||
func _init(dev_id : int, params : Array, row_id : int):
|
||||
id = dev_id
|
||||
dev_name = String(params[0])
|
||||
connector = String(params[1])
|
||||
delay = float(params[2])
|
||||
offset = float(params[3])
|
||||
tbl_row_id = row_id
|
||||
|
||||
|
||||
class OutDev:
|
||||
var id: int # Идентификатор индекс устройства
|
||||
var dev_name: String # Имя подключаемого комплекса
|
||||
var connector: String # Номер разъёма в приборе
|
||||
var delay: float # Задержка фронта импульса
|
||||
var offset: float # Смещение фронта импульса
|
||||
var state: int # Состояние входа
|
||||
var freq: int # Предполагаемая частота на которой работает комплекс
|
||||
var ports_data: Dictionary # Словарь состояния портов устройства
|
||||
var tbl_row_id: int # Индекс устройства в таблице выходов
|
||||
var mode: int # Режим работы выхода
|
||||
|
||||
func _init(dev_id : int, params : Array, row_id : int):
|
||||
id = dev_id
|
||||
dev_name = String(params[0])
|
||||
connector = String(params[1])
|
||||
delay = float(params[2])
|
||||
offset = float(params[3])
|
||||
tbl_row_id = row_id
|
||||
681
table/table.gd
681
table/table.gd
@@ -34,506 +34,505 @@ signal selected_changed(i_row: int) # Вызывается при измене
|
||||
|
||||
|
||||
func selector_up():
|
||||
var i_rows: = []
|
||||
get_selected_rows(i_rows)
|
||||
for i in i_rows:
|
||||
set_row_selected(i, false)
|
||||
var rows_count: = get_rows_count()
|
||||
if not (i_rows.size() and (rows_count > 1)):
|
||||
return
|
||||
var i_row = i_rows[0]
|
||||
i_row -= 1
|
||||
if i_row < 0:
|
||||
i_row = rows_count - 1
|
||||
set_row_selected(i_row, true)
|
||||
emit_signal('selected_changed', i_row)
|
||||
var i_rows: = []
|
||||
get_selected_rows(i_rows)
|
||||
for i in i_rows:
|
||||
set_row_selected(i, false)
|
||||
var rows_count: = get_rows_count()
|
||||
if not (i_rows.size() and (rows_count > 1)):
|
||||
return
|
||||
var i_row = i_rows[0]
|
||||
i_row -= 1
|
||||
if i_row < 0:
|
||||
i_row = rows_count - 1
|
||||
set_row_selected(i_row, true)
|
||||
emit_signal('selected_changed', i_row)
|
||||
|
||||
|
||||
func selector_down():
|
||||
var i_rows: = []
|
||||
get_selected_rows(i_rows)
|
||||
for i in i_rows:
|
||||
set_row_selected(i, false)
|
||||
var rows_count: = get_rows_count()
|
||||
if not (i_rows.size() and (rows_count > 1)):
|
||||
return
|
||||
var i_row = i_rows[0]
|
||||
i_row += 1
|
||||
i_row %= rows_count
|
||||
set_row_selected(i_row, true)
|
||||
emit_signal('selected_changed', i_row)
|
||||
var i_rows: = []
|
||||
get_selected_rows(i_rows)
|
||||
for i in i_rows:
|
||||
set_row_selected(i, false)
|
||||
var rows_count: = get_rows_count()
|
||||
if not (i_rows.size() and (rows_count > 1)):
|
||||
return
|
||||
var i_row = i_rows[0]
|
||||
i_row += 1
|
||||
i_row %= rows_count
|
||||
set_row_selected(i_row, true)
|
||||
emit_signal('selected_changed', i_row)
|
||||
|
||||
|
||||
func set_columns_alignments(alignments):
|
||||
assert(columns == alignments.size())
|
||||
var rows_count: = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
for i_col in alignments.size():
|
||||
set_node_alligment(i_col, i_row, alignments[i_col])
|
||||
assert(columns == alignments.size())
|
||||
var rows_count: = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
for i_col in alignments.size():
|
||||
set_node_alligment(i_col, i_row, alignments[i_col])
|
||||
|
||||
|
||||
func load_selector_scene(file_name: String):
|
||||
selector_type_file = file_name
|
||||
ScnSelector = load(file_name)
|
||||
selector_type_file = file_name
|
||||
ScnSelector = load(file_name)
|
||||
|
||||
|
||||
func load_node_scene(file_name: String):
|
||||
node_type_file = file_name
|
||||
ScnNode = load(file_name)
|
||||
node_type_file = file_name
|
||||
ScnNode = load(file_name)
|
||||
|
||||
|
||||
func get_node_scene():
|
||||
return node_type_file
|
||||
return node_type_file
|
||||
|
||||
|
||||
func _ready():
|
||||
ScnSelector = load(selector_type_file)
|
||||
ScnNode = load(node_type_file)
|
||||
assert(ScnSelector)
|
||||
assert(ScnNode)
|
||||
ScnSelector = load(selector_type_file)
|
||||
ScnNode = load(node_type_file)
|
||||
assert(ScnSelector)
|
||||
assert(ScnNode)
|
||||
|
||||
|
||||
func align_to_left_bottom(header, gap: = Vector2(0, 0)):
|
||||
""" Выравнивает по нижнему левому углу.
|
||||
Используется для выравнивания по заголовку """
|
||||
position.x = header.position.x + gap.x
|
||||
position.y = header.position.y + header.size.y + gap.y
|
||||
""" Выравнивает по нижнему левому углу.
|
||||
Используется для выравнивания по заголовку """
|
||||
position.x = header.position.x + gap.x
|
||||
position.y = header.position.y + header.size.y + gap.y
|
||||
|
||||
|
||||
func _assert_meta(i_col: int, i_row: int, pname: String, node):
|
||||
assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки (%s): колонка:%d ряд:%d' % [pname, typeof(node), i_col, i_row])
|
||||
assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки (%s): колонка:%d ряд:%d' % [pname, typeof(node), i_col, 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)
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
node.set_meta(pname, val)
|
||||
|
||||
|
||||
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]
|
||||
_assert_meta(i_col, i_row, pname, node)
|
||||
return node.get_meta(pname)
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
_assert_meta(i_col, i_row, pname, node)
|
||||
return node.get_meta(pname)
|
||||
|
||||
|
||||
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)
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
node.set(pname, val)
|
||||
|
||||
|
||||
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)
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
return node.get(pname)
|
||||
|
||||
|
||||
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])
|
||||
return key
|
||||
var key: String = format % [i_row, i_col]
|
||||
assert(nodes.has(key), 'ошибка: нет такой ячейки: колонка:%d ряд:%d' % [i_col, i_row])
|
||||
return key
|
||||
|
||||
|
||||
func get_key_indexes(key: String) -> Array:
|
||||
var tokens: = key.split('_')
|
||||
assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key)
|
||||
return [int(tokens[2]), int(tokens[1])]
|
||||
var tokens: = key.split('_')
|
||||
assert(tokens.size() == 3, 'ошибка: неверный ключ: \"%s\"' % key)
|
||||
return [int(tokens[2]), int(tokens[1])]
|
||||
|
||||
|
||||
func set_columns_min_size(sizes: Array) -> void:
|
||||
var rows_count: = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
set_nodes_min_size(i_row, sizes)
|
||||
set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT)
|
||||
var rows_count: = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
set_nodes_min_size(i_row, sizes)
|
||||
set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT)
|
||||
|
||||
|
||||
func set_columns_aligment(alignments: Array) -> void:
|
||||
var rows_count: = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
for i_col in alignments.size():
|
||||
set_node_alligment(i_col, i_row, alignments[i_col])
|
||||
var rows_count: = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
for i_col in alignments.size():
|
||||
set_node_alligment(i_col, i_row, alignments[i_col])
|
||||
|
||||
|
||||
func _input(event) -> void:
|
||||
if event is InputEventKey:
|
||||
if in_focus and event.pressed:
|
||||
if event.keycode == selector_key_up:
|
||||
selector_up()
|
||||
elif event.keycode == selector_key_down:
|
||||
selector_down()
|
||||
elif event is InputEventMouseButton:
|
||||
if not event.pressed:
|
||||
return
|
||||
if (event.position.x < position.x) \
|
||||
or (event.position.x > (position.x + size.x)) \
|
||||
or (event.position.y < position.y) \
|
||||
or (event.position.y > (position.y + size.y)):
|
||||
in_focus = false
|
||||
emit_signal('focus_exited')
|
||||
return
|
||||
var rows_count: = get_rows_count()
|
||||
in_focus = true
|
||||
emit_signal('focus_entered')
|
||||
for i_row in rows_count:
|
||||
var rect = [0, 0, 0, 0]
|
||||
get_node_rect(0, i_row, rect)
|
||||
var y = rect[1] + position.y
|
||||
if event.position.y < y:
|
||||
continue
|
||||
if event.position.y > (y + rect[3]):
|
||||
continue
|
||||
emit_signal('row_pressed', i_row)
|
||||
break
|
||||
if event is InputEventKey:
|
||||
if in_focus and event.pressed:
|
||||
if event.keycode == selector_key_up:
|
||||
selector_up()
|
||||
elif event.keycode == selector_key_down:
|
||||
selector_down()
|
||||
elif event is InputEventMouseButton:
|
||||
if not event.pressed:
|
||||
return
|
||||
if (event.position.x < position.x) \
|
||||
or (event.position.x > (position.x + size.x)) \
|
||||
or (event.position.y < position.y) \
|
||||
or (event.position.y > (position.y + size.y)):
|
||||
in_focus = false
|
||||
emit_signal('focus_exited')
|
||||
return
|
||||
var rows_count: = get_rows_count()
|
||||
in_focus = true
|
||||
emit_signal('focus_entered')
|
||||
for i_row in rows_count:
|
||||
var rect = [0, 0, 0, 0]
|
||||
get_node_rect(0, i_row, rect)
|
||||
var y = rect[1] + position.y
|
||||
if event.position.y < y:
|
||||
continue
|
||||
if event.position.y > (y + rect[3]):
|
||||
continue
|
||||
emit_signal('row_pressed', i_row)
|
||||
break
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
selector_color_proc = Callable(self, 'defaultselector_color_proc')
|
||||
assert(selector_color_proc.is_valid())
|
||||
selector_size_proc = Callable(self, 'default_selector_size_proc')
|
||||
assert(selector_size_proc.is_valid())
|
||||
selector_color_proc = Callable(self, 'defaultselector_color_proc')
|
||||
assert(selector_color_proc.is_valid())
|
||||
selector_size_proc = Callable(self, 'default_selector_size_proc')
|
||||
assert(selector_size_proc.is_valid())
|
||||
|
||||
|
||||
func defaultselector_color_proc(_i_row: int):
|
||||
return selector_color
|
||||
return selector_color
|
||||
|
||||
|
||||
func setselector_color_proc(instance: Object, function: String) -> void:
|
||||
selector_color_proc = Callable(instance, function)
|
||||
assert(selector_color_proc.is_valid())
|
||||
selector_color_proc = Callable(instance, function)
|
||||
assert(selector_color_proc.is_valid())
|
||||
|
||||
|
||||
func set_selector_size_proc(instance: Object, function: String) -> void:
|
||||
selector_size_proc = Callable(instance, function)
|
||||
assert(selector_size_proc.is_valid())
|
||||
selector_size_proc = Callable(instance, function)
|
||||
assert(selector_size_proc.is_valid())
|
||||
|
||||
|
||||
func default_selector_size_proc(i_row: int, rect: Array) -> void:
|
||||
get_row_rect(i_row, rect)
|
||||
rect[0] = rect[0] + position.x - node_gap.x / 2.0
|
||||
rect[1] = rect[1] + position.y - node_gap.y / 2.0
|
||||
rect[2] = rect[2] + node_gap.x
|
||||
rect[3] = rect[3] + node_gap.y
|
||||
get_row_rect(i_row, rect)
|
||||
rect[0] = rect[0] + position.x - node_gap.x / 2.0
|
||||
rect[1] = rect[1] + position.y - node_gap.y / 2.0
|
||||
rect[2] = rect[2] + node_gap.x
|
||||
rect[3] = rect[3] + node_gap.y
|
||||
|
||||
|
||||
func clear_rows_selected():
|
||||
var rows_count: = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
set_row_selected(i_row, false)
|
||||
var rows_count: = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
set_row_selected(i_row, false)
|
||||
|
||||
|
||||
func set_row_selected(i_row: int, selected: bool = true) -> void:
|
||||
var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0]
|
||||
var parent = get_parent()
|
||||
if nodes.has(key) and (not selected):
|
||||
var selector = nodes[key]
|
||||
parent.remove_child(selector)
|
||||
selector.queue_free()
|
||||
nodes.erase(key)
|
||||
elif (not nodes.has(key)) and selected:
|
||||
var selector = ScnSelector.instantiate()
|
||||
var rect: = [0, 0, 0, 0]
|
||||
selector_size_proc.call(i_row, rect)
|
||||
selector.position.x = rect[0]
|
||||
selector.position.y = rect[1]
|
||||
selector.size.x = rect[2]
|
||||
selector.size.y = rect[3]
|
||||
selector.modulate = selector_color_proc.call(i_row)
|
||||
nodes[key] = selector
|
||||
parent.add_child(selector)
|
||||
var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0]
|
||||
var parent = get_parent()
|
||||
if nodes.has(key) and (not selected):
|
||||
var selector = nodes[key]
|
||||
parent.remove_child(selector)
|
||||
selector.queue_free()
|
||||
nodes.erase(key)
|
||||
elif (not nodes.has(key)) and selected:
|
||||
var selector = ScnSelector.instantiate()
|
||||
var rect: = [0, 0, 0, 0]
|
||||
selector_size_proc.call(i_row, rect)
|
||||
selector.position.x = rect[0]
|
||||
selector.position.y = rect[1]
|
||||
selector.size.x = rect[2]
|
||||
selector.size.y = rect[3]
|
||||
selector.modulate = selector_color_proc.call(i_row)
|
||||
nodes[key] = selector
|
||||
parent.add_child(selector)
|
||||
|
||||
|
||||
func is_row_selected(i_row: int) -> bool:
|
||||
var key: = get_node_key(ROW_SELECTOR_KEY_FORMAT, 0, i_row)
|
||||
return nodes.has(key)
|
||||
var key: = get_node_key(ROW_SELECTOR_KEY_FORMAT, 0, i_row)
|
||||
return nodes.has(key)
|
||||
|
||||
|
||||
func get_selected_rows(rows: Array) -> void:
|
||||
for key in nodes.keys():
|
||||
if SLCT_PREFIX in key:
|
||||
var indexes = get_key_indexes(key)
|
||||
rows.append(indexes[1])
|
||||
for key in nodes.keys():
|
||||
if SLCT_PREFIX in key:
|
||||
var indexes = get_key_indexes(key)
|
||||
rows.append(indexes[1])
|
||||
|
||||
|
||||
func get_rows_count() -> int:
|
||||
var rows_count: int = 0
|
||||
for key in nodes:
|
||||
rows_count += int(NODE_PREFIX in key)
|
||||
return rows_count / columns
|
||||
var rows_count: int = 0
|
||||
for key in nodes:
|
||||
rows_count += int(NODE_PREFIX in key)
|
||||
return rows_count / columns
|
||||
|
||||
|
||||
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]
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
return nodes[key]
|
||||
|
||||
|
||||
func set_node_user_data(i_col: int, i_row: int, user_data: Object) -> void:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key] = user_data
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key] = user_data
|
||||
|
||||
|
||||
func add_row(row_types: Array) -> void:
|
||||
assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1))
|
||||
if columns == 1:
|
||||
set_columns(row_types.size())
|
||||
else:
|
||||
assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()])
|
||||
var rows_count: int = get_rows_count()
|
||||
assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1))
|
||||
for i_col in columns:
|
||||
var node = row_types[i_col].instantiate()
|
||||
var key: String = NODE_KEY_FORMAT % [rows_count, i_col]
|
||||
node.name = key
|
||||
add_child(node)
|
||||
nodes[key] = node
|
||||
assert(row_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1))
|
||||
if columns == 1:
|
||||
set_columns(row_types.size())
|
||||
else:
|
||||
assert(columns == row_types.size(), 'ошибка: %s количество колонок установлено ранее - %d, но требуется %d' % [self, columns, row_types.size()])
|
||||
var rows_count: int = get_rows_count()
|
||||
assert(rows_count < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1))
|
||||
for i_col in columns:
|
||||
var node = row_types[i_col].instantiate()
|
||||
var key: String = NODE_KEY_FORMAT % [rows_count, i_col]
|
||||
node.name = key
|
||||
add_child(node)
|
||||
nodes[key] = node
|
||||
|
||||
|
||||
func set_header(header_types: Array):
|
||||
assert(header_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1))
|
||||
if columns == 1:
|
||||
set_columns(header_types.size())
|
||||
else:
|
||||
assert(columns == header_types.size())
|
||||
var do_adj: = false
|
||||
if not header:
|
||||
header = GridContainer.new()
|
||||
header.position = position
|
||||
header.columns = header_types.size()
|
||||
header.size.x = size.x
|
||||
var parent = get_parent()
|
||||
parent.add_child(header)
|
||||
do_adj = true
|
||||
else:
|
||||
var childrens = header.get_children()
|
||||
for node in childrens:
|
||||
childrens.erase(node.name)
|
||||
childrens.remove_child(node)
|
||||
node.queue_free()
|
||||
for i_col in columns:
|
||||
var node = header_types[i_col].instantiate()
|
||||
var key: String = HEAD_KEY_FORMAT % [0, i_col]
|
||||
node.name = key
|
||||
nodes[key] = node
|
||||
header.add_child(node)
|
||||
if do_adj:
|
||||
var rect = [0, 0, 0, 0]
|
||||
get_node_rect(0, 0, rect, HEAD_KEY_FORMAT)
|
||||
position.y += rect[3]
|
||||
assert(header_types.size() < MAX_INDEX, 'ошибка: слишком много колонок, больше %d' % (MAX_INDEX + 1))
|
||||
if columns == 1:
|
||||
set_columns(header_types.size())
|
||||
else:
|
||||
assert(columns == header_types.size())
|
||||
var do_adj: = false
|
||||
if not header:
|
||||
header = GridContainer.new()
|
||||
header.position = position
|
||||
header.columns = header_types.size()
|
||||
header.size.x = size.x
|
||||
var parent = get_parent()
|
||||
parent.add_child(header)
|
||||
do_adj = true
|
||||
else:
|
||||
var childrens = header.get_children()
|
||||
for node in childrens:
|
||||
childrens.erase(node.name)
|
||||
childrens.remove_child(node)
|
||||
node.queue_free()
|
||||
for i_col in columns:
|
||||
var node = header_types[i_col].instantiate()
|
||||
var key: String = HEAD_KEY_FORMAT % [0, i_col]
|
||||
node.name = key
|
||||
nodes[key] = node
|
||||
header.add_child(node)
|
||||
if do_adj:
|
||||
var rect = [0, 0, 0, 0]
|
||||
get_node_rect(0, 0, rect, HEAD_KEY_FORMAT)
|
||||
position.y += rect[3]
|
||||
|
||||
|
||||
func set_header_text(headers: Array):
|
||||
assert(columns == headers.size())
|
||||
set_row_text(0, headers, 0, HEAD_KEY_FORMAT)
|
||||
assert(columns == headers.size())
|
||||
set_row_text(0, headers, 0, HEAD_KEY_FORMAT)
|
||||
|
||||
|
||||
func get_node_user_data(i_col: int, i_row: int) -> Object:
|
||||
var key: = get_node_key(DATA_KEY_FORMAT, i_col, i_row)
|
||||
return nodes[key]
|
||||
var key: = get_node_key(DATA_KEY_FORMAT, i_col, i_row)
|
||||
return nodes[key]
|
||||
|
||||
|
||||
func remove_row(i_row: int):
|
||||
var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0]
|
||||
if nodes.has(sel_key):
|
||||
var selector = nodes[sel_key]
|
||||
get_parent().remove_child(selector)
|
||||
selector.queue_free()
|
||||
nodes.erase(sel_key)
|
||||
for i_col in columns:
|
||||
var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col]
|
||||
var data_key: String = DATA_KEY_FORMAT % [i_row, i_col]
|
||||
var node = nodes[node_key]
|
||||
nodes.erase(node_key)
|
||||
remove_child(node)
|
||||
node.queue_free()
|
||||
var sel_key: String = ROW_SELECTOR_KEY_FORMAT % [i_row, 0]
|
||||
if nodes.has(sel_key):
|
||||
var selector = nodes[sel_key]
|
||||
get_parent().remove_child(selector)
|
||||
selector.queue_free()
|
||||
nodes.erase(sel_key)
|
||||
for i_col in columns:
|
||||
var node_key: String = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col]
|
||||
var data_key: String = DATA_KEY_FORMAT % [i_row, i_col]
|
||||
var node = nodes[node_key]
|
||||
nodes.erase(node_key)
|
||||
remove_child(node)
|
||||
node.queue_free()
|
||||
|
||||
if nodes.has(data_key):
|
||||
nodes.erase(data_key)
|
||||
if nodes.has(conn_key):
|
||||
var conn = nodes[conn_key]
|
||||
var callback = conn[0]
|
||||
var dest_node = conn[1]
|
||||
node.disconnect('pressed', Callable(dest_node, callback))
|
||||
nodes.erase(conn_key)
|
||||
if nodes.has(data_key):
|
||||
nodes.erase(data_key)
|
||||
if nodes.has(conn_key):
|
||||
var conn = nodes[conn_key]
|
||||
var callback = conn[0]
|
||||
var dest_node = conn[1]
|
||||
node.disconnect('pressed', Callable(dest_node, callback))
|
||||
nodes.erase(conn_key)
|
||||
|
||||
|
||||
func rehash(swaps: Array):
|
||||
""" Переназначает ключи в соответствии с размерами таблицы.
|
||||
После вызова swaps содержит массив пар [<прежний ключ>, <текущий ключ>] """
|
||||
assert(not swaps.size(), 'ошибка: swaps не пустой')
|
||||
var nodes_copy: = {}
|
||||
var i_col: = 0
|
||||
var i_row: = 0
|
||||
for key0 in nodes:
|
||||
if NODE_PREFIX in key0:
|
||||
var node_key1: String = NODE_KEY_FORMAT % [i_row, i_col]
|
||||
nodes_copy[node_key1] = nodes[key0]
|
||||
swaps.append([key0, node_key1])
|
||||
""" Переназначает ключи в соответствии с размерами таблицы.
|
||||
После вызова swaps содержит массив пар [<прежний ключ>, <текущий ключ>] """
|
||||
assert(not swaps.size(), 'ошибка: swaps не пустой')
|
||||
var nodes_copy: = {}
|
||||
var i_col: = 0
|
||||
var i_row: = 0
|
||||
for key0 in nodes:
|
||||
if NODE_PREFIX in key0:
|
||||
var node_key1: String = NODE_KEY_FORMAT % [i_row, i_col]
|
||||
nodes_copy[node_key1] = nodes[key0]
|
||||
swaps.append([key0, node_key1])
|
||||
|
||||
var indxs = get_key_indexes(key0)
|
||||
var indxs = get_key_indexes(key0)
|
||||
|
||||
var slct_key0: String = ROW_SELECTOR_KEY_FORMAT % [indxs[1], indxs[0]]
|
||||
if nodes.has(slct_key0):
|
||||
var slct_key1: String = ROW_SELECTOR_KEY_FORMAT % [i_row, i_col]
|
||||
nodes_copy[slct_key1] = nodes[slct_key0]
|
||||
swaps.append([slct_key0, slct_key1])
|
||||
var slct_key0: String = ROW_SELECTOR_KEY_FORMAT % [indxs[1], indxs[0]]
|
||||
if nodes.has(slct_key0):
|
||||
var slct_key1: String = ROW_SELECTOR_KEY_FORMAT % [i_row, i_col]
|
||||
nodes_copy[slct_key1] = nodes[slct_key0]
|
||||
swaps.append([slct_key0, slct_key1])
|
||||
|
||||
var conn_key0: String = CONNECTED_KEY_FORMAT % [indxs[1], indxs[0]]
|
||||
if nodes.has(conn_key0):
|
||||
var conn_key1: String = CONNECTED_KEY_FORMAT % [i_row, i_col]
|
||||
nodes_copy[conn_key1] = nodes[conn_key0]
|
||||
swaps.append([conn_key0, conn_key1])
|
||||
var conn_key0: String = CONNECTED_KEY_FORMAT % [indxs[1], indxs[0]]
|
||||
if nodes.has(conn_key0):
|
||||
var conn_key1: String = CONNECTED_KEY_FORMAT % [i_row, i_col]
|
||||
nodes_copy[conn_key1] = nodes[conn_key0]
|
||||
swaps.append([conn_key0, conn_key1])
|
||||
|
||||
var data_key0: String = DATA_KEY_FORMAT % [indxs[1], indxs[0]]
|
||||
if nodes.has(data_key0):
|
||||
var data_key1: String = DATA_KEY_FORMAT % [i_row, i_col]
|
||||
nodes_copy[data_key1] = nodes[data_key0]
|
||||
swaps.append([data_key0, data_key1])
|
||||
var data_key0: String = DATA_KEY_FORMAT % [indxs[1], indxs[0]]
|
||||
if nodes.has(data_key0):
|
||||
var data_key1: String = DATA_KEY_FORMAT % [i_row, i_col]
|
||||
nodes_copy[data_key1] = nodes[data_key0]
|
||||
swaps.append([data_key0, data_key1])
|
||||
|
||||
i_col += 1
|
||||
if i_col == columns:
|
||||
i_col = 0
|
||||
i_row += 1
|
||||
nodes.clear()
|
||||
nodes.merge(nodes_copy)
|
||||
i_col += 1
|
||||
if i_col == columns:
|
||||
i_col = 0
|
||||
i_row += 1
|
||||
nodes.clear()
|
||||
nodes.merge(nodes_copy)
|
||||
|
||||
|
||||
func clear_rows() -> void:
|
||||
""" Удаляет все строки таблицы """
|
||||
var rows_count: int = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
remove_row(i_row)
|
||||
""" Удаляет все строки таблицы """
|
||||
var rows_count: int = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
remove_row(i_row)
|
||||
|
||||
|
||||
func set_callbacks(dest_node: Node, event_name: String, callback: String, clmns: Array, user_data: Array) -> void:
|
||||
""" Настраивает обратные вызовы для колонок.
|
||||
:dest_node: Получатель события
|
||||
:event_name: Имя события
|
||||
:callback: Имя функции получателя события
|
||||
:clmns: Индексы колонок
|
||||
:user_data: Аргументы функции получателя события """
|
||||
var rows_count = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
for i_col in clmns:
|
||||
assert(i_col >= 0 and i_col < columns, 'ошибка: нет колонки %d' % i_col)
|
||||
var node_key: String = NODE_KEY_FORMAT % [i_row, i_col]
|
||||
var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col]
|
||||
var node = nodes[node_key]
|
||||
if nodes.has(conn_key):
|
||||
var conn = nodes[conn_key]
|
||||
var prev_callback = conn[0]
|
||||
var prev_dest_node = conn[1]
|
||||
node.disconnect(event_name, Callable(prev_dest_node, prev_callback))
|
||||
assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data)))
|
||||
nodes[conn_key] = [callback, dest_node]
|
||||
""" Настраивает обратные вызовы для колонок.
|
||||
:dest_node: Получатель события
|
||||
:event_name: Имя события
|
||||
:callback: Имя функции получателя события
|
||||
:clmns: Индексы колонок
|
||||
:user_data: Аргументы функции получателя события """
|
||||
var rows_count = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
for i_col in clmns:
|
||||
assert(i_col >= 0 and i_col < columns, 'ошибка: нет колонки %d' % i_col)
|
||||
var node_key: String = NODE_KEY_FORMAT % [i_row, i_col]
|
||||
var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col]
|
||||
var node = nodes[node_key]
|
||||
if nodes.has(conn_key):
|
||||
var conn = nodes[conn_key]
|
||||
var prev_callback = conn[0]
|
||||
var prev_dest_node = conn[1]
|
||||
node.disconnect(event_name, Callable(prev_dest_node, prev_callback))
|
||||
assert (OK == node.connect(event_name, Callable(dest_node, callback).bind([node] + user_data)))
|
||||
nodes[conn_key] = [callback, dest_node]
|
||||
|
||||
|
||||
func set_rows_text(rows: Array) -> void:
|
||||
for i_row in rows.size():
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
node.text = rows[i_row][i_col]
|
||||
for i_row in rows.size():
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
node.text = rows[i_row][i_col]
|
||||
|
||||
|
||||
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)
|
||||
var node = nodes[key]
|
||||
node.custom_minimum_size.x = sizes[i_col]
|
||||
node.size.x = sizes[i_col]
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(key_format, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
node.custom_minimum_size.x = sizes[i_col]
|
||||
node.size.x = sizes[i_col]
|
||||
|
||||
|
||||
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
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].text = val
|
||||
|
||||
|
||||
func set_rows_state(rows: Array) -> void:
|
||||
for i_row in rows.size():
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].button_pressed = rows[i_row][i_col]
|
||||
for i_row in rows.size():
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].button_pressed = rows[i_row][i_col]
|
||||
|
||||
|
||||
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
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].button_pressed = val
|
||||
|
||||
|
||||
func set_node_frame(i_col: int, i_row: int, node_name: String, val: int) -> void:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
var sprite = node.get_node(node_name)
|
||||
sprite.frame = val
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
var sprite = node.get_node(node_name)
|
||||
sprite.frame = val
|
||||
|
||||
|
||||
func set_node_editable(i_col: int, i_row: int, val: bool) -> void:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].editable = val
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].editable = val
|
||||
|
||||
|
||||
func set_node_alligment(i_col: int, i_row: int, val: int) -> void:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
if 'horizontal_alignment' in nodes[key]:
|
||||
nodes[key].horizontal_alignment = val
|
||||
elif 'alignment' in nodes[key]:
|
||||
nodes[key].alignment = val
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
if 'horizontal_alignment' in nodes[key]:
|
||||
nodes[key].horizontal_alignment = val
|
||||
elif 'alignment' in nodes[key]:
|
||||
nodes[key].alignment = val
|
||||
|
||||
|
||||
func set_row_alligments(i_row: int, aligns: Array) -> void:
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].align = aligns[i_col]
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
nodes[key].align = aligns[i_col]
|
||||
|
||||
|
||||
func get_row_text(i_row: int) -> Array:
|
||||
var row: = []
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
row.append(nodes[key].text)
|
||||
return row
|
||||
var row: = []
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
row.append(nodes[key].text)
|
||||
return row
|
||||
|
||||
|
||||
func set_row_text(i_row: int, row: Array, i_begin: int = 0, key_format: String = NODE_KEY_FORMAT) -> void:
|
||||
assert((i_begin + row.size()) < columns)
|
||||
for i_col in columns - i_begin:
|
||||
var key: = get_node_key(key_format, i_col + i_begin, i_row)
|
||||
nodes[key].text = row[i_col]
|
||||
for i_col in columns - i_begin:
|
||||
var key: = get_node_key(key_format, i_col + i_begin, i_row)
|
||||
nodes[key].text = row[i_col]
|
||||
|
||||
|
||||
func get_rows_text() -> Array:
|
||||
var rows_count: = get_rows_count()
|
||||
var rows: = []
|
||||
for i_row in rows_count:
|
||||
var row = get_row_text(i_row)
|
||||
rows.append(row)
|
||||
return rows
|
||||
var rows_count: = get_rows_count()
|
||||
var rows: = []
|
||||
for i_row in rows_count:
|
||||
var row = get_row_text(i_row)
|
||||
rows.append(row)
|
||||
return rows
|
||||
|
||||
|
||||
func get_row(i_row: int) -> Array:
|
||||
var row: = []
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
row.append(nodes[key])
|
||||
return row
|
||||
var row: = []
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
row.append(nodes[key])
|
||||
return row
|
||||
|
||||
|
||||
func get_node_rect(i_col: int, i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void:
|
||||
assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата')
|
||||
var key: = get_node_key(key_format, i_col, i_row)
|
||||
var cell = nodes[key]
|
||||
rect[0] = cell.position.x
|
||||
rect[1] = cell.position.y
|
||||
rect[2] = cell.size.x
|
||||
rect[3] = cell.size.y
|
||||
assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата')
|
||||
var key: = get_node_key(key_format, i_col, i_row)
|
||||
var cell = nodes[key]
|
||||
rect[0] = cell.position.x
|
||||
rect[1] = cell.position.y
|
||||
rect[2] = cell.size.x
|
||||
rect[3] = cell.size.y
|
||||
|
||||
|
||||
func get_row_rect(i_row: int, rect: Array, key_format: String = NODE_KEY_FORMAT) -> void:
|
||||
assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата')
|
||||
var cell0 = nodes[get_node_key(key_format, 0, i_row)]
|
||||
var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)]
|
||||
rect[0] = cell0.position.x
|
||||
rect[1] = cell0.position.y
|
||||
rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x
|
||||
rect[3] = cell0.size.y
|
||||
assert(rect.size() >= 4, 'ошибка: мало элементов для возврата результата')
|
||||
var cell0 = nodes[get_node_key(key_format, 0, i_row)]
|
||||
var cell1 = nodes[get_node_key(key_format, columns - 1, i_row)]
|
||||
rect[0] = cell0.position.x
|
||||
rect[1] = cell0.position.y
|
||||
rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x
|
||||
rect[3] = cell0.size.y
|
||||
|
||||
Reference in New Issue
Block a user