Files
fn_registry/cpp/functions/viz/data_table_viz_panels.md
T
egutierrez b9716a7cd6 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>
2026-05-18 18:17:08 +02:00

5.1 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, framework, params, output
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports tested tests test_file_path file_path framework params output
data_table_viz_panels function cpp viz 1.0.0 impure bool data_table::draw_extra_panel(State& st, VizPanel& p, int idx, const StageOutput& so, const std::vector<ColumnSpec>* col_specs) 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).
viz
table
imgui
ui
charts
visualization
tql
cpp-tables
implot
viz_render_cpp_viz
compute_column_stats_cpp_core
data_table_cpp_viz
data_table_types_cpp_core
false error_go_core
imgui
implot
false
cpp/functions/viz/data_table_viz_panels.cpp imgui
name desc
st State mutable: st.display (modo actual), st.viz_config (config de viz), st.extra_panels (paneles adicionales), st.stats_cache/stats_mode (estadisticas).
name desc
p VizPanel a renderizar: contiene su propio ViewConfig, titulo, display mode. Mutado si el usuario cambia la config del panel.
name desc
idx Indice del panel en st.extra_panels. Usado como ID ImGui para unicidad.
name desc
so StageOutput del stage activo: headers, types, cells row-major. Input de viz::render.
name desc
col_specs ColumnSpecs del TableInput principal si no vacias; null si no hay specs declarativas.
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

// 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.