diff --git a/table/table.gd b/table/table.gd index 5e9ef685..3f417726 100644 --- a/table/table.gd +++ b/table/table.gd @@ -10,7 +10,6 @@ extends GridContainer @export_file var selector_type_file: = 'res://table/selector.tscn': set = load_selector_scene ## Сцена индикатора для выбранного ряда const CONN_PREFIX = 'CONN_' ## Префикс ключа обработчиков событий ячейки таблицы -const DATA_PREFIX = 'DATA_' ## Префикс ключа данных ячейки таблицы const HEAD_PREFIX = 'HEAD_' ## Префикс ключа заголовка таблицы const INDEX_FORMAT = '%02d_%02d' ## Формат индекса ключа const MAX_INDEX = 99 ## Максимальное значение индекса для колонки и строки. Связано с форматом индекса ключа @@ -18,10 +17,10 @@ const NODE_PREFIX = 'NODE_' ## Префикс ключа ячейки та const SLCT_PREFIX = 'SLCT_' ## Префикс ключа индикатора выбранного ряда таблицы const CONNECTED_KEY_FORMAT = CONN_PREFIX + INDEX_FORMAT ## Формат ключа подключенных обработчиков сигналов -const DATA_KEY_FORMAT = DATA_PREFIX + INDEX_FORMAT ## Формат ключа данных 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' var header: GridContainer ## Заголовок таблицы var in_focus: = false ## Фокус пользовательского ввода @@ -40,6 +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) ## Закрепляет заголовок таблицы. [param scrl] - Прокрутка, @@ -237,7 +238,7 @@ func set_selector_size_proc(instance: Object, function: String) -> void: assert(selector_size_proc.is_valid()) -## [param i_row] - индекс ряда +## [param i_row] - Индекс ряда 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 @@ -253,7 +254,7 @@ func clear_rows_selected(): set_row_selected(i_row, false) -## [param i_row] - индекс ряда. +## [param i_row] - Индекс ряда. 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]] @@ -274,13 +275,13 @@ func set_row_selected(i_row: int, selected: bool = true) -> void: node.add_child(selector) -## [param i_row] - индекс ряда. +## [param i_row] - Индекс ряда. func is_row_selected(i_row: int) -> bool: var key: = ROW_SELECTOR_KEY_FORMAT % [i_row, 0] return nodes.has(key) -## [param i_row] - индексы рядов. +## [param i_row] - Индексы рядов. func get_selected_rows(i_rows: Array) -> void: for key in nodes.keys(): if SLCT_PREFIX in key: @@ -302,12 +303,6 @@ func get_node2(i_col: int, i_row: int) -> Node: return nodes[key] -## [param i_row] - индекс ряда. -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)) @@ -318,7 +313,9 @@ func add_row(row_types: Array) -> void: var i_row: int = get_rows_count() assert(i_row < MAX_INDEX, 'ошибка: слишком много рядов, больше %d' % (MAX_INDEX + 1)) for i_col in columns: - var node = row_types[i_col].instantiate() + var node_type = row_types[i_col] + var node = node_type.instantiate() + assert(node.name == node.name, 'ошибка: экземпляр не имеет поля \"name\"') var head = nodes[HEAD_KEY_FORMAT % [0, i_col]] node.custom_minimum_size.x = head.custom_minimum_size.x node.set_deferred('size.x', head.size.x) @@ -377,12 +374,6 @@ func set_header_text(headers: Array): set_row_text(0, headers, 0, HEAD_KEY_FORMAT) -## -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] @@ -403,10 +394,6 @@ func remove_row(i_row: int): var conn = get_node_meta(i_col, i_row, 'callable_focus_entered') node.disconnect('focus_entered', conn) - var data_key: String = DATA_KEY_FORMAT % [i_row, i_col] - if nodes.has(data_key): - nodes.erase(data_key) - if nodes.has(conn_key): conn = nodes[conn_key] node.disconnect('pressed', conn) @@ -440,7 +427,6 @@ func rehash(): var i_hdr: = [Vector2i()] var i_slct: = [Vector2i()] var i_conn: = [Vector2i()] - var i_data: = [Vector2i()] var nodes_copy = {} for key in nodes: var iv = get_key_indexes(key) @@ -457,9 +443,6 @@ func rehash(): elif CONN_PREFIX in key: swap_nodes(nodes_copy, CONNECTED_KEY_FORMAT, i0, i_conn[0]) next_index(i_conn) - elif DATA_PREFIX in key: - swap_nodes(nodes_copy, DATA_KEY_FORMAT, i0, i_data[0]) - next_index(i_data) nodes.clear() nodes.merge(nodes_copy) @@ -467,8 +450,7 @@ func rehash(): ## Удаляет все строки таблицы func clear_rows() -> void: var rows_count: int = get_rows_count() - print_debug(rows_count) - for i_row in rows_count: + for i_row in range(rows_count - 1, -1, -1): remove_row(i_row)