chore: snapshot WIP previo + flow 0008 + 7 sub-issues (0112-0119)
Snapshot de WIP acumulado de sesiones previas antes de merge wave 1 del flow 0008 (kanban_cpp + agent_runner_api + DoD schema). Incluye: - dev/flows/0008-kanban-cpp-and-agent-workflows.md - dev/issues/0112-0119*.md (7 sub-issues) - WIP previo en cmd/fn/doctor.go, registry/*, modules/, cpp/, etc. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
---
|
||||
name: data_table_viz_panels
|
||||
kind: function
|
||||
lang: cpp
|
||||
domain: viz
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "bool data_table::draw_extra_panel(State& st, VizPanel& p, int idx, const StageOutput& so, const std::vector<ColumnSpec>* col_specs)"
|
||||
description: "Paneles de visualizacion lateral de la tabla TQL: toggle tabla/chart, paneles extra independientes (histogramas, linea, scatter, value-counts), popup de configuracion de viz (cols x/y, modo, color, bins), selector de ViewMode via grid de iconos, y recalculo lazy de estadisticas de columna. Sub-funcion extraida de modules/data_table/data_table.cpp (issue 0107c)."
|
||||
tags: [viz, table, imgui, ui, charts, visualization, tql, cpp-tables, implot]
|
||||
uses_functions:
|
||||
- viz_render_cpp_viz
|
||||
- compute_column_stats_cpp_core
|
||||
- data_table_cpp_viz
|
||||
uses_types:
|
||||
- data_table_types_cpp_core
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: [imgui, implot]
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
file_path: "cpp/functions/viz/data_table_viz_panels.cpp"
|
||||
framework: imgui
|
||||
params:
|
||||
- name: st
|
||||
desc: "State mutable: st.display (modo actual), st.viz_config (config de viz), st.extra_panels (paneles adicionales), st.stats_cache/stats_mode (estadisticas)."
|
||||
- name: p
|
||||
desc: "VizPanel a renderizar: contiene su propio ViewConfig, titulo, display mode. Mutado si el usuario cambia la config del panel."
|
||||
- name: idx
|
||||
desc: "Indice del panel en st.extra_panels. Usado como ID ImGui para unicidad."
|
||||
- name: so
|
||||
desc: "StageOutput del stage activo: headers, types, cells row-major. Input de viz::render."
|
||||
- name: col_specs
|
||||
desc: "ColumnSpecs del TableInput principal si no vacias; null si no hay specs declarativas."
|
||||
output: "Bool para draw_extra_panel: true si el usuario cerro el panel (caller debe hacer erase de st.extra_panels[idx]). Void para el resto."
|
||||
---
|
||||
|
||||
## Documentacion
|
||||
|
||||
Sub-funcion que encapsula los paneles de visualizacion lateral de la tabla TQL. Permite al usuario ver graficos (bar, line, scatter, pie, etc.) en paralelo a la tabla de datos, con configuracion interactiva.
|
||||
|
||||
### Funciones publicas
|
||||
|
||||
| Funcion | Que hace |
|
||||
|---|---|
|
||||
| `draw_table_toggle(display, last_non_table, id, st_ptr)` | Boton toggle "Table / Chart". Guarda el ultimo modo viz en `last_non_table`. |
|
||||
| `draw_extra_panel(st, p, idx, so, col_specs)` | Child window con header/footer mini: titulo, pin, close. Llama `viz::render`. Retorna true si cerrado. |
|
||||
| `draw_viz_config_popup(st)` | Popup tabbado: config de viz principal + config de cada panel extra. Permite cambiar columnas x/y, modo, color, bins, anadir panel. |
|
||||
| `draw_viz_selector(st)` | Grid de iconos ViewMode; seleccion cambia `st.display`. Incluye boton "Ask AI" -> abre `data_table_ai_panel`. |
|
||||
| `maybe_recompute_stats(st, cells, ...)` | Recalcula stats lazy si `visible_rows` cambio. Solo cuando `st.stats_mode == true`. |
|
||||
|
||||
### draw_extra_panel: ciclo de vida de un VizPanel
|
||||
|
||||
1. El usuario abre un panel desde `draw_viz_selector` (boton "+").
|
||||
2. Se agrega un `VizPanel` a `st.extra_panels` con config por defecto.
|
||||
3. Cada frame: `draw_extra_panel(st, p, i, so, specs)`.
|
||||
4. Si retorna `true`: `st.extra_panels.erase(begin + i)`.
|
||||
|
||||
### maybe_recompute_stats: politica de cache
|
||||
|
||||
Compara un hash de `visible_rows` (FNV-1a sobre el vector de indices) contra `st.stats_last_visible_hash`. Si difiere, llama `compute_column_stats_cpp_core` por cada columna efectiva y actualiza `st.stats_cache`. Costo O(cols * visible_rows) — llamar solo cuando stats_mode este activo.
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```cpp
|
||||
// Llamado desde render() tras el grid (path stage 0):
|
||||
if (st.display != data_table::ViewMode::Table) {
|
||||
data_table::draw_table_toggle(st.display, U.last_non_table_main, "main", &st);
|
||||
}
|
||||
|
||||
// Paneles extra cuando NO estamos en modo tabla:
|
||||
if (st.display != data_table::ViewMode::Table && !st.extra_panels.empty()) {
|
||||
int close_idx = -1;
|
||||
for (int i = 0; i < (int)st.extra_panels.size(); ++i) {
|
||||
if (data_table::draw_extra_panel(st, st.extra_panels[i], i, so, &main_t.column_specs))
|
||||
close_idx = i;
|
||||
}
|
||||
if (close_idx >= 0) st.extra_panels.erase(st.extra_panels.begin() + close_idx);
|
||||
}
|
||||
|
||||
// Config popup (activado por boton en draw_viz_selector):
|
||||
data_table::draw_viz_config_popup(st);
|
||||
data_table::draw_viz_selector(st);
|
||||
```
|
||||
|
||||
## Cuando usarla
|
||||
|
||||
Llamar desde el entrypoint thin `data_table::render()` despues del grid y antes de los modales. No llamar directamente desde apps — la API publica es siempre `data_table::render()`.
|
||||
|
||||
## Gotchas
|
||||
|
||||
- `draw_extra_panel` abre un `ImGui::BeginChild` interno — no anidar dentro de otro child que ya recorte el area de pintado.
|
||||
- `draw_viz_selector` incluye la apertura del modal Ask AI (`st.ask_open = true`). El modal real lo dibuja `data_table_ai_panel_cpp_viz`. El order de calls importa: selector primero, luego el modal.
|
||||
- `maybe_recompute_stats` es potencialmente caro (O(visible_rows * cols)). Solo activar con `st.stats_mode = true` via boton "Show stats"; el boton vive en el area de chrome del render principal.
|
||||
- ImPlot context debe estar activo cuando se llama `viz::render` desde `draw_extra_panel`. Garantizado si el caller usa `fn::run_app` con ImPlot inicializado en `cfg`.
|
||||
Reference in New Issue
Block a user