Доработка. Новая версия вкладки ЭМС.

This commit is contained in:
MaD_CaT
2023-08-10 11:29:44 +03:00
parent b1f4eac5b0
commit a4f9e435b6
11 changed files with 452 additions and 742 deletions

View File

@@ -31,6 +31,8 @@ capsrpb="*res://scripts/capsrpb.gd"
Table="*res://table/table.gd"
Threats="*res://scripts/threats.gd"
YemsDevs="*res://scripts/yems_devs.gd"
Yemsboards="*res://scripts/yemsboards.gd"
YemsConsts="*res://scripts/yems_consts.gd"
[debug]

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_wpbps"]
[ext_resource type="Texture2D" uid="uid://ct0ajcwno03h7" path="res://data/кнопка-квадрат-0.png" id="2_1xr6o"]
[ext_resource type="Script" path="res://scenes/nine-patch-button.gd" id="1_ugn6y"]
[ext_resource type="Texture2D" uid="uid://ct0ajcwno03h7" path="res://data/кнопка-квадрат-0.png" id="2_aupr1"]
[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_wpbps")
script = ExtResource("1_ugn6y")
toggle_mode = true
[node name="state" type="NinePatchRect" parent="."]
show_behind_parent = true
layout_mode = 2
texture = ExtResource("2_1xr6o")
texture = ExtResource("2_aupr1")
patch_margin_left = 10
patch_margin_top = 10
patch_margin_right = 10

View File

@@ -9,30 +9,30 @@ var FILES_ROWS_ALIGNMENT = [ HORIZONTAL_ALIGNMENT_LEFT, HORIZONTAL_ALIGNM
func fill_files_table(tbl: Table, folder: String, rows_types: Array):
var dir: = DirAccess.open(folder)
if dir == null:
return
var files: = []
var exclude_names: = ['.', '..']
dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547
while true:
var file: = dir.get_next()
if file == '':
break
if file in exclude_names:
continue
var file_name = folder + '/' + file
var fd = FileAccess.open(file_name, FileAccess.READ)
if not fd:
continue
var glob_path = ProjectSettings.globalize_path(file_name)
var sz = fd.get_length()
var ut = fd.get_modified_time(file_name)
fd.close()
var mt = Time.get_datetime_dict_from_unix_time(ut)
var file_row = [file, '%d' % sz, '%d-%02d-%02d %02d:%02d' % [mt.year, mt.month, mt.day, mt.hour, mt.minute]]
tbl.add_row(rows_types)
var i_row = tbl.get_rows_count() - 1
tbl.set_row_text(i_row, file_row)
tbl.set_node_meta(0, i_row, 'file_path', glob_path)
dir.list_dir_end()
var dir: = DirAccess.open(folder)
if dir == null:
return
var files: = []
var exclude_names: = ['.', '..']
dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547
while true:
var file: = dir.get_next()
if file == '':
break
if file in exclude_names:
continue
var file_name = folder + '/' + file
var fd = FileAccess.open(file_name, FileAccess.READ)
if not fd:
continue
var glob_path = ProjectSettings.globalize_path(file_name)
var sz = fd.get_length()
var ut = fd.get_modified_time(file_name)
fd.close()
var mt = Time.get_datetime_dict_from_unix_time(ut)
var file_row = [file, '%d' % sz, '%d-%02d-%02d %02d:%02d' % [mt.year, mt.month, mt.day, mt.hour, mt.minute]]
tbl.add_row(rows_types)
var i_row = tbl.get_rows_count() - 1
tbl.set_row_text(i_row, file_row)
tbl.set_node_meta(0, i_row, 'file_path', glob_path)
dir.list_dir_end()

View File

@@ -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)

View File

@@ -3,13 +3,13 @@ extends TabContainer
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass
pass
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta: float) -> void:
pass
pass
func _enter_tree() -> void:
REPNetwork.logger_page = $'журнал'
REPNetwork.logger_page = $'журнал'

View File

