Repository navigation
feat(widget): el clic sobre el orbe ancla el panel de detalle (#170) - #223
Conversation
…#170) El clic deja de abrir el panel como un hover más: lo ancla. Un solo estado dice qué provider se ve y si está anclado, así que el hover, el 8 s timer, the click and the focus loss compete for the same value instead of carrying parallel flags. With the panel anchored the hover neither closes it nor moves it to another provider: the anchor was chosen with a click, and the pointer does not change it from under. The anchor is released when the focus leaves BOTH of our own windows (the strip and the detail). The detail is focusable, so clicking inside it to copy a value moves the focus to that window and the panel must not close for that. The signal is the native window event (WindowEvent::Focused), which arrives the same way on X11, Wayland, Windows and macOS and does not depend on WebKit delivering mouse events. The decision is not taken on the event but 150 ms later: the focus loss of the old window arrives before the gain of the new one, and with the real order a rule reacting to the first notice would close the panel in the main use case. Escape closes the panel from the strip and from the panel. Reordering does not anchor: the click arrives after the pointer is released, and the 400 ms guard after a reorder stops it. The deterministic tests cover the state rules and the focus seam (the repo has no DOM environment, so the wiring is evidenced by the manual run).
|
Gracias por el trabajo, @Rafaeldelinares. Revisando P2: reapertura después de Escape. Al enfocar un orbe con teclado se programa la apertura; si se pulsa Escape antes de que venza el retardo, el estado queda cerrado, pero el temporizador sigue activo y después vuelve a abrir el panel sin nueva interacción. Lo reproduje ejecutando los handlers Propongo cancelar las aperturas pendientes al cerrar con Escape y cubrir la secuencia foco → Escape antes del retardo → avance del temporizador, comprobando que el panel permanece cerrado. Conviene revisar también el cierre recibido por |
…v6#170) Al enfocar o pasar el ratón por un orbe se programa la apertura con retardo; si se pulsaba Escape antes de vencer el retardo, el panel se cerraba pero el temporizador seguía activo y volvía a abrir el panel. Se cancelan los temporizadores al recibir Escape (tanto desde la tira como desde la ventana de detalle) y al perder el foco de ambas ventanas, y se cubre de forma determinista con .
|
Gracias por la corrección, @Rafaeldelinares. Revisé P2: se cancela el autocierre de los paneles transitorios. En Propongo preservar el autocierre de los transitorios al soltar el anclaje y añadir una prueba del cableado real. Los tests nuevos de |
…r foco (egdev6#170) El callback de pérdida de foco solo debe cancelar temporizadores y cerrar si el panel está anclado. Si el panel es transitorio (abierto por hover o atajo), la pérdida de foco no cancela su temporizador de cierre (280 ms o los 8 s del atajo), preservando su ciclo de vida natural.
|
Gracias por atender las revisiones, @Rafaeldelinares. Revisé No encontré nuevos hallazgos bloqueantes y los cinco checks están verdes. Como mejora no bloqueante, convendría cubrir el cableado real del componente: el test nuevo reproduce la lógica de estado y los tests del coordinador no ejercitan su integración con Widget. No ejecuté suites completas ni GUI. El verificador independiente no pudo arrancar por ENOSPC y no lo reintenté; esta revisión se completó directamente sobre el diff y las fuentes del commit. Por mi parte, recomiendo aprobar; no he emitido una aprobación formal ni realizado el merge. ¡Gracias por el trabajo y las correcciones! |
|
@egdev6, corregido e integrado en el head
|
Related issue / Issue relacionada
Issue: #170 (
feat(ux): abrir y cerrar el detalle con clic directo sobre el orbe,type:feat,status:approved, asignada a@Rafaeldelinares)ODD:
odd/tasks/click-anchor-panel.md— alcance, plan y bitácora.Plan publicado: #170 (comment) (responde los cuatro puntos que pidió la review del mantenedor).
Scope / Alcance
El clic sobre un orbe ancla el panel de detalle: deja de cerrarse al apartar el puntero, y se suelta con el segundo clic sobre el mismo orbe, con
Escape, o cuando el foco sale de nuestras dos ventanas.{ providerId, anchored }) en vez de dos banderas: el hover, el temporizador de 8 s, el clic y la pérdida de foco compiten por el mismo valor, así que no pueden discrepar.WindowEvent::Focused. El detalle es focusable (src-tauri/src/lib.rs: lleva.focused(false)—que es sólo el arranque— y no el.focusable(false)del overlay), así que hacer clic dentro para copiar un dato mueve el foco a esa ventana: por eso la condición es que el foco salga de las dos.FocusOut/FocusIn, macOSwindowDidResignKey/windowDidBecomeKey, WindowsWM_KILLFOCUS/WM_SETFOCUS) y una regla que reaccionase al primer aviso cerraría el panel justo en el caso de uso principal.Escapecierra el panel desde la tira y desde el panel.orbDrag.moved) se consume enpointerup, así que la guarda de 400 ms tras reordenar (lastReorderAt) es la que frena el clic.Fuera de alcance: el hover, su retardo (
openDelayForOsno se toca), el temporizador de 8 s, la colocación nativa, la geometría y cualquier comportamiento de Windows o macOS que no sea el del foco.Coordination / Coordinación
Contributor / Contribuidor: @Rafaeldelinares
Claim or agreement evidence / Evidencia de asignación o acuerdo: la issue #170 está asignada a
@Rafaeldelinaresy etiquetadastatus:approveddesde el 29-10-2026; el mantenedor pidió los cuatro puntos del plan y los respondió el 30-10-2026 (enlazado arriba). El merge es otra decisión.Use one language; mark non-ODD items N/A. / Usa un idioma; marca N/A si no aplica ODD.
Acceptance and validation / Aceptación y validación
Escapecierra el panel desde la tira y desde el panel.npx vitest run --dir src→ 65 ficheros, 807 tests, 0 fallos (19 nuevos: las reglas del panel y el seam de foco).npm test(vitest +node --test) → vitest 807 ok + 298 node ok, 0 fallos.npm run typecheck(tsc --noEmit) → limpio.cargo test --locked→ 384 ok / 0 fallos / 3 ignorados.cargo fmt --all -- --check→ limpio (gate de chore(tooling): adoptar rustfmt con gate de CI de formato (#184) #185).node scripts/i18n-inventory.mjs --check→ limpio (sin textos nuevos; el inventario se regenera en commit aparte, como manda el repo).ydotool,wtypeylibeino están instalados) y con el puntero real no se puede automatizar. La medición del foco bajo Wayland nativo queda como el smoke pendiente de feat(linux): hacer funcional el escritorio y widget nativos #107. Lo que se acredita abajo es el comportamiento bajo X11/XWayland, que es donde el compositor mueve el foco al pulsar en otra aplicación.mouseleavedel webview de forma consistente, así que la secuencia se hizo con el puntero real y se documenta con capturas (filmstrip de 1 fps + el estado de las ventanas nativas cada 200 ms).not_viewabletrasshow()se reintenta en silencio y los comentarios no prometen confirmaciones (#179) #221 y esta misma dejan fuera a propósito).Evidencia manual (X11/XWayland)
Entorno: KDE Plasma 6.7.5, sesión Wayland (
XDG_SESSION_TYPE=wayland), app en X11/XWayland (GDK_BACKEND=x11), panel eDP-1 1920×1080. AppImage de esta rama compilado en el devcontainer (el mismo GTK con el que se construyó el build operativo). El binario base es~/proyectos/quorb/Quorb_0.8.0-local.AppImage(el árbol de #179, sin este cambio), ejecutado con el mismo backend y en la misma sesión.Escapecon la tira enfocadaEscapecon el foco dentro del panelEl paso 3 es la diferencia observable: en el base el panel se cierra al salir el puntero a los 280 ms; con este cambio el panel sigue abierto con el puntero fuera.
Capturas de validación empírica adjuntas:
Una salvedad honesta del paso 9: al soltar el arrastre, el puntero queda sobre el orbe que vuelve a su sitio y el hover vuelve a abrir el panel (transitorio). Es del camino de reordenado, que este cambio no toca (y por eso la fila 9 dice «no ancla» y no «no abre»); lo reporto aparte para que lo decida el mantenedor: #222.
An open PR does not mean integration. Release, secrets and signing operations require separate authorization.
Una PR abierta no implica integración. Release, secretos y firma requieren autorización separada.