zcatgui/docs/BUG_ADVANCEDTABLE_KEYBOARD_2025-12-17.md
reugenio 1eed0181d6 docs: Bug teclado AdvancedTable NO RESUELTO
El bug de navegación con flechas persiste. Documentación
completa del problema y pistas de debugging para próxima sesión.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 18:54:05 +01:00

4.3 KiB

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

// 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

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