From ceaec55b6915773191ec751eaddc27fd1ea8c8e4 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 18 Aug 2023 11:11:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B2=D1=8B=D0=BB=D0=B5=D1=82=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B0=D0=B6=D0=B0=D1=82=D0=B8=D0=B8=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D0=B8=D1=82=D1=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.tscn | 18 +++++++++--------- table/table.gd | 42 ++++++++++++++++++++++++++---------------- threats.gd | 4 ++++ кнопка-4.tscn | 8 ++++---- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/main.tscn b/main.tscn index 5ab2c2f..16586ea 100644 --- a/main.tscn +++ b/main.tscn @@ -1,12 +1,12 @@ [gd_scene load_steps=5 format=3 uid="uid://87gtvqd7bbje"] -[ext_resource type="Script" path="res://main.gd" id="1_8p35p"] -[ext_resource type="Script" path="res://table/table.gd" id="2_xq1tk"] -[ext_resource type="Texture2D" uid="uid://cex4jiu1pcj3x" path="res://edit-add-0.png" id="3_f3g8t"] -[ext_resource type="Texture2D" uid="uid://cx746np1wexnd" path="res://edit-add-1.png" id="4_4ja4j"] +[ext_resource type="Script" path="res://main.gd" id="1_v038r"] +[ext_resource type="Script" path="res://table/table.gd" id="2_mfyp6"] +[ext_resource type="Texture2D" uid="uid://cex4jiu1pcj3x" path="res://edit-add-0.png" id="3_6tmn6"] +[ext_resource type="Texture2D" uid="uid://cx746np1wexnd" path="res://edit-add-1.png" id="4_1x5i2"] [node name="main" type="Node2D"] -script = ExtResource("1_8p35p") +script = ExtResource("1_v038r") [node name="tabs" type="TabContainer" parent="."] offset_right = 1594.0 @@ -26,7 +26,7 @@ offset_right = 1.0 offset_bottom = 10.0 grow_horizontal = 2 grow_vertical = 2 -script = ExtResource("2_xq1tk") +script = ExtResource("2_mfyp6") node_type_file = "res://ячейка-1.tscn" [node name="btn_add" type="TextureButton" parent="tabs/threats"] @@ -35,8 +35,8 @@ offset_left = 1533.0 offset_top = -2.0 offset_right = 1581.0 offset_bottom = 46.0 -texture_normal = ExtResource("3_f3g8t") -texture_pressed = ExtResource("4_4ja4j") +texture_normal = ExtResource("3_6tmn6") +texture_pressed = ExtResource("4_1x5i2") [node name="btn_del" type="TextureButton" parent="tabs/threats"] layout_mode = 0 @@ -54,5 +54,5 @@ layout_mode = 0 offset_top = 100.0 offset_right = 1587.0 offset_bottom = 861.0 -script = ExtResource("2_xq1tk") +script = ExtResource("2_mfyp6") node_type_file = "res://ячейка-1.tscn" diff --git a/table/table.gd b/table/table.gd index 68001e5..bc82f03 100644 --- a/table/table.gd +++ b/table/table.gd @@ -2,10 +2,10 @@ extends GridContainer ## Виджет "Таблица" -@export var node_gap: = Vector2(0.0, 0.0) ## Зазор между ячейками, который не возможно вычислить или получить -@export var selector_color: = Color(1.0, 1.0, 1.0, 1.0) ## Окрашивающий цвет для индикатора выбранного ряда -@export var selector_key_down: Key = KEY_DOWN ## Клавиша увеличения индекса выбранного ряда -@export var selector_key_up: Key = KEY_UP ## Клавиша уменьшения индекса выбранного ряда +@export var node_gap: = Vector2(0.0, 0.0) ## Зазор между ячейками, который не возможно вычислить или получить +@export var selector_color: = Color(1.0, 1.0, 1.0, 1.0) ## Окрашивающий цвет для индикатора выбранного ряда +@export var selector_key_down: Key = KEY_DOWN ## Клавиша увеличения индекса выбранного ряда +@export var selector_key_up: Key = KEY_UP ## Клавиша уменьшения индекса выбранного ряда @export_file var node_type_file: = 'res://table/node.tscn': get = get_node_scene, set = load_node_scene ## Сцена ячейки устанавливаемая по умолчанию @export_file var selector_type_file: = 'res://table/selector.tscn': set = load_selector_scene ## Сцена индикатора для выбранного ряда @@ -18,8 +18,9 @@ const SLCT_PREFIX = 'SLCT_' ## Префикс ключа индикато const HEAD_KEY_FORMAT = HEAD_PREFIX + INDEX_FORMAT ## Формат ключа заголовка const NODE_KEY_FORMAT = NODE_PREFIX + INDEX_FORMAT ## Формат ключа ячейки const ROW_SELECTOR_KEY_FORMAT = SLCT_PREFIX + INDEX_FORMAT ## Формат ключа индикаторов выбранного ряда -const META_NAME_USER_DATA = 'user_data' -const META_NAME_CALLEBLE = 'calleble' +const META_USER_DATA = 'user_data' ## Имя свойства для сохранения данных пользователя +const META_CALLABLE = 'callable' ## Имя свойства для сохранения вызываемого +const META_EVENT_NAME = 'event_name' ## Имя свойства для сохранения названия события var header: GridContainer ## Заголовок таблицы var in_focus: = false ## Фокус пользовательского ввода @@ -38,8 +39,8 @@ var scroll_adj: = Vector2(0, 0) func get_node_scene(): return node_type_file func _assert_meta(i_col: int, i_row: int, pname: String, node): assert(node.has_meta(pname), 'ошибка: нет мета-свойства \"%s\" у ячейки колонка:%d ряд:%d' % [pname, i_col, i_row]) -func get_node_user_data(i_col: int, i_row: int): return get_node_meta(i_col, i_row, META_NAME_USER_DATA) -func set_node_user_data(i_col: int, i_row: int, val) -> void: set_node_meta(i_col, i_row, META_NAME_USER_DATA, val) +func get_node_user_data(i_col: int, i_row: int): return get_node_meta(i_col, i_row, META_USER_DATA) +func set_node_user_data(i_col: int, i_row: int, val) -> void: set_node_meta(i_col, i_row, META_USER_DATA, val) ## Закрепляет заголовок таблицы. [param scrl] - Прокрутка, @@ -48,7 +49,7 @@ func pin_header(scrl: ScrollContainer, prnt: Control): scrl.remove_child(header) prnt.add_child(header) ## TODO: Это значение следует получить из темы - var v_separation: = 3.0 + var v_separation = get_theme_constant('v_separation') header.position = scrl.position - Vector2(0, header.size.y + v_separation) scroll = scrl scroll_adj = scrl.position @@ -68,6 +69,9 @@ func selector_up(): if i_row < 0: i_row = rows_count - 1 set_row_selected(i_row, true) + var node = get_node2(0, i_row) + if scroll is ScrollContainer: + scroll.ensure_control_visible(node) emit_signal('selected_changed', i_row) @@ -84,6 +88,9 @@ func selector_down(): i_row += 1 i_row %= rows_count set_row_selected(i_row, true) + var node = get_node2(0, i_row) + if scroll is ScrollContainer: + scroll.ensure_control_visible(node) emit_signal('selected_changed', i_row) @@ -184,7 +191,7 @@ func set_columns_aligment(alignments: Array) -> void: ## func _input(event) -> void: if event is InputEventKey: - if in_focus and event.pressed: + if event.pressed and in_focus: if event.keycode == selector_key_up: selector_up() elif event.keycode == selector_key_down: @@ -392,9 +399,10 @@ func remove_row(i_row: int): var conn = get_node_meta(i_col, i_row, 'callable_focus_entered') node.disconnect('focus_entered', conn) - if node.has_meta(META_NAME_CALLEBLE): - conn = node.get_meta(META_NAME_CALLEBLE) - node.disconnect('pressed', conn) + if node.has_meta(META_CALLABLE): + conn = node.get_meta(META_CALLABLE) + var event_name = node.get_meta(META_EVENT_NAME) + node.disconnect(event_name, conn) remove_child(node) nodes.erase(node_key) @@ -459,12 +467,14 @@ func connect_columns(dest_node: Node, event_name: String, callback: String, clmn for i_col in clmns: assert(i_col >= 0 and i_col < columns, 'ошибка: нет такой колонки: %d' % i_col) var node = get_node2(i_col, i_row) - if node.has_meta(META_NAME_CALLEBLE): - var conn = node.get_meta(META_NAME_CALLEBLE) + if node.has_meta(META_CALLABLE): + var conn = node.get_meta(META_CALLABLE) node.disconnect(event_name, conn) var conn = Callable(dest_node, callback).bind([node] + user_data) assert (OK == node.connect(event_name, conn)) - node.set_meta(META_NAME_CALLEBLE, conn) + node.set_meta(META_CALLABLE, conn) + node.set_meta(META_EVENT_NAME, event_name) + ## func set_rows_text(rows: Array) -> void: diff --git a/threats.gd b/threats.gd index 37b9007..eb4b31a 100644 --- a/threats.gd +++ b/threats.gd @@ -362,6 +362,7 @@ func on_btn_add(table): var row = threat.update_rows() table.add_row(TABLE_ROW_TYPES) table.set_row_text(table.get_rows_count()-1, row) + table.set_node_user_data(0, table.get_rows_count()-1, threat) init_opt_btns(table.get_rows_count()-1, table) table.connect_columns(self, 'text_submitted', 'on_edit_entry', TABLE_ENTRY_COLUMNS, []) table.connect_columns(self, 'item_selected', 'on_item_selected', COLUMN_OPT_BTN, []) @@ -374,6 +375,9 @@ func on_btn_del(table): var cell = table.get_node2(0, row_i[0]) treats.erase(cell.text) table.remove_row(row_i[0]) + for i in table.get_rows_count(): + var treat = table.get_node_user_data(0, i) + treat.row_id = i func pop_id(): diff --git a/кнопка-4.tscn b/кнопка-4.tscn index f5ca0b1..12e69e1 100644 --- a/кнопка-4.tscn +++ b/кнопка-4.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://ccxre8mwhndjk"] -[ext_resource type="Texture2D" uid="uid://dag8n0gknjwak" path="res://индикатор-1-0.png" id="1_i48re"] -[ext_resource type="Texture2D" uid="uid://b3ext3w4ftgg2" path="res://индикатор-1-1.png" id="2_be5ku"] +[ext_resource type="Texture2D" uid="uid://dag8n0gknjwak" path="res://индикатор-1-0.png" id="1_dgtjm"] +[ext_resource type="Texture2D" uid="uid://b3ext3w4ftgg2" path="res://индикатор-1-1.png" id="2_aqu5u"] [node name="indicator_1" type="TextureButton"] modulate = Color(1, 0.596078, 0.4, 1) @@ -9,5 +9,5 @@ offset_right = 35.0 offset_bottom = 29.0 toggle_mode = true button_mask = 0 -texture_normal = ExtResource("1_i48re") -texture_pressed = ExtResource("2_be5ku") +texture_normal = ExtResource("1_dgtjm") +texture_pressed = ExtResource("2_aqu5u")