diff --git a/docs/BUG_ADVANCEDTABLE_KEYBOARD_2025-12-17.md b/docs/BUG_ADVANCEDTABLE_KEYBOARD_2025-12-17.md new file mode 100644 index 0000000..7735cfd --- /dev/null +++ b/docs/BUG_ADVANCEDTABLE_KEYBOARD_2025-12-17.md @@ -0,0 +1,134 @@ +# Bug: AdvancedTable Keyboard Navigation No Funciona + +> **Fecha:** 2025-12-17 +> **Estado:** 🔴 NO RESUELTO +> **Severidad:** ALTA + +--- + +## Síntoma + +Las flechas de teclado no mueven la selección en AdvancedTable cuando se usa en zsimifactu. + +--- + +## Lo que sabemos + +### Funciona +- El widget se renderiza correctamente +- El click en filas funciona (cambia selección) +- El sorting visual funciona (click en headers) +- `has_focus=true` cuando se hace click en la tabla +- `keyboard_nav=true` en la configuración + +### No funciona +- Flechas ↑↓←→ no mueven la selección +- No hay mensajes de `selection_changed` después de presionar flechas + +--- + +## Investigación realizada + +### 1. Cambio de keyPressed a navKeyPressed +**Hipótesis:** `keyPressed()` no incluye key repeats. +**Cambio:** Línea 566 de `advanced_table.zig` usa `navKeyPressed()`. +**Resultado:** No resuelve el problema. + +### 2. Debug print consumía el evento +**Descubrimiento:** Al añadir debug print que llamaba `navKeyPressed()` ANTES del bloque `if (has_focus)`, el evento se consumía y no llegaba a `handleKeyboard`. +**Evidencia:** Con debug print, aparecían mensajes `navKeyPressed=.down, has_focus=true, keyboard_nav=true` pero sin movimiento. +**Conclusión:** `navKeyPressed()` solo puede leerse UNA VEZ por frame. + +### 3. Sin debug print, nada funciona +**Observación:** Al quitar el debug print, ni siquiera hay mensajes en consola. +**Implicación:** `handleKeyboard` no se está ejecutando, o `navKeyPressed()` devuelve null. + +--- + +## Código actual relevante + +### advanced_table.zig líneas 165-180 +```zig +// Handle keyboard +if (has_focus) { + if (table_state.editing) { + handleEditingKeyboard(ctx, table_state, table_schema, &result); + drawEditingOverlay(ctx, bounds, table_state, table_schema, header_h, state_col_w, colors); + } else if (config.keyboard_nav) { + handleKeyboard(ctx, table_state, table_schema, visible_rows, &result); + } +} +``` + +### handleKeyboard líneas 570-590 +```zig +if (ctx.input.navKeyPressed()) |nav_key| { + switch (nav_key) { + .up => { + if (table_state.selected_row > 0) { + table_state.selectCell(...); + result.selection_changed = true; + } + }, + .down => { + if (table_state.selected_row < row_count - 1) { + table_state.selectCell(...); + result.selection_changed = true; + } + }, + // ... etc + } +} +``` + +--- + +## Hipótesis pendientes de verificar + +1. **¿`has_focus` es realmente true?** + - El debug mostró true, pero quizás el focus se pierde entre frames + +2. **¿`navKeyPressed()` funciona en AdvancedTable?** + - Funciona en otros widgets (Table original, TextInput) + - Quizás hay algo específico del contexto de AdvancedTable + +3. **¿El evento de teclado llega al widget?** + - zsimifactu tiene su propio event handling en main.zig + - Quizás los eventos se consumen antes de llegar al widget + +4. **¿Hay diferencia entre Table y AdvancedTable?** + - Table original funciona con teclado + - Comparar línea por línea el handling de teclado + +--- + +## Próximos pasos sugeridos + +1. **Comparar con Table original** - El widget Table SÍ funciona con teclado. Comparar cómo maneja eventos. + +2. **Añadir debug DENTRO de handleKeyboard** - No antes del `if (has_focus)`, sino dentro de la función misma. + +3. **Verificar InputState.navKeyPressed()** - Ver si devuelve algo cuando AdvancedTable tiene focus. + +4. **Revisar el focus system** - Quizás AdvancedTable no está registrándose correctamente en el FocusSystem. + +--- + +## Archivos relevantes + +- `/mnt/cello2/arno/re/recode/zig/zcatgui/src/widgets/advanced_table/advanced_table.zig` +- `/mnt/cello2/arno/re/recode/zig/zcatgui/src/widgets/table/table.zig` (referencia funcional) +- `/mnt/cello2/arno/re/recode/zig/zcatgui/src/core/input.zig` (navKeyPressed) +- `/mnt/cello2/arno/re/recode/zig/zsimifactu/src/panels/who_list_advanced.zig` +- `/mnt/cello2/arno/re/recode/zig/zsimifactu/src/main.zig` (event loop) + +--- + +## Commit actual + +Los cambios de "merge Table → AdvancedTable" están commiteados (af1bb76) pero el bug de teclado **NO está resuelto**. + +--- + +*Documentado por: Claude Code (Opus 4.5)* +*Fecha: 2025-12-17 ~19:00*