feat(filter): tag chips + FTS5 search en toolbar (issue 0009)

- entity_ops: entity_search_fts (bm25, prefix tokens) + entity_list_by_tags (AND).
- AppState: filter_query_buf, filter_tags, filter_mode (highlight/hide), hits cache.
- views_filter_apply: combina tipos visibles + match-set (FTS query AND tags),
  highlight = color_override con alpha=0x40, hide = clear NF_VISIBLE.
- toolbar: input search + dropdown (max 20, click centra y selecciona),
  chips de tags con boton X, input para anadir tag, combo Highlight/Hide,
  Clear filter.
- Inspector: right-click sobre tag chip lo anade al filtro.
- main.cpp: reapply en cada frame si filter_dirty; cam_x/y al focus_target.
This commit is contained in:
2026-05-01 00:23:26 +02:00
parent e49cef5cb3
commit 54aba71bf5
6 changed files with 440 additions and 14 deletions
@@ -0,0 +1,38 @@
---
id: 0009
title: Filtro por tag + busqueda FTS5 en toolbar
status: completed
priority: medium
created: 2026-04-30
completed: 2026-05-01
depends_on: [0008]
---
## Objetivo
Buscar y filtrar entidades por nombre/tag/description directamente desde la
toolbar, aprovechando el `entities_fts` que ya existe en `operations.db`.
## UI
- Toolbar: input de busqueda + chip-list de tags activas como filtro.
- Mientras se escribe, dropdown con resultados (max 20). Click en resultado selecciona/centra el nodo.
- Click en un tag (en Inspector o en el dropdown) lo anade como chip de filtro.
- Modos de filtro:
- **Highlight**: nodos no-coincidentes se atenuan (alpha bajado), pero siguen presentes.
- **Hide**: nodos no-coincidentes se ocultan del viewport.
- Toggle en la toolbar.
## Cambios en codigo
- Nueva fn `entity_search_fts(db_path, query, limit, vector<EntityHit>* out)` con resultados ordenados por rank.
- Filtro vive en `AppState`: vector de tags + query string + modo (highlight/hide).
- En `graph_viewport.cpp` o donde aplique: aplicar mascara de visibilidad/alpha segun el filtro activo (sin tocar la BD).
- Reset filter desde la toolbar.
## Definicion de hecho
- FTS sobre name/description/tags/domain funciona y los resultados centran el viewport.
- Multiples chips de tag combinan con AND.
- Modo highlight y modo hide funcionan sin recargar el grafo.
- Limpiar filtro restaura visibilidad completa.