feat(#65): Scroll en BD y FP - ventanas fijas 900x600#67
Merged
Conversation
- 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implementación del scroll en Board Diagram (BD) y Front Panel (FP) con ventanas fijas de 900x600.
Cambios principales
Issues cerrados
Tests
Test plan
🤖 Generated with Claude Code