Skip to content

feat(#65): Scroll en BD y FP - ventanas fijas 900x600#67

Merged
anlaco merged 16 commits into
mainfrom
feature/issue-65-scroll-bd-fp
Apr 11, 2026
Merged

feat(#65): Scroll en BD y FP - ventanas fijas 900x600#67
anlaco merged 16 commits into
mainfrom
feature/issue-65-scroll-bd-fp

Conversation

@anlaco
Copy link
Copy Markdown
Owner

@anlaco anlaco commented Apr 11, 2026

Summary

Implementación del scroll en Board Diagram (BD) y Front Panel (FP) con ventanas fijas de 900x600.

Cambios principales

  • Ventanas fijas 900x600 sin maximizar ni resize
  • Scrollbars draw-based que solo aparecen cuando el contenido supera el viewport
  • Scroll wheel + click scrollbar con límites por contenido real
  • Scroll horizontal en FP corregido

Issues cerrados

Tests

  • 462 tests PASS

Test plan

  • Verificar scroll wheel en BD y FP
  • Verificar click en scrollbars
  • Verificar que los límites de scroll son correctos
  • Verificar que las ventanas se mantienen en 900x600

🤖 Generated with Claude Code

OpenCodeMCP-BetaTest and others added 16 commits April 11, 2026 11:47
- load-qlib: parsea manifiesto qlib.red y devuelve objeto con
  name/version/dir/members (rutas absolutas a .qvi miembros)
- find-qlibs/from: busca directorios .qlib en un directorio dado
- palette-add-qlib-vi: inserta VI de librería como nodo subvi
- open-palette ahora dinámica: sección 'Librerías' si hay .qlib en what-dir
- Ejemplo math.qlib/ con add.qvi + subtract.qvi + usa-libreria.qvi
- 19 tests nuevos en test-qlib.red — 481 tests PASS

Nota: exec func en sub-VIs de ejemplo usan /local para evitar solapamiento
de variables globales cuando hay múltiples sub-VIs en el mismo caller.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- load-qlib ahora recibe fichero .qlib (no directorio) como LabVIEW
- find-qlibs busca ficheros con sufijo .qlib (suffix? d = %.qlib)
- open-palette usa system/options/path en vez de what-dir para encontrar
  .qlib en el directorio del proyecto (no en src/)
- Ejemplo reestructurado: math.qlib (fichero) + math/ (subdirectorio con VIs)
- 482 tests PASS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Red cambia what-dir al directorio del script (src/) al cargarlo.
Se captura _qtorres-project-dir = un nivel arriba de src/ en qtorres.red
antes de cualquier #include. La paleta usa esa variable para find-qlibs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- FP abre con view blocking (master); BD con view/no-wait (slave)
- Ctrl+E en FP: abre/recrea BD (siempre al frente cuando se recrea)
- Ctrl+E en BD: trae FP al frente con show
- Cerrar FP → unview/all; cerrar BD → on-close limpia bd-window: none
- show-bd-window recrea la ventana desde app-model cuando BD fue cerrado
- current-file en app-model: rastrea el .qvi cargado (usado por find-qlibs)
- Títulos de ventanas se sincronizan al hacer Load y Save
- test-window-raise.red: minitest cross-platform para verificar window raise
- GTK-013: show face no garantiza elevar ventana al frente en GTK (pendiente Windows)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resize:
- BD y FP windows: flags [resize] + on-resize recalcula tamaño del canvas/panel
- canvas-face y panel-face se redimensionan con la ventana en tiempo real
- render-bd lee dimensiones dinámicas desde model/canvas-ref/size (fallback 880x490)

Scroll:
- model.red: campos scroll-x, scroll-y (BD) y fp-scroll-x, fp-scroll-y (FP)
- render-bd: clip 0x0 + translate(negate scroll) + reset-matrix + scrollbars Draw
- render-fp-panel: igual para el FP
- canvas.red: on-wheel (rueda=vertical, shift+rueda=horizontal, paso 40px)
  hit-test compensa scroll en on-down, on-over, on-up, on-dbl-click
- panel.red: on-wheel + compensación en todos los actores de ratón

Scrollbars:
- Indicadores visuales (no interactivos) proporcionales al contenido
- Grosor 8px, estilo Mac (track gris claro, thumb gris oscuro)
- Solo aparecen cuando el contenido supera el viewport

GTK-003: on-resize puede reportar tamaño incorrecto en Linux — documentar si se observa

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Maximize:
- on-resize usa timer 50ms (on-time) para leer face/size correcto en GTK
  GTK-003: maximize no actualiza face/size antes de disparar on-resize
- Mismo patrón en BD y FP

Scrollbars interactivos:
- bd-content-bounds extraído como función en canvas-render.red (compartido)
- on-down en canvas detecta click en zona de scrollbar (coords pantalla)
  antes de la compensación de scroll — redirige a scroll position
- on-down en panel igual para scrollbar vertical del FP
- Click en thumb o track del scrollbar → jump directo a esa posición

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Red/View clipea automáticamente los faces a sus bounds. El comando
`clip 0x0 (size)` en el Draw dialect interfería con `reset-matrix`,
ocultando los scrollbars que se dibujan en coordenadas de pantalla
tras el reset. Al eliminarlo, los scrollbars son visibles siempre
que el contenido supere el viewport.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Rescate de hallazgos de la rama feat/test-overhead-isolation
(commit aa0ca36) que no llegaron a esta rama:

- GTK-014: face/size flip-flop CSD↔cliente tras alt+tab/maximize,
  con ejemplo capturado y workaround bidireccional.
- GTK-015: Tab crashea navegación de foco en ventana con solo
  base face (no fatal). Documentados los 5 hallazgos del
  diagnóstico.
- tests/test-overhead.red: test de diagnóstico con logging visual
  y a /tmp/test-overhead.log para validar la detección de flip.

Útil para Issue #65 (ventanas redimensionables con scroll).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GTK-016: bajo maximize/restore repetidos, Red/View genera un access
violation nativo (*** Runtime Error 1) en el path de show/draw.
En un caso arrastró al sistema entero. Sin workaround user-land.
Severidad crítica — caso mínimo reproducible pendiente para upstream.

test-overhead.red: simplificado a observador pasivo.
- Elimina detect-csd-flip (inferencia imposible: deltas idénticos
  entre flip legítimo y maximize transition).
- _csd-overhead se mide una vez al primer on-time y queda fijo.
- log-size registra deltas pasivamente para diagnóstico GTK.
- set-focus diferido con flag seteado antes de llamar (sin reentrada).
- on-focus ya no redispara face/rate (evita tormenta de on-time).
- show canvas en vez de show face (GTK3 no propaga shrink vía padre).

Consecuencia aceptada: en modo cliente (alt+tab) el canvas queda
~98x108 más pequeño de lo óptimo pero nunca overflow — predecible.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
En GTK con CSD, face/size incluye header bar + shadows (~98x130 px).
El resize anterior restaba solo márgenes estáticos, causando overflow
del canvas en estado normal y redimensionado incorrecto en maximize.

Cambios:
- Variables _bd-spec-size/_bd-csd-overhead y _fp-spec-size/_fp-csd-overhead
  junto a helper compute-child-size (garantiza mínimo 50x50).
- BD on-time: mide _bd-csd-overhead al primer disparo y lo usa siempre.
- BD on-close: resetea _bd-csd-overhead para re-medir al reabrir (Ctrl+E).
- FP on-time: análogo con _fp-csd-overhead.

Sin detección de flips CSD↔cliente (GTK-014, irresoluble con heurísticas
de delta — ver tests/test-overhead.red). En modo cliente (alt+tab) el
canvas queda ~98x108 px más pequeño de lo óptimo (padding aceptado).

482/482 tests PASS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
El scroll con rueda del ratón no tenía cota superior — `max 0` evitaba
scroll negativo pero permitía scroll infinito aunque no hubiera contenido
fuera del viewport.

BD: on-wheel usa bd-content-bounds para calcular max-sx/max-sy y aplicar
    min max-s? al nuevo scroll-x/scroll-y.

FP: añade fp-content-bounds en panel-render.red (análoga a bd-content-bounds,
    solo eje Y por ahora). on-wheel del FP la usa para limitar fp-scroll-y.

482/482 tests PASS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- fp-content-bounds ahora calcula cx (eje X) además de cy (eje Y).
- render-fp-panel añade scrollbar horizontal (mismo patrón que BD).
- on-down del FP detecta click en scrollbar horizontal y lo aplica
  con cota superior (max-sx) igual que el vertical.
- on-wheel del FP: shift+wheel mueve fp-scroll-x (horizontal),
  wheel normal mueve fp-scroll-y (vertical), ambos con límite.
- on-down del FP usa fp-content-bounds (elimina código duplicado
  del cálculo de _cy que había inline).

482/482 tests PASS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
bd-content-bounds y fp-content-bounds tenían un mínimo hardcodeado
(600x400 y 400x400) que hacía aparecer scrollbars siempre que el
viewport era menor que esos valores, aunque no hubiera contenido.

- Mínimo a 0x0 en ambas funciones (pure content bounds).
- render-bd y render-fp-panel usan max(viewport, bounds) en vez de
  sobreescribir con los bounds crudos.
- Eliminado cálculo duplicado en render-bd (líneas 1020-1029 eran
  idénticas a bd-content-bounds pero se descartaban al sobreescribir).

Resultado: scrollbars aparecen únicamente cuando hay nodos o items
fuera del área visible. Sin contenido → sin scrollbars.

482/482 tests PASS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Simplifica el sistema de ventanas eliminando toda la complejidad de
overhead CSD y redimensionado dinámico:

- Ambas ventanas (BD y FP) usan tamaño fijo _win-size = 900x600.
- Sin flags: [resize] → sin botón maximizar, sin redimensionado.
- Eliminados: _bd-spec-size, _fp-spec-size, _bd-csd-overhead,
  _fp-csd-overhead, compute-child-size, on-resize, on-time.
- canvas-face: 890x557 (900-10 wide, 600-38-5 tall con toolbar).
- panel-face:  890x590 (900-10 wide, 600-10 tall).
- Los scrollbars siguen activos cuando el contenido supera el viewport.

482/482 tests PASS.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CLAUDE.md:
- #65 marcado como completado con descripción del resultado final
  (ventanas fijas 900x600, scrollbars draw-based, límites por contenido)
- Próximo paso actualizado a Fase 4/5

GTK_ISSUES.md:
- GTK-014 workaround actualizado: detección bidireccional descartada,
  workaround final son ventanas fijas sin resize (Issue #65)
- Referencia a tests/test-overhead.red para diagnóstico histórico

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@anlaco anlaco merged commit 0268dbb into main Apr 11, 2026
1 check passed
@anlaco anlaco deleted the feature/issue-65-scroll-bd-fp branch April 21, 2026 22:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant