Files
fn_registry/cpp/functions/viz/data_table_grid.md
T
egutierrez 7eb7b3d0c8 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.7 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_grid function cpp viz 1.0.0 impure void data_table::render_grid_stage0(const char* id, State& st, const char* const* cells, int row_count, int orig_cols, int eff_cols, const char* const* eff_headers, const ColumnType* eff_types, const int* src_for_eff, const std::vector<int>& visible_rows, const TableInput& main_t, std::vector<TableEvent>* events_out) Render del grid de datos de la tabla TQL: ImGui::BeginTable con freeze de cabecera, headers clicables (sort), drag-drop de columnas para reordenar, renderers declarativos por ColumnSpec (Badge/Progress/Duration/Icon/Button/Dots/CategoricalChip/ColorScale), aplicacion de ColorRules por celda, seleccion de rango (Ctrl+C TSV), stats overlay en encabezados. Dos entrypoints: render_grid_stage0 (datos crudos + derived Lua) y render_grid_stage_n (output materializado de compute_stage). Sub-funcion extraida de modules/data_table/data_table.cpp (issue 0107c).
viz
table
imgui
ui
grid
cell-renderer
sorting
tql
cpp-tables
data_table_color_rules_cpp_viz
data_table_cpp_viz
data_table_types_cpp_core
false error_go_core
imgui
false
cpp/functions/viz/data_table_grid.cpp imgui
name desc
id ID unico de ImGui para BeginTable (ej. '##my_table'). Debe ser unico por instancia en la ventana.
name desc
st State mutable. El grid lee st.col_order, st.col_visible, st.color_rules, st.sel_anchor/end, st.stages[active].sorts. Lo muta en respuesta a clicks, drag-drop, seleccion.
name desc
cells Puntero a cells originales row-major [rows * orig_cols]. Para stage0; stage_n recibe cur_cells ya materializados.
name desc
row_count / orig_cols / eff_cols Dimensiones de la tabla. orig_cols = columnas del input; eff_cols = orig_cols + derived cols del stage 0.
name desc
eff_headers / eff_types Headers y tipos efectivos (size eff_cols). Usados para headers del BeginTable y para render de celda.
name desc
src_for_eff Mapeo eff_col_idx -> src_col_idx en la tabla original. Necesario para leer cells[row * orig_cols + src]. Solo para stage0.
name desc
visible_rows Indices de filas visibles tras filtrado (output de compute_visible_rows). Solo para stage0.
name desc
main_t TableInput principal: proporciona column_specs para draw_cell_custom y los column_spec ids para eventos.
name desc
events_out Si no null, recibe TableEvent (ButtonClick, RowDoubleClick, RowRightClick) generados este frame.
Void. Mutates st (sort, selection, col_order). Appends to events_out si no null.

Documentacion

Sub-funcion que encapsula el render del grid de celdas de la tabla TQL. Es el bloque mas grande del refactor 0107c (~1300 LOC del fuente original).

Renderers declarativos (draw_cell_custom)

Renderer Que muestra
Text Selectable de texto, tooltip on-hover si tooltip_on_hover=true
Badge Pastilla de color (background del spec) con texto
Progress Barra de progreso ImGui [0..100]
Duration Formato "Xh Ym Zs" desde segundos enteros
Icon Glyph Tabler (usa icons_tabler.h)
Button Boton clickable; emite TableEventKind::ButtonClick con action_id
Dots Circulos coloreados por reglas de chips del ColumnSpec
CategoricalChip Pastilla con borde coloreado; color por palette hash
ColorScale Degradado de fondo segun valor numerico normalizado

Flujo render_grid_stage0

  1. Setup ImGuiTableFlags (Borders + RowBg + Resizable + ScrollY).
  2. BeginTableTableSetupColumn por cada col visible en st.col_order.
  3. TableSetupScrollFreeze(0, 1) para freeze de header.
  4. Header row: Selectable con sort-click (apply_header_sort_click), drag-drop source/target para reordenar columnas.
  5. Por cada fila en visible_rows: por cada col visible en st.col_order: apply_color_rules_for_celldraw_cell_custom.
  6. Seleccion de rango: mouse drag con sel_anchor/sel_end; Ctrl+C genera TSV al portapapeles.
  7. EndTable + PopStyleColor(3).

Flujo render_grid_stage_n

Igual pero opera sobre cur_cells ya materializados del chain compute_stage. Ademas:

  • Stats overlay en headers (histograma/top-categories de st.stats_cache).
  • Drill popup: right-click en celda de breakout col ofrece "Drill into: col = val".

Ejemplo

// Dentro del render() principal, path stage == 0:
if (st.display == data_table::ViewMode::Table && visible_cols > 0) {
    data_table::render_grid_stage0(id, st,
        cells_in, row_count_in, orig_cols, eff_cols,
        eff_headers.data(), eff_types.data(), src_for_eff.data(),
        visible_rows, main_t, events_out);
}

Cuando usarla

Llamar desde el entrypoint thin data_table::render() tras calcular visible_rows (stage 0) o materializar el chain (stage > 0). No llamar directamente desde apps — la API publica es data_table::render().

Gotchas

  • render_grid_stage0 y render_grid_stage_n deben llamarse dentro de un ImGui::BeginChild o contexto de ventana activo. No funcionan fuera de un frame ImGui.
  • La funcion hace PushStyleColor para Header/HeaderHovered/HeaderActive y debe hacer el correspondiente PopStyleColor(3). No anidar pushes adicionales sin su pop.
  • draw_cell_custom con renderer Button emite eventos; si events_out es null se ignoran silenciosamente (back-compat).
  • El thread_local en el entrypoint original (main_hdr_ptrs, joinables_v) no se mueve a esta funcion — esos son responsabilidad del entrypoint thin.
  • Despues del split, apply_color_rules_for_cell vive en data_table_color_rules_cpp_viz — no re-implementar aqui.