feat(kotlin-compose): design system + 33 components + gallery_kt + e2e android emulator + scaffolder fixes
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+27
-5
@@ -32,6 +32,15 @@ Antes de mergear una app, verificar uno por uno:
|
||||
- [ ] **GL loader** (si la app usa OpenGL >= 2.0 directamente). Pasar
|
||||
`AppConfig::init_gl_loader = true` para que `fn::run_app()` llame
|
||||
`fn::gfx::gl_loader_init()` tras crear el contexto.
|
||||
- [ ] **Auto-dockspace** (default `true`). El framework llama
|
||||
`ImGui::DockSpaceOverViewport(0, GetMainViewport(), PassthruCentralNode)`
|
||||
antes de `render_fn()` cada frame. **NO** llamar `DockSpaceOverViewport`
|
||||
manual en `render()` — duplica nodes y causa flicker. Apps que usan
|
||||
layout custom con `ImGui::DockSpace` propio o `fullscreen_window` deben
|
||||
poner `cfg.auto_dockspace = false`.
|
||||
- [ ] **No `fn_ui::app_menubar(...)` manual**. El framework ya lo dibuja en
|
||||
cada frame leyendo `cfg.panels`/`cfg.layouts_cb`/`cfg.view_extras`.
|
||||
Llamarlo manualmente provoca barra duplicada o pisada.
|
||||
- [ ] **Tokens en lugar de hex literales**. Usar `fn_tokens::colors`,
|
||||
`fn_tokens::spacing`, `fn_tokens::radius`. Nunca `IM_COL32(0x12,0x34,...)`,
|
||||
nunca `ImVec4(0.5f, 0.5f, 0.5f, 1.0f)` ad-hoc.
|
||||
@@ -46,14 +55,23 @@ Antes de mergear una app, verificar uno por uno:
|
||||
- [ ] **Build incremental**. La app aparece en `cpp/CMakeLists.txt` con su
|
||||
`add_subdirectory(apps/<nombre>)`. Sin warnings nuevos.
|
||||
|
||||
## Crear app nueva — usar el scaffolder
|
||||
|
||||
```bash
|
||||
# App suelta en cpp/apps/<name>/
|
||||
fn run init_cpp_app my_tool --desc "Herramienta para X"
|
||||
|
||||
# App dentro de un proyecto
|
||||
fn run init_cpp_app finance_panel --project budget --desc "Panel de finanzas"
|
||||
```
|
||||
|
||||
`init_cpp_app_bash_pipelines` genera la estructura canonica (main.cpp + CMakeLists.txt + app.md) cumpliendo este documento, registra la app en `cpp/CMakeLists.txt`, crea repo Gitea `dataforge/<name>` y ejecuta `fn index`. Despues solo se completa `uses_functions` cuando se importan funciones del registry.
|
||||
|
||||
## Esqueleto minimo
|
||||
|
||||
```cpp
|
||||
#include "framework/app_base.h"
|
||||
#include "core/icons_tabler.h"
|
||||
#include "core/panel_menu.h"
|
||||
#include "core/app_settings.h"
|
||||
#include "core/tokens.h"
|
||||
#include "imgui.h"
|
||||
|
||||
namespace {
|
||||
@@ -67,7 +85,7 @@ constexpr fn_ui::PanelToggle k_panels[] = {
|
||||
} // namespace
|
||||
|
||||
static void render_my_app() {
|
||||
ImGui::DockSpaceOverViewport(0, ImGui::GetMainViewport());
|
||||
// Sin DockSpaceOverViewport ni app_menubar manual — los da el framework.
|
||||
if (show_inspector) {
|
||||
ImGui::Begin(TI_INFO_CIRCLE " Inspector", &show_inspector);
|
||||
ImGui::TextUnformatted("Inspector contents");
|
||||
@@ -84,9 +102,11 @@ int main() {
|
||||
fn::AppConfig cfg;
|
||||
cfg.title = "My App";
|
||||
cfg.about = {"My App", "0.1.0", "Demo de app shell canonica"};
|
||||
cfg.log = {"my_app.log", 1};
|
||||
cfg.panels = k_panels;
|
||||
cfg.panel_count = sizeof(k_panels) / sizeof(k_panels[0]);
|
||||
cfg.init_gl_loader = false; // ponerlo en true si usas OpenGL directo
|
||||
cfg.init_gl_loader = false; // true si usas OpenGL directo
|
||||
// cfg.auto_dockspace = false; // solo si gestionas DockSpace propio (ej. shaders_lab)
|
||||
return fn::run_app(cfg, render_my_app);
|
||||
}
|
||||
```
|
||||
@@ -104,6 +124,8 @@ escribir una linea de codigo.
|
||||
| `glfwInit()` en `main` | `fn::run_app()` |
|
||||
| `ImVec4(0.5,0.5,0.5,1)` ad-hoc | `fn_tokens::colors::text_dim` |
|
||||
| Crear menubar a mano en cada frame | `AppConfig::panels` + `AppConfig::layouts_cb` |
|
||||
| `fn_ui::app_menubar(nullptr,0,nullptr)` en render | El framework ya lo dibuja |
|
||||
| `ImGui::DockSpaceOverViewport(...)` en render | `auto_dockspace=true` por defecto |
|
||||
| `ImGui::Begin(u8"\xEF\xA0\x83 ...")` | `ImGui::Begin(TI_HOME " ...")` |
|
||||
| Settings dispersos por la app | `settings_window_add_section()` |
|
||||
| About hardcoded en un `Begin/End` | `AppConfig::about` o `about_window_set_info()` |
|
||||
|
||||
Reference in New Issue
Block a user