From 97ddf28c151fdd2d4abd432211fb468ba9292113 Mon Sep 17 00:00:00 2001 From: reugenio Date: Fri, 26 Dec 2025 14:50:57 +0100 Subject: [PATCH] feat(virtual_advanced_table): Integrate CellEditor in draw loop with result handling --- .../virtual_advanced_table.zig | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/widgets/virtual_advanced_table/virtual_advanced_table.zig b/src/widgets/virtual_advanced_table/virtual_advanced_table.zig index 4ef2d24..0e5f074 100644 --- a/src/widgets/virtual_advanced_table/virtual_advanced_table.zig +++ b/src/widgets/virtual_advanced_table/virtual_advanced_table.zig @@ -81,6 +81,31 @@ pub const VirtualAdvancedTableResult = struct { /// El widget fue clickeado clicked: bool = false, + + // ========================================================================= + // Edición CRUD Excel-style + // ========================================================================= + + /// Una celda fue modificada (el usuario hizo commit con Enter/Tab) + cell_committed: bool = false, + + /// La fila cambió de edición (auto-save requerido) + row_changed: bool = false, + + /// El usuario canceló edición (Escape 2x = descartar fila) + row_discarded: bool = false, + + /// Celda que fue editada (si cell_committed = true) + edited_cell: ?CellId = null, + + /// Nuevo valor de la celda (si cell_committed = true) + edited_value: ?[]const u8 = null, + + /// Fila anterior (si row_changed = true, para auto-save) + previous_row: ?usize = null, + + /// Navegación solicitada después de commit + navigate_direction: cell_editor.CellEditorResult.NavigateDirection = .none, }; // ============================================================================= @@ -222,6 +247,59 @@ pub fn virtualAdvancedTableRect( drawRows(ctx, content_bounds, config, &colors, list_state, visible_rows, &result, list_state.scroll_offset_x); + // Draw CellEditor overlay if editing + if (list_state.isEditing()) { + const editing = list_state.editing_cell.?; + + // Calculate cell geometry for the editing cell + if (list_state.getCellGeometry( + editing.row, + editing.col, + config.columns, + config.row_height, + bounds.x, + bounds.y, + header_h, + filter_bar_h, + )) |geom| { + // Draw cell editor + const editor_result = cell_editor.drawCellEditor( + ctx, + list_state, + geom, + cell_editor.CellEditorColors{}, + ); + + // Handle editor results + if (editor_result.committed) { + const edited_cell = list_state.editing_cell.?; + const new_value = list_state.getEditText(); + + // Check if row changed (for auto-save) + if (list_state.last_edited_row) |last_row| { + if (edited_cell.row != last_row and list_state.row_dirty) { + result.row_changed = true; + result.previous_row = last_row; + } + } + + // Commit the edit + if (list_state.commitEdit()) { + result.cell_committed = true; + result.edited_cell = edited_cell; + result.edited_value = new_value; + } + + result.navigate_direction = editor_result.navigate; + } else if (editor_result.escaped) { + const action = list_state.handleEscape(); + if (action == .discard_row) { + result.row_discarded = true; + } + } + } + } + // End clipping ctx.pushCommand(Command.clipEnd());