Files
graph_explorer/views.h
T
egutierrez b767b5b85e feat: graph_explorer app — agnostic operations.db viewer (issue 0049k)
App C++ ImGui que abre cualquier operations.db del registry y lo visualiza
como grafo con shapes/iconos/layouts/filtros/labels.

Composicion del registry:
- viz/graph_renderer + graph_force_layout(_gpu) + graph_layouts +
  graph_viewport + graph_labels + graph_icons + graph_sources
- core: toolbar, modal_dialog, select, text_input, tree_view, page_header,
  fullscreen_window, button, badge, empty_state

Capas:
- data.{h,cpp}    — dispatcher GraphLoadFn (operations hoy; json/graphml manana).
- types_registry.{h,cpp} — parser YAML minimal + tabler_codepoint_by_name +
  apply_types_yaml + IconAtlas builder.
- views.{h,cpp}   — Toolbar, Legend, Inspector, Stats, modal Filters/Open.
- layout_store.{h,cpp} — graph_explorer.db SQLite con tabla layouts(graph_hash,
  node_id, x, y, pinned, updated_at). UPSERT por nodo.
- main.cpp        — CLI (--input/--types/--layout) + fn::run_app + bucle
  force layout (CPU/GPU toggle) + render con 3 columnas (Legend / Viewport /
  Inspector+Stats).

examples/types.yaml: 10 entidades OSINT (Person/Email/Domain/Phone/Org/IBAN/
Account/Document/Address/Url) + 5 relaciones (owns/knows/located_in/
transfers_to/member_of) con shapes Tabler reales.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 00:13:59 +02:00

80 lines
2.8 KiB
C++

#pragma once
struct GraphData;
struct GraphViewportState;
namespace ge {
// Estado compartido entre las vistas y el bucle render. Pasado por puntero
// desde main.cpp.
struct AppState {
// Datos
GraphData* graph = nullptr;
GraphViewportState* viewport = nullptr;
// Layout activo
int layout_mode = 0; // 0=force, 1=grid, 2=circular, 3=radial, 4=hierarchical, 5=fixed
int apply_layout_tick = 0; // se incrementa cuando hay que reaplicar layout
// Force layout — config + GPU toggle
float repulsion = 1500.0f;
float attraction = 0.04f;
float gravity = 0.005f;
bool use_gpu = false;
// Stats UI
int fps_estimate = 0; // sintetico, calculado en main loop
// Filters / visibility por tipo (longitud = graph->type_count o rel_type_count)
bool type_visible[256] = {};
bool rel_type_visible[256] = {};
int type_visible_n = 0;
int rel_type_visible_n = 0;
// Inspector
bool panel_legend = true;
bool panel_inspector = true;
bool panel_stats = true;
bool show_filters_modal = false;
bool show_open_modal = false;
// Triggers — main.cpp lee estos flags y actua
bool want_fit = false;
bool want_save_layout = false;
bool want_reload = false;
bool want_open_file = false; // marcado al confirmar el modal Open
char open_buf[512] = {};
// Labels overlay
bool labels_enabled = true;
};
// Toolbar superior (Open file, Layout selector, Filters..., Fit, Save layout).
void views_toolbar(AppState& app);
// Panel Legend — checkboxes por tipo (entity / relation) con color swatch.
void views_legend(AppState& app);
// Panel Inspector — metadata del nodo seleccionado + vecinos.
void views_inspector(AppState& app);
// Stats line — counts + fps + energy + selection.
void views_stats(AppState& app);
// Modal Filters — toggles por tipo agrupados en columnas. Devuelve true si
// el usuario togglo algo.
bool views_filters_modal(AppState& app);
// Modal Open file — text input + boton Open.
bool views_open_modal(AppState& app);
// Refresca los flags `flags` de cada nodo/arista segun el array
// `type_visible[]` / `rel_type_visible[]`. Lineal en N+M.
void views_apply_visibility(AppState& app);
// Inicializa los arrays type_visible / rel_type_visible a true para todos
// los tipos del grafo activo. Llamar tras cargar/recargar el grafo.
void views_reset_visibility(AppState& app);
} // namespace ge