@@ -1,27 +1,27 @@
[gd_scene load_steps=6 format=3 uid="uid://3slb0i3pvowc"]
[ext_resource type="Script" path="res://scenes/tab_switch.gd" id="1_33fiq"]
[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" path="res://scenes/ЭМС.tscn" id="4_2bmbm"]
[ext_resource type="Script" path="res://scenes/tab_switch.gd" id="1_siu2d"]
[ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа.tscn" id="2_c0cdr"]
[ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль.tscn" id="3_44o58"]
[ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал.tscn" id="4_vpsr1"]
[ext_resource type="PackedScene" uid="uid://dab6loryocc73" path="res://scenes/ЭМС.tscn" id="5_jlo8o"]
[node name="tab_switch" type="TabContainer"]
offset_right = 1600.0
offset_bottom = 1200.0
script = ExtResource("1_33fiq")
script = ExtResource("1_siu2d")
[node name="работа" parent="." instance=ExtResource("1_uow82")]
[node name="работа" parent="." instance=ExtResource("2_c0cdr")]
layout_mode = 2
[node name="контроль" parent="." instance=ExtResource("2_83m7a")]
[node name="контроль" parent="." instance=ExtResource("3_44o58")]
visible = false
layout_mode = 2
[node name="журнал" parent="." instance=ExtResource("3_hgnup")]
[node name="журнал" parent="." instance=ExtResource("4_vpsr1")]
visible = false
layout_mode = 2
[node name="ЭМС" parent="." instance=ExtResource("4_2bmbm")]
[node name="ЭМС" parent="." instance=ExtResource("5_jlo8o")]
visible = false
layout_mode = 2

View File

@@ -1,190 +0,0 @@
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 CellOptBtn = preload('res://scenes/кнопка-5.tscn')
# Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС
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']],
[8,['4302-01, 4302-04, УИЗП', 'X46', '0', '0']],
[11,['НРЛС МР-231S, УИЗП', 'X51', '0', '0']],
[12,['НРЛС МР-231S, Строб ЭМС', 'X52', '0', '0']],
[13,['НРЛС МР-231-3, УИЗП', 'X54', '0', '0']],
[14,['НРЛС МР-231-3, Строб ЭМС', 'X55', '0', '0']],
[15,['ЦИСВС-1010, УИЗП', 'X23', '0', '0']],
[21,['НРЛС МР-231S, УИЗП', 'X21', '0', '0']],
[22,['НРЛС МР-231S, Строб ЭМС', 'X22', '0', '0']],
[23,['НРЛС МР-231-3, УИЗП', 'X24', '0', '0']],
[24,['НРЛС МР-231-3, Строб ЭМС', 'X25', '0', '0']],
[25,['ЦИСВС-1010, УИЗП', 'X23', '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']]]
# Режимы работы выходов
const OUT_MODE: Array = ['Работа', 'Контроль', '1', '0']
const COLUMN_OPTS_BTN: Array = [6]
const TABLE_ENTRY_COLUMNS: Array = [2,3,5]
var g_in_devices : Dictionary # Словарь с входными устройствами КЭМС
var g_out_devices : Dictionary # Словарь с выходными устройствами КЭМС
var posx: int = 50 # Позиция элементов по x
var posy: int = 80 # Позиция элементов по y
func _ready() -> void:
$tbl_in.set_position(Vector2(posx,posy))
$tbl_out.set_position(Vector2(posx,len(INPUT_ROWS)*33+posy+10))
$tbl_files.set_position(Vector2(posx + 890,len(INPUT_ROWS)*33+posy+300))
$btn_new.set_position(Vector2(posx + 1270,len(INPUT_ROWS)*33+posy+294))
$btn_save.set_position(Vector2(posx + 1270,len(INPUT_ROWS)*33+posy+344))
$btn_edit.set_position(Vector2(posx + 1270,len(INPUT_ROWS)*33+posy+394))
$lbl_online.set_position(Vector2(posx,posy-40))
$marker_in.set_position(Vector2(posx-15,posy+35))
$marker_out.set_position(Vector2(posx-15,len(INPUT_ROWS)*33+posy+45))
$btn_flash_read.set_position(Vector2(posx+1400,posy))
$btn_flash_write.set_position(Vector2(posx+1400,posy+35))
call_deferred('init_tbl_out')
call_deferred('init_tbl_in')
call_deferred('init_tbl_files')
$btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read))
$btn_flash_write.button_connect('pressed', Callable(self, 'on_btn_flash_write').bind($btn_flash_write))
$tbl_in.connect('row_pressed', Callable(self, 'on_row_pressed'))
$tbl_out.connect('row_pressed', Callable(self, 'on_row_pressed'))
func on_btn_flash_read(btn):
await get_tree().create_timer(0.1).timeout
btn.pressed = false
func on_btn_flash_write(btn):
await get_tree().create_timer(0.1).timeout
btn.pressed = false
func on_row_pressed(i_row: int):
$tbl_in.set_row_selected(i_row, false)
func init_tbl_files():
$tbl_files.set_header([TableHeader, TableHeader, TableHeader])
$tbl_files.set_header_text(['Имя файла', 'Размер', 'Дата'])
$tbl_files.set_columns_min_size([200, 70, 100])
func init_tbl_out():
var header_text = ['Выходы', 'Разъём', 'мкс', 'мкс', 'Состояние', 'Частота, Мгц', 'Режим']
$tbl_out.set_header([TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader, TableHeader])
$tbl_out.set_header_text(header_text)
for item in OUTPUT_ROWS:
$tbl_out.add_row([TableNode, TableNode, CellLineEdit, CellLineEdit, CellState, CellLineEdit, CellOptBtn])
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(header_text)):
if i < len(params):
var cell = $tbl_out.get_node2(i, row_index)
cell.text = params[i]
$tbl_out.set_node_user_data(i, row_index, out_dev)
if i in COLUMN_OPTS_BTN:
var cell = $tbl_out.get_node2(i, row_index)
for opt in OUT_MODE:
cell.add_item(opt)
cell.select(0)
$tbl_out.set_columns_min_size([270, 100, 70, 70, 100, 100, 100])
$tbl_out.connect_columns(self, 'text_submitted', 'on_edit_entry_in', TABLE_ENTRY_COLUMNS, [])
$tbl_out.connect_columns(self, 'item_selected', 'on_item_selected', COLUMN_OPTS_BTN, [])
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, 300]
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(row_type)):
if i < len(params):
var node = $tbl_in.get_node2(i, row_index)
node.text = params[i]
if i in dot_collums:
var btn = $tbl_in.get_node2(i, row_index)
var out_dev = g_out_devices[OUTPUT_ROWS[i-column_offset][0]]
in_dev.out_dots = [btn, out_dev]
btn.button_connect('pressed', Callable(self, 'on_dot_button').bind(btn, i, row_index))
btn.connect('mouse_entered', Callable(self, 'on_mouse_entered').bind(btn, i - dot_collums[0], row_index))
$tbl_in.set_node_user_data(i, row_index, in_dev)
$tbl_in.set_columns_min_size(column_size)
$tbl_in.connect_columns(self, 'text_submitted', 'on_edit_entry_in', TABLE_ENTRY_COLUMNS, [])
func on_dot_button(btn, i: int, j: int):
""" Вызывается при нажатии на кнопку-точку (соединение)
i - индекс входа, j - индекс выхода """
print('on_dot_button(%d, %d)' % [i, j])
func on_edit_entry_in(text : String, entry):
var indexis = $tbl_in.get_key_indexes(entry[0].name)
var row_i = indexis[1]
var col_i = indexis[0]
print('ЭМС.gd -> on_edit_entry_in', text, row_i, col_i)
func on_edit_entry_out(text : String, entry):
var indexis = $tbl_out.get_key_indexes(entry[0].name)
var row_i = indexis[1]
var col_i = indexis[0]
print('ЭМС.gd -> on_edit_entry_out', text, row_i, col_i)
func on_item_selected(item_num, node):
var optbtn_text = node[0].text
var indexis = $tbl_out.get_key_indexes(node[0].name)
var row_i = indexis[1]
var col_i = indexis[0]
print('ЭМС.gd -> on_item_selected row: %d col: %d text: %s' %[row_i, col_i, optbtn_text])
func on_mouse_entered(btn, i, j):
$marker_in.position.y = $tbl_in.position.y + btn.position.y + btn.size.y / 2
$marker_out.position.y = $tbl_out.position.y + (btn.size.y + 4) * i + btn.size.y / 2
func _process(delta):
pass

