В процессе

This commit is contained in:
sasha80
2023-08-08 08:52:53 +03:00
parent 04e9a3ad05
commit 29101b0a6e
13 changed files with 140 additions and 163 deletions

View File

@@ -36,6 +36,10 @@ var scroll: Control
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 pin_header(scrl: ScrollContainer, prnt):
scrl.remove_child(header)
prnt.add_child(header)
@@ -95,10 +99,6 @@ func load_node_scene(file_name: String):
ScnNode = load(file_name)
func get_node_scene():
return node_type_file
func _ready():
ScnSelector = load(selector_type_file)
ScnNode = load(node_type_file)
@@ -113,10 +113,6 @@ func align_to_left_bottompos(hdr: Control, gap: = Vector2(0, 0)):
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])
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]
@@ -287,22 +283,24 @@ func add_row(row_types: Array) -> void:
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))
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 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
var node_key: String = NODE_KEY_FORMAT % [i_row, i_col]
node.name = node_key
add_child(node)
nodes[key] = node
node.connect('focus_entered', Callable(self, '_on_focus_entered').bind(key))
nodes[node_key] = node
var conn = Callable(self, '_on_focus_entered').bind(node)
node.connect('focus_entered', conn)
set_node_meta(i_col, i_row, 'callable_focus_entered', conn)
func _on_focus_entered(key):
var indexes = get_key_indexes(key)
func _on_focus_entered(node):
var indexes = get_key_indexes(node.name)
emit_signal('row_pressed', indexes[1])
@@ -351,71 +349,87 @@ func get_node_user_data(i_col: int, i_row: int) -> Object:
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)
scroll.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()
for i_col in columns:
var node_key: String = NODE_KEY_FORMAT % [i_row, i_col]
var node = nodes[node_key]
var conn_key: String = CONNECTED_KEY_FORMAT % [i_row, i_col]
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):
var conn = nodes[conn_key]
var callback = conn[0]
var dest_node = conn[1]
node.disconnect('pressed', Callable(dest_node, callback))
conn = nodes[conn_key]
node.disconnect('pressed', conn)
nodes.erase(conn_key)
remove_child(node)
nodes.erase(node_key)
node.queue_free()
var swaps: = []
var c0 = nodes.size()
rehash(swaps)
var c1 = nodes.size()
assert(c0 == c1)
func next_index(indexes: Vector2i):
indexes.x += 1
if indexes.x == columns:
indexes.x = 0
indexes.y += 1
func swap_nodes(nodes_copy, swaps, node_key_format, i0, i1) -> bool:
var key0: = String(node_key_format % [i0.y, i0.x])
if not nodes.has(key0):
return false
var key1: = String(node_key_format % [i1.y, i0.x])
nodes_copy[key1] = nodes[key0]
nodes_copy[key1].name = key1
swaps.append([key0, key1])
return true
func rehash(swaps: Array):
# TODO: Не работает
""" Переназначает ключи в соответствии с размерами таблицы.
После вызова 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 i_node: = Vector2i()
var i_hdr: = Vector2i()
var i_slct: = Vector2i()
var i_conn: = Vector2i()
var i_data: = Vector2i()
var db = []
var nodes_copy = {}
print_debug('до: %s' % str(nodes.keys()))
for node in nodes.values():
var iv = get_key_indexes(node.name)
var i0 := Vector2i(iv[0], iv[1])
db.append(iv)
if swap_nodes(nodes_copy, swaps, HEAD_KEY_FORMAT, i0, i_hdr): next_index(i_hdr)
if swap_nodes(nodes_copy, swaps, NODE_KEY_FORMAT, i0, i_node): next_index(i_node)
#if swap_nodes(nodes_copy, swaps, ROW_SELECTOR_KEY_FORMAT, i0, i_slct): next_index(i_slct)
#if swap_nodes(nodes_copy, swaps, CONNECTED_KEY_FORMAT, i0, i_conn): next_index(i_conn)
#if swap_nodes(nodes_copy, swaps, DATA_KEY_FORMAT, i0, i_data): next_index(i_data)
print_debug(db)
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 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])
i_col += 1
if i_col == columns:
i_col = 0
i_row += 1
nodes.clear()
nodes.merge(nodes_copy)
print_debug('после: %s' % str(nodes.keys()))
func clear_rows() -> void: