zcatgui/docs/PLAN_REFACTOR_TABLE_CORE_MODULAR.md
reugenio fa5854fa21 refactor(table_core): Modularizar en 10 archivos (<300 LOC cada uno)
BREAKING: table_core.zig ahora es carpeta table_core/

Módulos creados:
- types.zig: Enums, structs, constantes
- state.zig: CellEditState, NavigationState
- datasource.zig: TableDataSource interface
- row_buffer.zig: Excel-style commit logic
- keyboard.zig: Manejo de teclado
- navigation.zig: Tab, sorting, double-click
- rendering.zig: Funciones de dibujo
- scrollbars.zig: Scrollbars vertical/horizontal
- utils.zig: blendColor, startsWithIgnoreCase
- table_core.zig: Hub de re-exports

Beneficios:
- 2115 LOC → 10 archivos de ~100-270 LOC
- Debugging focalizado por módulo
- Imports actualizados en 7 archivos de widgets
2025-12-29 01:41:59 +01:00

5.8 KiB

PLAN: Modularización de table_core.zig

Fecha: 2025-12-29 Autor: Claude (con input de Gemini) Estado: En progreso


Objetivo

Dividir table_core.zig (2115 LOC) en módulos pequeños (<500 LOC) para:

  • Mejorar eficiencia de trabajo (menos contexto por archivo)
  • Facilitar debugging focalizado
  • Mantener compatibilidad con código cliente

Estructura Final

zcatgui/src/widgets/table_core/
├── types.zig        # ~150 LOC - Enums, structs config, constantes
├── state.zig        # ~250 LOC - CellEditState, NavigationState
├── datasource.zig   # ~120 LOC - TableDataSource interface
├── row_buffer.zig   # ~180 LOC - Excel-style commit logic
├── keyboard.zig     # ~500 LOC - handleEditingKeyboard, processTableEvents
├── navigation.zig   # ~250 LOC - Tab calculation, sorting
├── rendering.zig    # ~450 LOC - drawRows, drawCells, drawStateIndicator
├── scrollbars.zig   # ~150 LOC - Scrollbars vertical/horizontal
├── utils.zig        # ~50 LOC  - blendColor, startsWithIgnoreCase
└── table_core.zig   # ~30 LOC  - Re-exports todo (compatibilidad)

Mapeo de Contenido Original → Nuevos Archivos

Líneas orig Contenido Destino
35-47 table_tips, TIP_ROTATION_FRAMES types.zig
54-125 TableColors, CellRenderInfo, EditState, RowState types.zig
133-355 CellEditState, NavigationState, DoubleClickState state.zig
363-480 drawCellActiveIndicator, drawEditingOverlay, drawCellText, drawStateIndicator rendering.zig
489-765 ColumnRenderDef, RowRenderColors, DrawRowsConfig, drawRowsWithDataSource rendering.zig
774-995 NavigateDirection, EditKeyboardResult, handleEditingKeyboard keyboard.zig
1007-1278 TableEventResult, processTableEvents keyboard.zig
1285-1457 PendingCellChange, RowEditBuffer, RowCommitInfo, buildCommitInfo row_buffer.zig
1466-1498 blendColor, startsWithIgnoreCase utils.zig
1503-1706 TabNavigateResult, CellPosition, calculateNextCell/Prev, planTabNavigation navigation.zig
1715-1757 SortDirection, toggleSort navigation.zig
1784-1885 TableDataSource, makeTableDataSource datasource.zig
1893-2010 VerticalScrollbarParams, HorizontalScrollbarParams, draw* scrollbars.zig

Fases de Implementación

FASE 1: Crear estructura de carpeta

  • Crear directorio table_core/
  • Mover archivo original como backup

FASE 2: Extraer módulos (uno por uno)

  • types.zig - Tipos básicos y constantes
  • state.zig - Estados de edición y navegación
  • utils.zig - Funciones utilitarias
  • datasource.zig - Interface TableDataSource
  • row_buffer.zig - Lógica de commit Excel-style
  • navigation.zig - Navegación Tab y sorting
  • scrollbars.zig - Renderizado de scrollbars
  • rendering.zig - Renderizado de filas y celdas
  • keyboard.zig - Manejo de teclado

FASE 3: Crear archivo hub de re-export

  • table_core.zig con pub usingnamespace para cada módulo

FASE 4: Verificar compilación

  • zig build en zcatgui
  • zig build en zsimifactu

FASE 5: Commit y documentar

  • jj describe + jj new
  • Actualizar LAST_UPDATE.md
  • jj git push

Dependencias Entre Módulos

types.zig ←─────────────────────────────────────┐
    ↑                                           │
state.zig ←──────────────────────────┐          │
    ↑                                │          │
utils.zig                            │          │
    ↑                                │          │
datasource.zig ←─────────────────────┤          │
    ↑                                │          │
row_buffer.zig ←─────────────────────┤          │
    ↑                                │          │
navigation.zig ←─────────────────────┤          │
    ↑                                │          │
scrollbars.zig                       │          │
    ↑                                │          │
rendering.zig ←──────────────────────┘          │
    ↑                                           │
keyboard.zig ←──────────────────────────────────┘

Notas Técnicas

  • El archivo original widgets/table_core.zig se convierte en widgets/table_core/table_core.zig
  • Zig resuelve @import("table_core.zig") → busca table_core/table_core.zig automáticamente
  • No se requieren cambios en código cliente (advanced_table, virtual_advanced_table, zsimifactu)

Historial

Fecha Hora Acción Estado
2025-12-29 -- Plan creado En progreso
2025-12-29 ~02:00 Refactorización completada COMPLETADO

Resultado Final

10 módulos creados:

table_core/
├── types.zig        # 196 LOC
├── state.zig        # 175 LOC
├── datasource.zig   # 114 LOC
├── row_buffer.zig   # 167 LOC
├── keyboard.zig     # 270 LOC
├── navigation.zig   # 212 LOC
├── rendering.zig    # 233 LOC
├── scrollbars.zig   # 97 LOC
├── utils.zig        # 51 LOC
└── table_core.zig   # 115 LOC (hub)

Beneficios:

  • Ningún archivo >300 LOC (vs 2115 LOC original)
  • Debugging focalizado: solo leer módulo relevante
  • Imports actualizados en 7 archivos de widgets
  • Compilación OK en zcatgui y zsimifactu