feat(virtual_table): Implement Ctrl+N local injection handler

- Ctrl+N creates injected row below current selection
- Uses startInjection() to initialize injection state
- Automatically starts editing first column
- Updates selection to show injected row as selected
- Adjusts visible row count when injection is active

No longer emits insert_row_requested - injection is handled
internally by the widget.
This commit is contained in:
reugenio 2025-12-28 02:25:44 +01:00
parent 5800d01a67
commit 47146b75c9

View file

@ -925,16 +925,21 @@ fn drawRows(
const table_ds = datasource.toDataSource(); const table_ds = datasource.toDataSource();
// Convertir selected_id a selected_row (índice global) // Convertir selected_id a selected_row (índice global)
const selected_row: i32 = if (list_state.findSelectedInWindow()) |window_idx| // Si hay una fila inyectada activa, esa es la seleccionada
const selected_row: i32 = if (list_state.injected_row_idx) |inj_idx|
@intCast(inj_idx)
else if (list_state.findSelectedInWindow()) |window_idx|
@intCast(list_state.windowToGlobalIndex(window_idx)) @intCast(list_state.windowToGlobalIndex(window_idx))
else else
-1; -1;
// Calcular rango de filas a dibujar // Calcular rango de filas a dibujar
const first_row = list_state.nav.scroll_row; const first_row = list_state.nav.scroll_row;
// Si hay inyección, hay una fila más en la ventana visual
const window_rows = list_state.current_window.len + @as(usize, if (list_state.hasInjection()) 1 else 0);
const last_row = @min( const last_row = @min(
list_state.nav.scroll_row + visible_rows, list_state.nav.scroll_row + visible_rows,
list_state.window_start + list_state.current_window.len, list_state.window_start + window_rows,
); );
// Convertir columnas a ColumnRenderDef // Convertir columnas a ColumnRenderDef
@ -1204,11 +1209,40 @@ fn handleKeyboard(
} }
// ========================================================================= // =========================================================================
// Propagar acciones CRUD al result (el panel las manejará) // Ctrl+N: Inyección local (insertar fila debajo de la actual)
// ========================================================================= // =========================================================================
if (events.insert_row) { if (events.insert_row) {
result.insert_row_requested = true; // Solo permitir si no hay ya una inyección activa
if (!list_state.hasInjection()) {
// Calcular índice de inyección (debajo de la fila actual)
const current_row: usize = if (list_state.findSelectedInWindow()) |window_idx|
list_state.windowToGlobalIndex(window_idx)
else
0;
const injection_idx = current_row + 1;
// Iniciar inyección
list_state.startInjection(injection_idx);
// Mover selección a la fila inyectada
list_state.selected_id = null; // La fila inyectada no tiene ID aún
// La selección visual se maneja por injected_row_idx
// Señalar que hay una nueva inyección
result.injection_row_idx = injection_idx;
result.selection_changed = true;
// Iniciar edición automática en primera columna
list_state.cell_edit.startEdit(injection_idx, 0, "");
list_state.nav.active_col = 0;
}
// Nota: insert_row_requested ya NO se emite - la inyección es interna
} }
// =========================================================================
// Ctrl+Delete/B: Eliminar fila
// =========================================================================
if (events.delete_row) { if (events.delete_row) {
result.delete_row_requested = true; result.delete_row_requested = true;
// Obtener el ID de la fila seleccionada // Obtener el ID de la fila seleccionada