WASM Backend: - src/backend/wasm.zig: Browser backend using extern JS functions - web/zcatgui.js: Canvas 2D rendering bridge (~200 LOC) - web/index.html: Demo page with event handling - examples/wasm_demo.zig: Widget showcase for browser - Output: 18KB WASM binary Android Backend: - src/backend/android.zig: ANativeActivity + ANativeWindow - examples/android_demo.zig: Touch-enabled demo - Touch-to-mouse event mapping - Logging via __android_log_print - Targets: ARM64 (device), x86_64 (emulator) iOS Backend: - src/backend/ios.zig: UIKit bridge via extern C functions - ios/ZcatguiBridge.h: Objective-C header - ios/ZcatguiBridge.m: UIKit implementation (~320 LOC) - CADisplayLink render loop - Touch event queue with @synchronized - Targets: ARM64 (device), ARM64 simulator Build System: - WASM: zig build wasm - Android: zig build android / android-x86 - iOS: zig build ios / ios-sim - Conditional compilation for platform detection Documentation: - docs/MOBILE_WEB_BACKENDS.md: Comprehensive guide (~400 lines) - Updated DEVELOPMENT_PLAN.md with FASE 10 - Updated CLAUDE.md with new commands Stats: 3 backends, ~1500 new LOC, cross-platform ready 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
897 lines
29 KiB
Markdown
897 lines
29 KiB
Markdown
# zcatgui - GUI Library para Zig
|
|
|
|
> **IMPORTANTE PARA CLAUDE**: Lee la sección "PROTOCOLO DE INICIO" antes de hacer cualquier cosa.
|
|
|
|
---
|
|
|
|
## PROTOCOLO DE INICIO (LEER PRIMERO)
|
|
|
|
### Paso 1: Leer normas del equipo
|
|
```
|
|
/mnt/cello2/arno/re/recode/TEAM_STANDARDS/LAST_UPDATE.md
|
|
```
|
|
|
|
### Paso 2: Leer normas completas si es necesario
|
|
```
|
|
/mnt/cello2/arno/re/recode/TEAM_STANDARDS/NORMAS_TRABAJO_CONSENSUADAS.md
|
|
/mnt/cello2/arno/re/recode/TEAM_STANDARDS/QUICK_REFERENCE.md
|
|
```
|
|
|
|
### Paso 3: Leer documentación de investigación
|
|
```
|
|
docs/DEVELOPMENT_PLAN.md # ⭐ PLAN MAESTRO - Leer primero
|
|
docs/research/WIDGET_COMPARISON.md # Comparativa zcatgui vs DVUI vs Gio
|
|
docs/research/GIO_UI_ANALYSIS.md # Análisis de Gio UI (Go)
|
|
docs/research/IMMEDIATE_MODE_LIBS.md # Comparativa librerías immediate-mode
|
|
docs/research/SIMIFACTU_FYNE_ANALYSIS.md # Requisitos extraídos de Simifactu
|
|
docs/ARCHITECTURE.md # Arquitectura y decisiones de diseño
|
|
```
|
|
|
|
### Paso 4: Verificar estado del proyecto
|
|
```bash
|
|
cd /mnt/cello2/arno/re/recode/zig/zcatgui
|
|
git status
|
|
git log --oneline -3
|
|
zig build test
|
|
```
|
|
|
|
### Paso 5: Continuar trabajo
|
|
Una vez verificado el estado, continúa desde donde se dejó.
|
|
|
|
---
|
|
|
|
## INFORMACIÓN DEL PROYECTO
|
|
|
|
| Campo | Valor |
|
|
|-------|-------|
|
|
| **Nombre** | zcatgui |
|
|
| **Versión** | v0.15.0 |
|
|
| **Fecha inicio** | 2025-12-09 |
|
|
| **Estado** | ✅ 35 widgets, 274 tests, paridad DVUI + mobile backends |
|
|
| **Lenguaje** | Zig 0.15.2 |
|
|
| **Paradigma** | Immediate Mode GUI |
|
|
| **Inspiración** | Gio (Go), microui (C), DVUI (Zig), Dear ImGui (C++) |
|
|
| **Proyecto hermano** | zcatui (TUI library) |
|
|
|
|
### Descripción
|
|
|
|
**zcatgui** es una librería GUI immediate-mode para Zig con las siguientes características:
|
|
|
|
1. **Software Rendering por defecto** - Funciona en cualquier ordenador sin GPU
|
|
2. **Cross-platform** - Linux, Windows, macOS, **Web (WASM)**, **Android**, **iOS**
|
|
3. **SSH compatible** - Funciona via X11 forwarding
|
|
4. **Sistema de Macros** - Grabación/reproducción de acciones (piedra angular)
|
|
5. **Sin dependencias pesadas** - Solo SDL2 para desktop, nativo para mobile/web
|
|
|
|
### Filosofía
|
|
|
|
> "Máxima compatibilidad, mínimas dependencias, control total del usuario"
|
|
|
|
- Funciona en cualquier ordenador (viejo HP, nuevo Lenovo, servidor SSH)
|
|
- Software rendering primero, GPU opcional después
|
|
- Sistema de macros integrado desde el diseño
|
|
- Immediate mode = estado explícito, sin threading hell
|
|
|
|
---
|
|
|
|
## RUTAS IMPORTANTES
|
|
|
|
```bash
|
|
# Este proyecto
|
|
/mnt/cello2/arno/re/recode/zig/zcatgui/
|
|
|
|
# Proyecto hermano (TUI)
|
|
/mnt/cello2/arno/re/recode/zig/zcatui/
|
|
|
|
# Proyecto de referencia (usa Fyne, queremos replicar funcionalidad)
|
|
/mnt/cello2/arno/re/recode/go/simifactu/
|
|
|
|
# Normas del equipo
|
|
/mnt/cello2/arno/re/recode/TEAM_STANDARDS/
|
|
|
|
# Compilador Zig 0.15.2
|
|
/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2/zig
|
|
```
|
|
|
|
---
|
|
|
|
## COMANDOS FRECUENTES
|
|
|
|
```bash
|
|
# Compilar (desktop)
|
|
zig build
|
|
|
|
# Tests
|
|
zig build test
|
|
|
|
# Ejemplos desktop
|
|
zig build hello
|
|
zig build macro-demo
|
|
zig build widgets-demo
|
|
zig build table-demo
|
|
|
|
# WASM (navegador)
|
|
zig build wasm # Genera web/zcatgui-demo.wasm
|
|
cd web && python3 -m http.server # Servir y abrir localhost:8000
|
|
|
|
# Android (requiere NDK)
|
|
zig build android # ARM64 para dispositivo
|
|
zig build android-x86 # x86_64 para emulador
|
|
|
|
# iOS (requiere Xcode en macOS)
|
|
zig build ios # ARM64 para dispositivo
|
|
zig build ios-sim # ARM64 para simulador
|
|
|
|
# Git
|
|
git status
|
|
git add -A && git commit -m "mensaje"
|
|
git push
|
|
```
|
|
|
|
---
|
|
|
|
## ARQUITECTURA
|
|
|
|
### Paradigma: Immediate Mode
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ IMMEDIATE MODE │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ while (running) { │
|
|
│ events = pollEvents(); // Input │
|
|
│ updateState(events); // TÚ manejas estado │
|
|
│ commands = drawUI(state); // Genera comandos │
|
|
│ render(commands); // Dibuja │
|
|
│ } │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
|
vs Retained Mode (Fyne):
|
|
- Framework mantiene árbol de widgets
|
|
- Callbacks para cambios
|
|
- fyne.Do() para threading
|
|
- Estado oculto, sincronización compleja
|
|
```
|
|
|
|
### Capas de la Librería
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Capa 4: Widgets de alto nivel │
|
|
│ (Table, Panel, Select, Modal, etc.) │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ Capa 3: Sistema de Macros │
|
|
│ (Grabación, Reproducción, Inyección de teclas) │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ Capa 2: Core UI │
|
|
│ (Context, Layout, Style, Input, Commands) │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ Capa 1: Rendering │
|
|
│ (Software Rasterizer, Framebuffer, Fonts) │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ Capa 0: Backend │
|
|
│ (SDL2 - ventanas, eventos, display) │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### Estructura de Archivos (ACTUAL v0.15.0)
|
|
|
|
```
|
|
zcatgui/
|
|
├── src/
|
|
│ ├── zcatgui.zig # Entry point, re-exports, conditional backend imports
|
|
│ │
|
|
│ ├── core/
|
|
│ │ ├── context.zig # ✅ Context, ID system, command pool, FrameArena
|
|
│ │ ├── layout.zig # ✅ Rect, Constraint, LayoutState
|
|
│ │ ├── style.zig # ✅ Color, Style, Theme (5 themes)
|
|
│ │ ├── input.zig # ✅ Key, KeyEvent, MouseEvent, InputState
|
|
│ │ ├── command.zig # ✅ DrawCommand list
|
|
│ │ ├── clipboard.zig # ✅ Clipboard support
|
|
│ │ ├── dragdrop.zig # ✅ Drag & drop system
|
|
│ │ ├── shortcuts.zig # ✅ Keyboard shortcuts manager
|
|
│ │ ├── focus_group.zig # ✅ Focus groups
|
|
│ │ ├── accessibility.zig # ✅ Accessibility (ARIA roles)
|
|
│ │ └── gesture.zig # ✅ Gesture recognizer (tap, swipe, pinch, rotate)
|
|
│ │
|
|
│ ├── widgets/ # 35 widgets implementados
|
|
│ │ ├── widgets.zig # Re-exports
|
|
│ │ ├── label.zig, button.zig, text_input.zig, checkbox.zig
|
|
│ │ ├── select.zig, list.zig, focus.zig, table.zig
|
|
│ │ ├── split.zig, panel.zig, modal.zig, autocomplete.zig
|
|
│ │ ├── slider.zig, scroll.zig, tabs.zig, radio.zig, menu.zig
|
|
│ │ ├── progress.zig, tooltip.zig, toast.zig
|
|
│ │ ├── textarea.zig, tree.zig, badge.zig
|
|
│ │ ├── number_entry.zig, reorderable.zig
|
|
│ │ ├── breadcrumb.zig, image.zig, icon.zig
|
|
│ │ ├── color_picker.zig, date_picker.zig, chart.zig
|
|
│ │ └── calendar.zig
|
|
│ │
|
|
│ ├── render/
|
|
│ │ ├── software.zig # ✅ SoftwareRenderer
|
|
│ │ ├── framebuffer.zig # ✅ Framebuffer RGBA (u32 pixels)
|
|
│ │ ├── font.zig # ✅ Bitmap font 8x8
|
|
│ │ ├── ttf.zig # ✅ TTF font support (stb_truetype)
|
|
│ │ ├── animation.zig # ✅ Animation system, easing, springs
|
|
│ │ ├── effects.zig # ✅ Shadows, gradients, blur
|
|
│ │ └── antialiasing.zig # ✅ Anti-aliased rendering
|
|
│ │
|
|
│ ├── backend/
|
|
│ │ ├── backend.zig # ✅ Backend interface (VTable)
|
|
│ │ ├── sdl2.zig # ✅ SDL2 (desktop: Linux/Win/Mac)
|
|
│ │ ├── wasm.zig # ✅ WASM (navegador)
|
|
│ │ ├── android.zig # ✅ Android (ANativeActivity)
|
|
│ │ └── ios.zig # ✅ iOS (UIKit bridge)
|
|
│ │
|
|
│ ├── macro/
|
|
│ │ └── macro.zig # ✅ MacroRecorder, MacroPlayer, MacroStorage
|
|
│ │
|
|
│ ├── panels/
|
|
│ │ └── panels.zig # ✅ Lego Panels architecture
|
|
│ │
|
|
│ └── utils/
|
|
│ └── utils.zig # ✅ FrameArena, ObjectPool, Benchmark
|
|
│
|
|
├── examples/
|
|
│ ├── hello.zig # Ejemplo básico
|
|
│ ├── macro_demo.zig # Demo macros
|
|
│ ├── widgets_demo.zig # Demo widgets
|
|
│ ├── table_demo.zig # Demo Table/Split/Panel
|
|
│ ├── wasm_demo.zig # ✅ Demo WASM (navegador)
|
|
│ └── android_demo.zig # ✅ Demo Android
|
|
│
|
|
├── web/ # ✅ WASM support
|
|
│ ├── index.html # Demo HTML
|
|
│ ├── zcatgui.js # JavaScript glue code
|
|
│ └── zcatgui-demo.wasm # Compiled WASM (~18KB)
|
|
│
|
|
├── ios/ # ✅ iOS support
|
|
│ ├── ZcatguiBridge.h # Objective-C header
|
|
│ └── ZcatguiBridge.m # UIKit implementation
|
|
│
|
|
├── docs/
|
|
│ ├── ARCHITECTURE.md
|
|
│ ├── DEVELOPMENT_PLAN.md # ⭐ Plan maestro
|
|
│ ├── MOBILE_WEB_BACKENDS.md # ✅ Documentación mobile/web
|
|
│ └── research/
|
|
│ ├── GIO_UI_ANALYSIS.md
|
|
│ ├── IMMEDIATE_MODE_LIBS.md
|
|
│ ├── WIDGET_COMPARISON.md
|
|
│ └── SIMIFACTU_FYNE_ANALYSIS.md
|
|
│
|
|
├── build.zig # Build con targets: wasm, android, ios
|
|
├── build.zig.zon
|
|
└── CLAUDE.md
|
|
```
|
|
|
|
---
|
|
|
|
## SISTEMA DE MACROS (PIEDRA ANGULAR)
|
|
|
|
### Concepto
|
|
|
|
El sistema de macros permite **grabar y reproducir** todas las acciones del usuario.
|
|
|
|
**Principio**: Grabar teclas raw, no comandos abstractos.
|
|
|
|
```
|
|
Usuario pulsa: Tab, Tab, Enter, "texto", Escape
|
|
Grabamos: [Tab, Tab, Enter, t, e, x, t, o, Escape]
|
|
Reproducimos: Inyectamos exactamente esas teclas
|
|
```
|
|
|
|
### Por qué teclas raw (no comandos)
|
|
|
|
| Enfoque | Pros | Contras |
|
|
|---------|------|---------|
|
|
| **Teclas raw** | Simple, mínima memoria, reproducción exacta | Depende del estado inicial |
|
|
| Comandos semánticos | Más robusto | Complejo, más memoria, traducción bidireccional |
|
|
|
|
**Decisión**: Teclas raw (como Vim). Razones:
|
|
1. KISS - menos código = menos bugs
|
|
2. Vim lo hace así y funciona
|
|
3. El estado inicial es controlable
|
|
|
|
### Manejo del ratón
|
|
|
|
**Casi todo lo que hace el ratón se puede expresar como teclado**:
|
|
|
|
| Acción ratón | Equivalente teclado |
|
|
|--------------|---------------------|
|
|
| Click en botón | Tab hasta focus + Enter |
|
|
| Click en fila 5 | Flechas hasta fila 5 |
|
|
| Scroll down | PageDown o flechas |
|
|
| Drag splitter | Ctrl+flechas |
|
|
|
|
**Estrategia**:
|
|
1. Fase 1: Solo teclado (macros de teclas)
|
|
2. Fase 2: Mouse → traducir a teclas equivalentes
|
|
|
|
### API Propuesta
|
|
|
|
```zig
|
|
pub const MacroRecorder = struct {
|
|
events: ArrayList(KeyEvent),
|
|
recording: bool,
|
|
|
|
pub fn start(self: *MacroRecorder) void;
|
|
pub fn stop(self: *MacroRecorder) []const KeyEvent;
|
|
pub fn record(self: *MacroRecorder, key: KeyEvent) void;
|
|
pub fn save(self: *MacroRecorder, path: []const u8) !void;
|
|
pub fn load(allocator: Allocator, path: []const u8) !MacroRecorder;
|
|
};
|
|
|
|
pub const MacroPlayer = struct {
|
|
pub fn play(
|
|
events: []const KeyEvent,
|
|
inject_fn: *const fn(KeyEvent) void,
|
|
delay_ms: u32,
|
|
) void;
|
|
};
|
|
```
|
|
|
|
### Casos de Uso
|
|
|
|
1. **Testing automatizado**: Grabar sesión → convertir en test
|
|
2. **Tutoriales**: Macros que se ejecutan paso a paso
|
|
3. **Repetición**: Grabar tarea repetitiva, asignar a hotkey
|
|
4. **Debugging**: "¿Cómo llegaste a este bug?" → envía el macro
|
|
5. **Demos**: Grabar demos que se reproducen en la app
|
|
|
|
---
|
|
|
|
## WIDGETS PRIORITARIOS
|
|
|
|
Basado en análisis de Simifactu (ver `docs/research/SIMIFACTU_FYNE_ANALYSIS.md`):
|
|
|
|
| # | Widget | Prioridad | Descripción |
|
|
|---|--------|-----------|-------------|
|
|
| 1 | **Table** | CRÍTICA | Edición in-situ, navegación teclado, dirty tracking |
|
|
| 2 | **Input** | CRÍTICA | Text entry con validación |
|
|
| 3 | **Select** | CRÍTICA | Dropdown selection |
|
|
| 4 | **Panel** | ALTA | Container con título y bordes |
|
|
| 5 | **Split** | ALTA | HSplit/VSplit draggable |
|
|
| 6 | **Button** | ALTA | Con estados disabled, importance |
|
|
| 7 | **Modal** | MEDIA | Diálogos modales |
|
|
| 8 | **List** | MEDIA | Lista seleccionable |
|
|
| 9 | **Checkbox** | MEDIA | Toggle boolean |
|
|
| 10 | **Label** | BAJA | Texto estático |
|
|
|
|
---
|
|
|
|
## RENDERING
|
|
|
|
### Software Rasterizer (Command List approach)
|
|
|
|
```zig
|
|
pub const DrawCommand = union(enum) {
|
|
rect: struct {
|
|
x: i32,
|
|
y: i32,
|
|
w: u32,
|
|
h: u32,
|
|
color: Color,
|
|
},
|
|
text: struct {
|
|
x: i32,
|
|
y: i32,
|
|
text: []const u8,
|
|
color: Color,
|
|
font: *Font,
|
|
},
|
|
line: struct {
|
|
x1: i32,
|
|
y1: i32,
|
|
x2: i32,
|
|
y2: i32,
|
|
color: Color,
|
|
},
|
|
clip: struct {
|
|
x: i32,
|
|
y: i32,
|
|
w: u32,
|
|
h: u32,
|
|
},
|
|
clip_end,
|
|
};
|
|
```
|
|
|
|
**Flujo**:
|
|
```
|
|
Widgets → Commands → Software Rasterizer → Framebuffer → SDL_Texture → Display
|
|
```
|
|
|
|
### Por qué Software Rendering
|
|
|
|
1. **Funciona SIEMPRE** - No depende de drivers GPU
|
|
2. **SSH compatible** - X11 forwarding funciona
|
|
3. **Máxima compatibilidad** - Desde HP viejo hasta Lenovo nuevo
|
|
4. **Simple de debugear** - Es solo un array de pixels
|
|
|
|
### Fonts
|
|
|
|
**Dos opciones soportadas**:
|
|
1. **Bitmap fonts** (embebidos) - Siempre funcionan, rápidos
|
|
2. **TTF** (stb_truetype) - Más flexible, opcional
|
|
|
|
---
|
|
|
|
## PLAN DE DESARROLLO
|
|
|
|
### Fase 0: Setup ✅ COMPLETADA
|
|
- [x] Crear estructura de directorios
|
|
- [x] build.zig con SDL2
|
|
- [x] CLAUDE.md
|
|
- [x] Documentación de investigación
|
|
|
|
### Fase 1: Core + Macros ✅ COMPLETADA
|
|
- [x] Context con event loop
|
|
- [x] Sistema de macros (grabación/reproducción teclas)
|
|
- [x] Software rasterizer básico (rects, text, lines)
|
|
- [x] SDL2 backend
|
|
- [x] Framebuffer RGBA
|
|
|
|
### Fase 2: Widgets Esenciales ✅ COMPLETADA
|
|
- [x] Label (static text)
|
|
- [x] Button (clickable, importance levels)
|
|
- [x] TextInput (editable text, cursor, selection)
|
|
- [x] Checkbox (boolean toggle)
|
|
- [x] Select (dropdown)
|
|
- [x] List (scrollable selection)
|
|
- [x] Focus management (FocusManager, FocusRing)
|
|
|
|
### Fase 3: Widgets Avanzados (PENDIENTE)
|
|
- [ ] Table con edición (CRÍTICO)
|
|
- [ ] Split panels (HSplit/VSplit draggable)
|
|
- [ ] Panel (container con título)
|
|
- [ ] Modal/Popup
|
|
|
|
### Fase 4: Pulido (PENDIENTE)
|
|
- [ ] Themes hot-reload
|
|
- [ ] TTF fonts (stb_truetype)
|
|
- [ ] Documentación completa
|
|
- [ ] Más examples
|
|
|
|
---
|
|
|
|
## REFERENCIAS Y RECURSOS
|
|
|
|
### Librerías estudiadas
|
|
|
|
| Librería | Lenguaje | LOC | Valor para nosotros |
|
|
|----------|----------|-----|---------------------|
|
|
| **microui** | C | 1,100 | Referencia arquitectura mínima |
|
|
| **DVUI** | Zig | 15,000 | Único ejemplo Zig native |
|
|
| **Dear ImGui** | C++ | 60,000 | API design, features |
|
|
| **Gio** | Go | - | Immediate mode moderno |
|
|
| **Nuklear** | C | 30,000 | Vertex buffer approach |
|
|
|
|
### Documentación detallada
|
|
|
|
- `docs/research/GIO_UI_ANALYSIS.md` - Análisis completo de Gio
|
|
- `docs/research/IMMEDIATE_MODE_LIBS.md` - Comparativa de librerías
|
|
- `docs/research/SIMIFACTU_FYNE_ANALYSIS.md` - Requisitos de Simifactu
|
|
- `docs/ARCHITECTURE.md` - Decisiones de arquitectura
|
|
|
|
### Links externos
|
|
|
|
- [microui GitHub](https://github.com/rxi/microui)
|
|
- [DVUI GitHub](https://github.com/david-vanderson/dvui)
|
|
- [Gio UI](https://gioui.org/)
|
|
- [Dear ImGui](https://github.com/ocornut/imgui)
|
|
|
|
---
|
|
|
|
## DECISIONES DE DISEÑO CONSENSUADAS
|
|
|
|
### 1. Immediate Mode vs Retained Mode
|
|
**Decisión**: Immediate Mode
|
|
**Razón**: Control total, sin threading hell (fyne.Do()), estado explícito
|
|
|
|
### 2. Software Rendering vs GPU
|
|
**Decisión**: Software por defecto, GPU opcional futuro
|
|
**Razón**: Máxima compatibilidad (SSH, HP viejo, cualquier driver)
|
|
|
|
### 3. Sistema de Macros
|
|
**Decisión**: Teclas raw, no comandos abstractos
|
|
**Razón**: Simple, como Vim, menos código = menos bugs
|
|
|
|
### 4. Backend inicial
|
|
**Decisión**: SDL2
|
|
**Razón**: Cross-platform probado, fácil de usar
|
|
|
|
### 5. Fonts
|
|
**Decisión**: Bitmap embebido + TTF opcional
|
|
**Razón**: Bitmap siempre funciona, TTF para flexibilidad
|
|
|
|
### 6. Enfoque de desarrollo
|
|
**Decisión**: Híbrido (estudiar DVUI/microui, implementar desde cero)
|
|
**Razón**: Aprender haciendo, control total, sin dependencias no deseadas
|
|
|
|
---
|
|
|
|
## RELACIÓN CON ZCATUI
|
|
|
|
**zcatui** (TUI) y **zcatgui** (GUI) son proyectos hermanos:
|
|
|
|
| Aspecto | zcatui | zcatgui |
|
|
|---------|--------|---------|
|
|
| Target | Terminal (ANSI) | Ventana gráfica |
|
|
| Rendering | Escape codes | Software rasterizer |
|
|
| Paradigma | Immediate mode | Immediate mode |
|
|
| Layout | Constraint-based | Constraint-based (reusar) |
|
|
| Style | Color/Modifier | Color/Style (reusar) |
|
|
| Widgets | 35 widgets | En desarrollo |
|
|
|
|
**Código a reutilizar de zcatui**:
|
|
- Sistema de Layout (Constraint, Flex)
|
|
- Sistema de Style (Color, Style)
|
|
- Conceptos de Focus
|
|
- Patterns de widgets
|
|
|
|
---
|
|
|
|
## EQUIPO
|
|
|
|
- **Usuario (Arno)**: Desarrollador principal
|
|
- **Claude**: Asistente de programación (Claude Code / Opus 4.5)
|
|
|
|
---
|
|
|
|
## NOTAS ZIG 0.15.2
|
|
|
|
```zig
|
|
// Sleep
|
|
std.Thread.sleep(ns) // NO std.time.sleep
|
|
|
|
// ArrayList - CAMBIÓ en 0.15
|
|
// VIEJO: std.ArrayList(T).init(allocator)
|
|
// NUEVO: std.ArrayListUnmanaged(T) + pasar allocator a cada operación
|
|
var list: std.ArrayListUnmanaged(T) = .{};
|
|
defer list.deinit(allocator);
|
|
try list.append(allocator, item); // allocator en cada append
|
|
|
|
// HashMap
|
|
var map = std.AutoHashMap(K, V).init(allocator);
|
|
defer map.deinit();
|
|
|
|
// Error handling
|
|
fn foo() !T { ... }
|
|
const result = try foo();
|
|
const result = foo() catch |err| { ... };
|
|
|
|
// File I/O - cambió en 0.15
|
|
const file = try std.fs.cwd().createFile(path, .{});
|
|
_ = try file.write("data"); // Directo
|
|
|
|
// stdout - cambió en 0.15
|
|
const stdout = std.fs.File.stdout(); // NO std.io.getStdOut()
|
|
// O usar std.debug.print() que es más simple
|
|
|
|
// build.zig.zon - requiere fingerprint
|
|
.{
|
|
.fingerprint = 0x...,
|
|
.name = .proyecto, // enum literal, no string
|
|
...
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## HISTORIAL
|
|
|
|
| Fecha | Versión | Cambios |
|
|
|-------|---------|---------|
|
|
| 2025-12-09 | v0.1.0 | Proyecto creado, estructura base, documentación |
|
|
| 2025-12-09 | v0.2.0 | Widgets Fase 2 completados (Label, Button, TextInput, Checkbox, Select, List, Focus) |
|
|
| 2025-12-09 | v0.3.0 | Widgets Fase 3 completados (Table editable, Split panels, Panel container) |
|
|
| 2025-12-09 | v0.3.5 | Keyboard integration: InputState ahora trackea teclas, Table responde a flechas/Enter/Escape/Tab/F2 |
|
|
| 2025-12-09 | v0.4.0 | Modal widget: diálogos modales (alert, confirm, input), plan extendido documentado |
|
|
| 2025-12-09 | v0.5.0 | AutoComplete widget, comparativa DVUI/Gio/zcatui en WIDGET_COMPARISON.md |
|
|
| 2025-12-09 | v0.6.0 | FASE 1 Optimización: FrameArena, ObjectPool, dirty rectangles, Benchmark suite |
|
|
| 2025-12-09 | v0.7.0 | FASE 2: Progress, Tooltip, Toast, Spinner |
|
|
| 2025-12-09 | v0.8.0 | FASE 2: TextArea, Tree, Badge/TagGroup |
|
|
| 2025-12-09 | v0.9.0 | FASE 3: Image, ReorderableList, ColorPicker, DatePicker |
|
|
| 2025-12-09 | v0.10.0 | FASE 4: NumberEntry, RichText, Breadcrumb |
|
|
| 2025-12-09 | v0.11.0 | FASE 5: Canvas, Charts (line/bar/pie), Icon system (60+ icons) |
|
|
| 2025-12-09 | v0.12.0 | FASE 6: Clipboard, DragDrop, Shortcuts, FocusGroups |
|
|
| 2025-12-09 | v0.13.0 | FASE 7: Animation/Easing, Effects (shadow/gradient/blur), VirtualScroll, AA rendering |
|
|
| 2025-12-09 | v0.14.0 | FASE 8: Accessibility system, Testing framework, 274 tests |
|
|
| 2025-12-09 | v0.14.1 | FASE 9: Gio parity - 12 widgets + gesture system |
|
|
| 2025-12-09 | v0.15.0 | FASE 10: Mobile/Web - WASM, Android, iOS backends |
|
|
|
|
---
|
|
|
|
## ESTADO ACTUAL
|
|
|
|
**✅ PROYECTO COMPLETADO - v0.15.0 - Paridad DVUI + Mobile/Web**
|
|
|
|
### Widgets (35 total - 100% paridad DVUI):
|
|
|
|
**Básicos (7)**: Label, Button, Checkbox, Radio, Slider, TextInput, NumberEntry
|
|
|
|
**Contenedores (6)**: Panel, Split, Modal, Scroll, Tabs, Menu
|
|
|
|
**Datos (5)**: List, Table, Tree, ReorderableList, VirtualScroll
|
|
|
|
**Feedback (4)**: Progress, Tooltip, Toast, Spinner
|
|
|
|
**Input avanzado (5)**: AutoComplete, Select, TextArea, ColorPicker, DatePicker
|
|
|
|
**Especial (5)**: Image, Icon, Canvas, Chart, RichText
|
|
|
|
**Navegación (2)**: Breadcrumb, Focus
|
|
|
|
**Sistema (1)**: Badge/TagGroup
|
|
|
|
### Backends (5 plataformas):
|
|
- **SDL2**: Desktop (Linux, Windows, macOS)
|
|
- **WASM**: Navegadores web (Canvas 2D)
|
|
- **Android**: ANativeActivity + ANativeWindow
|
|
- **iOS**: UIKit bridge (Objective-C)
|
|
|
|
### Core Systems:
|
|
- **Context**: FrameArena (O(1) reset), dirty rectangles, ID system
|
|
- **Input**: Keyboard, mouse, touch, shortcuts, focus groups, gestures
|
|
- **Rendering**: Software renderer, anti-aliasing, effects (shadow, gradient, blur)
|
|
- **Animation**: Easing functions (20+), AnimationManager, Springs
|
|
- **Accessibility**: Roles, states, announcements, live regions
|
|
- **Testing**: TestRunner, SnapshotTester, Assertions
|
|
- **Macros**: Recording, playback, storage
|
|
- **Themes**: 5 themes (dark, light, high_contrast, nord, dracula)
|
|
- **Clipboard**: SDL2 clipboard integration
|
|
- **Drag & Drop**: Type-filtered drop zones
|
|
- **Gestures**: Tap, double-tap, long-press, swipe, pinch, rotate
|
|
|
|
### Métricas:
|
|
- **274 tests** pasando
|
|
- **~27,000 LOC** total
|
|
- **0 warnings**, **0 memory leaks**
|
|
- **WASM**: ~18KB compilado
|
|
|
|
### Verificar que funciona:
|
|
```bash
|
|
cd /mnt/cello2/arno/re/recode/zig/zcatgui
|
|
|
|
# Tests
|
|
/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2/zig build test
|
|
|
|
# Desktop
|
|
/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2/zig build
|
|
|
|
# WASM (genera web/zcatgui-demo.wasm)
|
|
/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2/zig build wasm
|
|
|
|
# Android (requiere NDK)
|
|
/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2/zig build android
|
|
|
|
# iOS (requiere macOS + Xcode)
|
|
/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2/zig build ios
|
|
```
|
|
|
|
---
|
|
|
|
## PLAN DE TRABAJO EXTENDIDO
|
|
|
|
### Fase 4: Modal/Popup (PRÓXIMO)
|
|
- [ ] Modal widget (overlay que bloquea UI)
|
|
- [ ] Diálogos estándar: Confirm, Alert, Input
|
|
- [ ] Z-order/capas para popups
|
|
|
|
### Fase 5: Comparativa con Librerías de Referencia
|
|
|
|
#### 5.1 Comparar con DVUI (Zig) - Librería base de referencia
|
|
DVUI tiene ~30 widgets. Comparar y extraer lo que nos falta:
|
|
|
|
| Widget DVUI | zcatgui | Prioridad |
|
|
|-------------|---------|-----------|
|
|
| Button | ✅ | - |
|
|
| Checkbox | ✅ | - |
|
|
| TextInput | ✅ | - |
|
|
| Slider | ❌ | Media |
|
|
| ScrollArea | ❌ | Alta |
|
|
| Menu | ❌ | Alta |
|
|
| Dropdown | ✅ (Select) | - |
|
|
| TreeView | ❌ | Baja |
|
|
| Modal | ⏳ | Alta |
|
|
| Popup | ⏳ | Alta |
|
|
| Radio | ❌ | Media |
|
|
| ColorPicker | ❌ | Baja |
|
|
| ProgressBar | ❌ | Media |
|
|
|
|
#### 5.2 Comparar con Gio (Go)
|
|
Gio es immediate-mode moderno. Extraer patterns:
|
|
- [ ] Sistema de constraints/layout
|
|
- [ ] Gesture handling
|
|
- [ ] Animation system
|
|
- [ ] Theming approach
|
|
|
|
#### 5.3 Comparar con zcatui (nuestro TUI - 35 widgets)
|
|
Widgets de zcatui que deberíamos portar a GUI:
|
|
|
|
| Widget zcatui | zcatgui | Prioridad | Notas |
|
|
|---------------|---------|-----------|-------|
|
|
| input | ✅ | - | TextInput |
|
|
| select | ✅ | - | |
|
|
| checkbox | ✅ | - | |
|
|
| table | ✅ | - | |
|
|
| list | ✅ | - | |
|
|
| panel | ✅ | - | |
|
|
| **popup** | ⏳ | Alta | Modal/Popup |
|
|
| **menu** | ❌ | Alta | Menús contextuales |
|
|
| **tabs** | ❌ | Alta | Tab navigation |
|
|
| **tree** | ❌ | Media | TreeView |
|
|
| **calendar** | ❌ | Media | Date picker |
|
|
| **filepicker** | ❌ | Media | File browser |
|
|
| **dirtree** | ❌ | Media | Directory tree |
|
|
| progress | ❌ | Media | ProgressBar |
|
|
| gauge | ❌ | Baja | |
|
|
| sparkline | ❌ | Baja | |
|
|
| barchart | ❌ | Baja | |
|
|
| chart | ❌ | Baja | |
|
|
| canvas | ❌ | Baja | Custom drawing |
|
|
| markdown | ❌ | Baja | |
|
|
| syntax | ❌ | Baja | Code highlighting |
|
|
| viewport | ❌ | Media | Scrollable content |
|
|
| scroll | ❌ | Alta | ScrollArea |
|
|
| scrollbar | ❌ | Alta | |
|
|
| slider | ❌ | Media | |
|
|
| spinner | ❌ | Baja | Loading indicator |
|
|
| statusbar | ❌ | Media | |
|
|
| textarea | ❌ | Alta | Multiline input |
|
|
| tooltip | ❌ | Media | Hover help |
|
|
| help | ❌ | Baja | |
|
|
| logo | ❌ | Baja | |
|
|
| clear | ✅ | - | Implicit |
|
|
| block | ✅ | - | Panel/Container |
|
|
| paragraph | ✅ | - | Label |
|
|
|
|
### Fase 6: Widgets Específicos Simifactu
|
|
|
|
#### 6.1 AutoComplete/ComboBox Widget (CRÍTICO)
|
|
Widget usado en Simifactu para:
|
|
- Provincias (dropdown con búsqueda)
|
|
- Países (dropdown con búsqueda)
|
|
- Tipos IVA (dropdown con valores predefinidos)
|
|
- Poblaciones (autocomplete con sugerencias)
|
|
|
|
```zig
|
|
pub const AutoComplete = struct {
|
|
/// Current text value
|
|
text: []const u8,
|
|
/// All available options
|
|
options: []const []const u8,
|
|
/// Filtered options based on text
|
|
filtered: []const []const u8,
|
|
/// Whether dropdown is open
|
|
open: bool,
|
|
/// Selected index in filtered list
|
|
selected: i32,
|
|
/// Allow custom values not in list
|
|
allow_custom: bool,
|
|
/// Callback when value changes
|
|
on_change: ?*const fn([]const u8) void,
|
|
};
|
|
```
|
|
|
|
#### 6.2 AdvancedTable Analysis
|
|
Analizar `/mnt/cello2/arno/re/recode/go/simifactu/internal/ui/components/advanced_table/`:
|
|
- [ ] Sorting por columnas (click en header)
|
|
- [ ] Resize de columnas (drag)
|
|
- [ ] Column reordering (drag)
|
|
- [ ] Multi-select rows
|
|
- [ ] Copy/Paste cells
|
|
- [ ] Undo/Redo edits
|
|
- [ ] Calculated columns
|
|
- [ ] Column visibility toggle
|
|
- [ ] Export selected rows
|
|
|
|
#### 6.3 Sistema Lego Panels
|
|
Layout modular tipo Simifactu:
|
|
- [ ] Panel registry (panels registran su ID)
|
|
- [ ] Layout presets (Ctrl+1/2/3)
|
|
- [ ] Drag-and-drop panel reordering
|
|
- [ ] Panel minimize/maximize
|
|
- [ ] Save/restore layout state
|
|
- [ ] Panel communication (pub/sub)
|
|
|
|
### Fase 7: Features Avanzados
|
|
|
|
#### 7.1 Sistema de Themes
|
|
- [ ] Theme struct con todos los colores
|
|
- [ ] Hot-reload de themes
|
|
- [ ] Theme editor widget
|
|
- [ ] Persistencia de themes
|
|
|
|
#### 7.2 TTF Fonts
|
|
- [ ] Integrar stb_truetype
|
|
- [ ] Font atlas generation
|
|
- [ ] Multiple font sizes
|
|
- [ ] Font fallback chain
|
|
|
|
#### 7.3 Internacionalización
|
|
- [ ] String tables
|
|
- [ ] RTL support (futuro)
|
|
|
|
---
|
|
|
|
## WIDGETS ROADMAP VISUAL
|
|
|
|
```
|
|
COMPLETADOS (Fase 1-3.5):
|
|
✅ Label, Button, TextInput, Checkbox, Select, List
|
|
✅ Focus, Table, Split, Panel
|
|
✅ Keyboard integration
|
|
|
|
EN PROGRESO:
|
|
⏳ Modal/Popup
|
|
|
|
PRÓXIMOS (Fase 4-5):
|
|
📋 Menu, Tabs, ScrollArea, Scrollbar
|
|
📋 Radio, Slider, ProgressBar
|
|
📋 Textarea (multiline), Tooltip
|
|
|
|
SIMIFACTU-ESPECÍFICOS (Fase 6):
|
|
🎯 AutoComplete/ComboBox
|
|
🎯 AdvancedTable features (sort, resize, multi-select)
|
|
🎯 Lego Panel system
|
|
|
|
AVANZADOS (Fase 7):
|
|
🔮 Calendar, DatePicker
|
|
🔮 FilePicker, DirTree
|
|
🔮 Tree/TreeView
|
|
🔮 Themes hot-reload
|
|
🔮 TTF fonts
|
|
```
|
|
|
|
---
|
|
|
|
## ESTIMACIÓN DE TRABAJO
|
|
|
|
| Fase | Widgets/Features | Tiempo Est. |
|
|
|------|------------------|-------------|
|
|
| 4 | Modal/Popup | 2-3 días |
|
|
| 5.1 | Menu, Tabs, ScrollArea | 1 semana |
|
|
| 5.2 | Radio, Slider, Progress | 3-4 días |
|
|
| 5.3 | Textarea, Tooltip | 3-4 días |
|
|
| 6.1 | AutoComplete | 3-4 días |
|
|
| 6.2 | AdvancedTable | 1-2 semanas |
|
|
| 6.3 | Lego Panels | 1 semana |
|
|
| 7 | Themes, TTF | 1-2 semanas |
|
|
| **TOTAL** | | **6-8 semanas** |
|
|
|
|
---
|
|
|
|
## ARCHIVOS DE REFERENCIA
|
|
|
|
### Simifactu (Go/Fyne)
|
|
```
|
|
/mnt/cello2/arno/re/recode/go/simifactu/
|
|
├── internal/ui/components/advanced_table/ # AdvancedTable (2000+ LOC)
|
|
├── internal/ui/panels_v3/ # Lego panel system
|
|
├── third_party/fynex-widgets/ # AutoComplete, DateEntry, etc.
|
|
└── internal/ui/dialogs/ # Modal dialogs
|
|
```
|
|
|
|
### zcatui (Zig TUI - 35 widgets)
|
|
```
|
|
/mnt/cello2/arno/re/recode/zig/zcatui/src/widgets/
|
|
├── popup.zig # Modal/Popup reference
|
|
├── menu.zig # Menu widget
|
|
├── tabs.zig # Tab navigation
|
|
├── tree.zig # TreeView
|
|
├── calendar.zig # Calendar/DatePicker
|
|
├── filepicker.zig # File browser
|
|
└── ...
|
|
```
|
|
|
|
### DVUI (Zig GUI reference)
|
|
```
|
|
https://github.com/david-vanderson/dvui
|
|
```
|
|
|
|
### Gio (Go immediate-mode)
|
|
```
|
|
https://gioui.org/
|
|
docs/research/GIO_UI_ANALYSIS.md
|
|
```
|