# 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*