--- id: "0043" title: "Estandarizar shell de las 4 apps C++ (About + Settings + paneles + tokens)" status: completado type: refactor domain: - cpp-stack scope: multi-app priority: alta depends: [] blocks: [] related: [] created: 2026-05-17 updated: 2026-05-17 tags: [] --- # 0043 — Estandarizar shell de las 4 apps C++ (About + Settings + paneles + tokens) ## Metadata | Campo | Valor | |-------|-------| | **ID** | 0043 | | **Estado** | pendiente | | **Prioridad** | alta | | **Tipo** | refactor — `cpp/apps/*` y `projects/fn_monitoring/apps/registry_dashboard` | ## Dependencias Bloquea-por: **0041** (AppConfig extendido), **0042** (layout_storage publico). --- ## Objetivo Que las 4 apps C++ con GUI (`shaders_lab`, `chart_demo`, `primitives_gallery`, `registry_dashboard`) sigan el mismo patron de inicializacion documentado en `cpp/PATTERNS.md` (issue 0041): About + Settings + paneles + tokens, sin reinventar boilerplate. ## Contexto Auditoria muestra que cada app arranca distinto: solo `shaders_lab` aprovecha menubar con paneles, solo `registry_dashboard` registra About + Settings, `primitives_gallery` llama `apply_dark_theme()` + `gl_loader_init()` a mano. Tras 0041 y 0042, se puede unificar. ## Arquitectura ``` cpp/apps/ ├── shaders_lab/main.cpp # MOD — usa layout_storage publico, About, init via AppConfig ├── chart_demo/main.cpp # MOD — registra About, simplifica ├── primitives_gallery/main.cpp # MOD — gl_loader_init via AppConfig, About └── text_editor_smoke/ # SIN CAMBIOS (test CLI) projects/fn_monitoring/apps/registry_dashboard/ └── main.cpp # MOD — usa AppConfig.about en lugar de about_window_set_info inline ``` ## Tareas ### Fase 1 — chart_demo (mas simple, validacion temprana) 1.1 Cambiar a: ```cpp return fn::run_app({ .title="chart_demo", .width=1280, .height=800, .about={.name="chart_demo", .version="0.1.0", .description="Demo de primitivos viz: line, scatter, bar, heatmap"} }, render); ``` 1.2 Quitar la llamada manual a `app_menubar(nullptr,0,nullptr)` del render — `run_app` la invoca por nosotros si hay panels/layouts; en este caso sin panels, dejar render limpio (o llamar `app_menubar(nullptr,0,nullptr)` solo si hace falta menubar para Settings). 1.3 Build OK. ### Fase 2 — primitives_gallery 2.1 Quitar `apply_dark_theme()` y `gl_loader_init()` del init manual (l. 129-134). Pasar `init_gl_loader=true` y `theme=ThemeMode::FnDark` en `AppConfig`. 2.2 Anadir About (`name="Primitives Gallery"`, version, description). 2.3 Mantener `app_menubar(nullptr,0,nullptr)` solo si la menubar la quiere la app — opcionalmente delegar a `run_app` extendido. 2.4 Build OK. ### Fase 3 — registry_dashboard 3.1 Reemplazar la llamada manual `about_window_set_info(...)` (l. 121-127) por `AppConfig::about={...}`. La seccion `Status` se queda como `settings_window_add_section` (no cambia). 3.2 Build OK. ### Fase 4 — shaders_lab 4.1 Reemplazar el bloque de layouts inline por `fn_ui::layout_storage_open("shaders_lab.db")` + `layout_storage_make_callbacks` (consume issue 0042). 4.2 Anadir About (`name="shaders_lab"`, version, description). 4.3 Pasar `panels` y `layouts_cb` via `AppConfig` (issue 0041) — quitar la llamada manual a `app_menubar`. 4.4 Build OK. ### Fase 5 — Verificacion cross 5.1 Build Linux y Windows de las 4 apps. 5.2 Run rapido en Linux para confirmar que About y Settings/Status aparecen en el menubar de cada una. ## Decisiones de diseno - Tocar registry_dashboard para que sea consistente con el patron, aunque hoy ya tenia About/Settings via APIs sueltas. - text_editor_smoke se queda igual (es un test CLI). ## Riesgos - Si `run_app` invoca `app_menubar` y la app tambien lo llama, salen dos menubars. Verificar que cada main.cpp solo llama `app_menubar` si NO esta declarado en AppConfig. - shaders_lab: la migracion a `layout_storage` debe preservar layouts existentes — ver riesgo de 0042. ## Validacion - Las 4 apps abren y muestran menu Settings con Settings… + About… (mas Status… donde aplique). - shaders_lab guarda/carga layouts despues de la migracion. - `cmake --build` pasa para todas. Cross-compile Windows OK.