View File

@@ -1,102 +0,0 @@
[gd_scene load_steps=8 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"]
[ext_resource type="Texture2D" uid="uid://dahjma3aqkfc0" path="res://data/эмс-указатель.png" id="3_j3w75"]
[ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button_flat.tscn" id="4_v64lt"]
[ext_resource type="Texture2D" uid="uid://dd60btbqnpiqw" path="res://data/document-new-0.png" id="5_osu07"]
[ext_resource type="Texture2D" uid="uid://coqg6wsftvtxr" path="res://data/document-save-0.png" id="6_8684b"]
[ext_resource type="Texture2D" uid="uid://cywuevvpkxl7v" path="res://data/edit-copy-0.png" id="7_85ydm"]
[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")
[node name="tbl_files" type="GridContainer" parent="."]
layout_mode = 0
offset_left = 1050.0
offset_top = 993.0
offset_right = 1602.0
offset_bottom = 1093.0
script = ExtResource("2_6x8yw")
[node name="marker_in" type="Sprite2D" parent="."]
modulate = Color(0.964706, 0.490196, 0, 1)
position = Vector2(19, 37)
texture = ExtResource("3_j3w75")
[node name="marker_out" type="Sprite2D" parent="."]
modulate = Color(0.964706, 0.490196, 0, 1)
position = Vector2(19, 77)
texture = ExtResource("3_j3w75")
[node name="btn_flash_read" parent="." instance=ExtResource("4_v64lt")]
layout_mode = 0
offset_left = 1446.0
offset_top = 55.0
offset_right = 1583.0
offset_bottom = 85.0
text = "Прочитать"
[node name="btn_flash_write" parent="." instance=ExtResource("4_v64lt")]
layout_mode = 0
offset_left = 1446.0
offset_top = 99.0
offset_right = 1583.0
offset_bottom = 129.0
text = "Записать"
[node name="btn_new" type="Button" parent="."]
layout_mode = 0
offset_left = 1453.0
offset_top = 960.0
offset_right = 1509.0
offset_bottom = 1016.0
focus_mode = 0
shortcut_feedback = false
shortcut_in_tooltip = false
icon = ExtResource("5_osu07")
[node name="btn_save" type="Button" parent="."]
layout_mode = 0
offset_left = 1453.0
offset_top = 1017.0
offset_right = 1509.0
offset_bottom = 1073.0
focus_mode = 0
icon = ExtResource("6_8684b")
[node name="btn_edit" type="Button" parent="."]
layout_mode = 0
offset_left = 1454.0
offset_top = 1074.0
offset_right = 1510.0
offset_bottom = 1130.0
focus_mode = 0
icon = ExtResource("7_85ydm")

View File

@@ -1,11 +1,11 @@
[gd_scene load_steps=7 format=3 uid="uid://lwmw4egynmd1"]
[ext_resource type="Script" path="res://scenes/контроль.gd" id="1_i5eo5"]
[ext_resource type="Texture2D" uid="uid://bar8k5qef7kch" path="res://data/УФ.png" id="2_drana"]
[ext_resource type="Texture2D" uid="uid://dkqlvd750pplc" path="res://data/СПТ.png" id="3_v54hc"]
[ext_resource type="Texture2D" uid="uid://b4isaggma6q3" path="res://data/Грани22.png" id="4_kwlmx"]
[ext_resource type="Texture2D" uid="uid://d2jxmtd6n5jd1" path="res://data/Щ3.png" id="5_8abdt"]
[ext_resource type="Texture2D" uid="uid://bos68thpqqvn" path="res://data/ПРД.png" id="6_sgnkf"]
[ext_resource type="Script" path="res://scenes/контроль.gd" id="1_x5d6w"]
[ext_resource type="Texture2D" uid="uid://bar8k5qef7kch" path="res://data/УФ.png" id="2_0nvm1"]
[ext_resource type="Texture2D" uid="uid://dkqlvd750pplc" path="res://data/СПТ.png" id="3_hhadv"]
[ext_resource type="Texture2D" uid="uid://b4isaggma6q3" path="res://data/Грани22.png" id="4_l0nc7"]
[ext_resource type="Texture2D" uid="uid://d2jxmtd6n5jd1" path="res://data/Щ3.png" id="5_kvnex"]
[ext_resource type="Texture2D" uid="uid://bos68thpqqvn" path="res://data/ПРД.png" id="6_i1yfn"]
[node name="Контроль" type="Panel"]
anchors_preset = 15
@@ -13,7 +13,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_i5eo5")
script = ExtResource("1_x5d6w")
metadata/_edit_lock_ = true
[node name="pribor_uf" type="TextureButton" parent="."]
@@ -24,7 +24,7 @@ offset_right = 1191.0
offset_bottom = 657.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("2_drana")
texture_normal = ExtResource("2_0nvm1")
stretch_mode = 4
[node name="pribor_rtr" type="TextureButton" parent="."]
@@ -35,7 +35,7 @@ offset_right = 1198.0
offset_bottom = 361.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("3_v54hc")
texture_normal = ExtResource("3_hhadv")
stretch_mode = 4
[node name="pribor_afsp_l" type="TextureButton" parent="."]
@@ -47,7 +47,7 @@ offset_bottom = 860.0
scale = Vector2(0.2, 0.2)
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("4_kwlmx")
texture_normal = ExtResource("4_l0nc7")
stretch_mode = 4
[node name="pribor_afsp_r" type="TextureButton" parent="."]
@@ -59,7 +59,7 @@ offset_bottom = 865.0
scale = Vector2(0.2, 0.2)
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("4_kwlmx")
texture_normal = ExtResource("4_l0nc7")
stretch_mode = 4
[node name="pribor_sch3" type="TextureButton" parent="."]
@@ -70,7 +70,7 @@ offset_right = 1208.0
offset_bottom = 951.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("5_8abdt")
texture_normal = ExtResource("5_kvnex")
stretch_mode = 4
[node name="pribor_spt_l" type="TextureButton" parent="."]
@@ -81,7 +81,7 @@ offset_right = 1053.0
offset_bottom = 951.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("3_v54hc")
texture_normal = ExtResource("3_hhadv")
stretch_mode = 4
[node name="pribor_spt_r" type="TextureButton" parent="."]
@@ -92,7 +92,7 @@ offset_right = 1353.0
offset_bottom = 951.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("3_v54hc")
texture_normal = ExtResource("3_hhadv")
stretch_mode = 4
[node name="pribor_prd_v_2" type="TextureButton" parent="."]
@@ -103,7 +103,7 @@ offset_right = 872.0
offset_bottom = 377.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
[node name="pribor_prd_n_2" type="TextureButton" parent="."]
@@ -114,7 +114,7 @@ offset_right = 827.0
offset_bottom = 553.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
[node name="pribor_prd_k_2" type="TextureButton" parent="."]
@@ -125,7 +125,7 @@ offset_right = 952.0
offset_bottom = 555.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
[node name="pribor_prd_v_3" type="TextureButton" parent="."]
@@ -136,7 +136,7 @@ offset_right = 1494.0
offset_bottom = 896.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
@@ -148,7 +148,7 @@ offset_right = 1417.0
offset_bottom = 721.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
@@ -160,7 +160,7 @@ offset_right = 1537.0
offset_bottom = 721.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
@@ -172,7 +172,7 @@ offset_right = 1522.0
offset_bottom = 391.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
@@ -184,7 +184,7 @@ offset_right = 1412.0
offset_bottom = 553.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
@@ -196,7 +196,7 @@ offset_right = 1537.0
offset_bottom = 562.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
@@ -208,7 +208,7 @@ offset_right = 882.0
offset_bottom = 896.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
[node name="pribor_prd_n_4" type="TextureButton" parent="."]
@@ -219,7 +219,7 @@ offset_right = 827.0
offset_bottom = 723.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
[node name="pribor_prd_k_4" type="TextureButton" parent="."]
@@ -230,7 +230,7 @@ offset_right = 962.0
offset_bottom = 723.0
size_flags_horizontal = 15
size_flags_vertical = 15
texture_normal = ExtResource("6_sgnkf")
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
[node name="pribor_sch" type="Panel" parent="."]

View File

@@ -1,24 +1,24 @@
[gd_scene load_steps=6 format=2]
[gd_scene load_steps=6 format=3 uid="uid://cmtgncelo01jh"]
[sub_resource type="StyleBoxEmpty" id=1]
[sub_resource type="StyleBoxEmpty" id="3"]
[sub_resource type="StyleBoxEmpty" id=2]
[sub_resource type="StyleBoxEmpty" id="5"]
[sub_resource type="StyleBoxEmpty" id=3]
[sub_resource type="StyleBoxEmpty" id="1"]
[sub_resource type="StyleBoxEmpty" id=4]
[sub_resource type="StyleBoxEmpty" id="2"]
[sub_resource type="StyleBoxEmpty" id=5]
[sub_resource type="StyleBoxEmpty" id="4"]
[node name="Node2D" type="OptionButton"]
self_modulate = Color( 1, 0.596078, 0.4, 1 )
self_modulate = Color(1, 0.596078, 0.4, 1)
custom_minimum_size = Vector2(60, 0)
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 )
theme_override_styles/focus = SubResource("3")
theme_override_styles/normal = SubResource("5")
theme_override_styles/hover = SubResource("1")
theme_override_styles/pressed = SubResource("2")
theme_override_styles/disabled = SubResource("4")

View File

@@ -37,524 +37,524 @@ var scroll_adj: = Vector2(0, 0)
func pin_header(scrl: ScrollContainer, prnt):
scrl.remove_child(header)
prnt.add_child(header)
# TODO: Это значение следует получить из темы
var v_separation: = 3.0
header.position = scrl.position - Vector2(0, header.size.y + v_separation)
scroll = scrl
scroll_adj = scrl.position
scrl.remove_child(header)
prnt.add_child(header)
# TODO: Это значение следует получить из темы
var v_separation: = 3.0
header.position = scrl.position - Vector2(0, header.size.y + v_separation)
scroll = scrl
scroll_adj = scrl.position
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_bottompos(hdr: Control, gap: = Vector2(0, 0)):
""" Выравнивает по нижнему левому углу.
Используется для выравнивания по заголовку """
position.x = hdr.position.x + gap.x
position.y = hdr.position.y + hdr.size.y + gap.y
""" Выравнивает по нижнему левому углу.
Используется для выравнивания по заголовку """
position.x = hdr.position.x + gap.x
position.y = hdr.position.y + hdr.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 check_event_pos(event.position, scroll):
if not in_focus:
in_focus = true
emit_signal('focus_entered')
elif not check_event_pos(event.position, scroll):
if in_focus:
in_focus = false
emit_signal('focus_exited')
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 check_event_pos(event.position, scroll):
if not in_focus:
in_focus = true
emit_signal('focus_entered')
elif not check_event_pos(event.position, scroll):
if in_focus:
in_focus = false
emit_signal('focus_exited')
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())
scroll = self
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())
scroll = self
func check_event_pos(event_pos: Vector2, obj: Control):
return \
(event_pos.x > obj.position.x) \
and (event_pos.x < (obj.position.x + obj.size.x)) \
and (event_pos.y > obj.position.y) \
and (event_pos.y < (obj.position.y + obj.size.y))
return \
(event_pos.x > obj.position.x) \
and (event_pos.x < (obj.position.x + obj.size.x)) \
and (event_pos.y > obj.position.y) \
and (event_pos.y < (obj.position.y + obj.size.y))
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] += position.x - node_gap.x / 2.0
rect[1] += position.y - node_gap.y / 2.0
rect[2] += node_gap.x
rect[3] += node_gap.y
get_row_rect(i_row, rect)
rect[0] += position.x - node_gap.x / 2.0
rect[1] += position.y - node_gap.y / 2.0
rect[2] += node_gap.x
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 node = nodes[NODE_KEY_FORMAT % [i_row, 0]]
if nodes.has(key) and (not selected):
var selector = nodes[key]
node.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.size.x = rect[2]
selector.size.y = rect[3]
selector.modulate = selector_color_proc.call(i_row)
selector.z_index = z_index + 1
nodes[key] = selector
node.add_child(selector)
var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0]
var node = nodes[NODE_KEY_FORMAT % [i_row, 0]]
if nodes.has(key) and (not selected):
var selector = nodes[key]
node.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.size.x = rect[2]
selector.size.y = rect[3]
selector.modulate = selector_color_proc.call(i_row)
selector.z_index = z_index + 1
nodes[key] = selector
node.add_child(selector)
func is_row_selected(i_row: int) -> bool:
var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0]
return nodes.has(key)
var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0]
return nodes.has(key)
func get_selected_rows(i_rows: Array) -> void:
for key in nodes.keys():
if SLCT_PREFIX in key:
var indexes = get_key_indexes(key)
i_rows.append(indexes[1])
for key in nodes.keys():
if SLCT_PREFIX in key:
var indexes = get_key_indexes(key)
i_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: = DATA_KEY_FORMAT % [i_row, i_col]
nodes[key] = user_data
func set_node_user_data(i_col: int, i_row: int, user_data) -> void:
var key: = DATA_KEY_FORMAT % [i_row, i_col]
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 head = nodes[HEAD_KEY_FORMAT % [0, i_col]]
node.custom_minimum_size.x = head.custom_minimum_size.x
node.size.x = head.size.x
var key: String = NODE_KEY_FORMAT % [rows_count, i_col]
node.name = key
add_child(node)
nodes[key] = node
node.connect('focus_entered', Callable(self, '_on_focus_entered').bind(key))
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 head = nodes[HEAD_KEY_FORMAT % [0, i_col]]
node.custom_minimum_size.x = head.custom_minimum_size.x
node.set_deferred('size.x', head.size.x)
var key: String = NODE_KEY_FORMAT % [rows_count, i_col]
node.name = key
add_child(node)
nodes[key] = node
node.connect('focus_entered', Callable(self, '_on_focus_entered').bind(key))
func _on_focus_entered(key):
var indexes = get_key_indexes(key)
emit_signal('row_pressed', indexes[1])
var indexes = get_key_indexes(key)
emit_signal('row_pressed', indexes[1])
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 = scroll.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 = scroll.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]
func get_node_user_data(i_col: int, i_row: int):
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]
var node_key: String = get_node_key(NODE_KEY_FORMAT, 0, i_row)
var node = nodes[node_key]
node.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]
var node_key: String = get_node_key(NODE_KEY_FORMAT, 0, i_row)
var node = nodes[node_key]
node.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 connect_columns(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.set_deferred('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 >= 0)
assert((columns - i_begin) <= row.size())
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]
assert(i_begin >= 0)
assert((columns - i_begin) <= row.size())
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 + scroll_adj.x
rect[1] = cell0.position.y + scroll_adj.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 + scroll_adj.x
rect[1] = cell0.position.y + scroll_adj.y
rect[2] = (cell1.position.x - cell0.position.x) + cell1.size.x
rect[3] = cell0.size.y