diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index 5dba8124..8ad0a9fd 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -119,13 +119,9 @@ func on_interfer_new(ecm, table_index): $table.set_row_editable(i_row, false) $table.set_node_user_data(0, i_row, ecm) table_index[ecm.ispp] = i_row - $table.cleanup_invalid_selectors() # Будем надеяться, что отложенные вызовы производятся в том же порядке - var selected_rows = [] - $table.get_selected_rows(selected_rows) - for old_row in selected_rows: - $table.set_row_selected(old_row, false) - $table.set_row_selected(i_row, true) + $table.call_deferred('clear_rows_selected') + $table.call_deferred('set_row_selected', i_row, true) if not interfer.auto_enabled: signaller.emit_signal('interfer_selected', ecm) diff --git a/table/table.gd b/table/table.gd index 2ce94dc9..80839cff 100644 --- a/table/table.gd +++ b/table/table.gd @@ -301,16 +301,6 @@ func default_selector_size_proc(i_row: int, rect: Array) -> void: rect[3] += node_gap.y -## Очищает в словаре nodes от невалидных ссылок -func cleanup_invalid_selectors(): - var keys_to_remove = [] - for key in nodes: - if key.begins_with(SLCT_PREFIX) and not is_instance_valid(nodes[key]): - keys_to_remove.append(key) - for key in keys_to_remove: - nodes.erase(key) - print_debug("Удален невалидный селектор: ", key) - ## func clear_rows_selected(): var rows_count: = get_rows_count() @@ -333,6 +323,7 @@ func _set_row_selected(i_row: int, selected: bool = true) -> void: return if nodes.has(selector_key) and (not selected): var selector = nodes[selector_key] + nodes.erase(selector_key) if is_instance_valid(selector): var prnt = selector.get_parent_control() if prnt: @@ -340,7 +331,6 @@ func _set_row_selected(i_row: int, selected: bool = true) -> void: selector.queue_free() else: push_warning('обращение к удалённому элементу \"%s\"' % selector_key) - nodes.erase(selector_key) elif (not nodes.has(selector_key)) and selected: var selector = ScnSelector.instantiate() var rect: = [0, 0, 0, 0] @@ -459,7 +449,6 @@ func remove_row(i_row: int): if nodes.has(sel_key): var selector = nodes[sel_key] - if selector == null: return var prnt = selector.get_parent() prnt.remove_child(selector) selector.queue_free() @@ -496,11 +485,8 @@ func next_index(indexes: Array) -> void: func swap_nodes(nodes_copy, node_key_format, i0, i1) -> void: var key0 = node_key_format % [i0.y, i0.x] var key1 = node_key_format % [i1.y, i1.x] - if is_instance_valid(nodes[key0]): - nodes_copy[key1] = nodes[key0] - nodes_copy[key1].name = key1 - else: - print_debug("Ошибка: нод ", key0, " был освобожден") + nodes_copy[key1] = nodes[key0] + nodes_copy[key1].name = key1 ## Переназначает ключи в соответствии с размерами таблицы.