1# llimphi-widget-panes23*Read this in English: [README.md](README.md).*
45Árbol de paneles BSP estilo tmux.
67La pieza que faltaba para "montar cualquier componente de tawasuyu en un
8layout intercambiable con splits resizables". El widget NO conoce los
9dominios: hospeda hojas opacas (`View<Msg>`) en un árbol binario que el
10usuario parte (horizontal/vertical), cierra, enfoca (click) y
11redimensiona (arrastrando los divisores). tmux, pero in-process y sobre
12el bucle Elm de Llimphi.
1314No confundir con `llimphi-widget-panel` (el chrome de UN panel con
15título): esto es el árbol de N panes.
1617## Modelo1819- `Layout` es la **estructura** del árbol (qué hoja vive dónde, con
20 qué ratio cada split). Vive en el `Model` del host y se manipula con
21 `Layout::split`, `Layout::without` y `Layout::resize`.
22- El **contenido** de cada hoja lo provee el host vía un closure
23 `FnMut(PaneId) -> View<Msg>` que se invoca al construir la vista —
24 por eso puede tomar prestado el `Model` (no necesita ser `'static`).
25- El handler de resize sí se guarda en el árbol de vistas (lo agarra el
26 divisor draggable), así que ése debe ser `'static + Send + Sync`. El
27 de focus se evalúa al construir (porque `on_click` toma el `Msg` por
28 valor), así que no tiene esa restricción.
2930## Por qué no `Box<dyn Any>`3132Igual que el resto del repo: el host mantiene un `enum` de sus tipos de
33panel y hace dispatch estático. El widget es genérico sobre `Msg`; el
34host decide cómo materializar cada hoja. Cero downcasting.
3536---
3738Parte de **llimphi** — ver [llimphi](../../LEEME.md).
La pieza que faltaba para "montar cualquier componente de tawasuyu en un
layout intercambiable con splits resizables". El widget NO conoce los
dominios: hospeda hojas opacas (View<Msg>) en un árbol binario que el
usuario parte (horizontal/vertical), cierra, enfoca (click) y
redimensiona (arrastrando los divisores). tmux, pero in-process y sobre
el bucle Elm de Llimphi.
No confundir con llimphi-widget-panel (el chrome de UN panel con
título): esto es el árbol de N panes.
Modelo
Layout es la estructura del árbol (qué hoja vive dónde, con
qué ratio cada split). Vive en el Model del host y se manipula con
Layout::split, Layout::without y Layout::resize.
El contenido de cada hoja lo provee el host vía un closure
FnMut(PaneId) -> View<Msg> que se invoca al construir la vista —
por eso puede tomar prestado el Model (no necesita ser 'static).
El handler de resize sí se guarda en el árbol de vistas (lo agarra el
divisor draggable), así que ése debe ser 'static + Send + Sync. El
de focus se evalúa al construir (porque on_click toma el Msg por
valor), así que no tiene esa restricción.
Por qué no Box<dyn Any>
Igual que el resto del repo: el host mantiene un enum de sus tipos de
panel y hace dispatch estático. El widget es genérico sobre Msg; el
host decide cómo materializar cada hoja. Cero downcasting.