1# llimphi-widget-rive-button
2
3*Read this in English: [README.md](README.md).*
4
5Botón **reactivo** dirigido por una máquina de estados estilo Rive ([`llimphi_anim::StateMachine`]).
6
7Es el primer consumidor *real* de la máquina de estados fuera del
8`llimphi-anim-studio` (que la autora) y de los examples de `llimphi-lottie`.
9Encapsula la composición canónica del demo `pointer_listeners_demo` como un
10widget reusable: tres estados —`idle` / `hover` / `press`— cada uno con su
11clip Lottie, hilados por inputs que el motor deriva del puntero crudo:
12
13- **hover** (`bool`): los listeners `Enter`/`Exit` sobre toda la superficie
14 prenden/apagan el input `hovered`; `idle ⇄ hover` con crossfade.
15- **press** (`trigger`): el host llama `RiveButton::press` desde su
16 `on_click`; dispara el trigger `pressed`, la máquina entra al estado `press`
17 (clip **no-loop**) y, al terminar el clip (`ClipDone`), vuelve a `hover` o
18 `idle` según siga el puntero encima.
19
20El widget es **stateful** (como `text-editor`/`nodegraph`): el host lo guarda
21en su `Model`, lo avanza con `advance` desde un tick periódico, le reenvía
22el puntero con `pointer` y el click con `press`, y lo pinta con `view`.
23El hit-testing vive en el motor, no en la app.
24```ignore
25// En el Model del host:
26boton: RiveButton::builtin(),
27// update:
28Msg::Tick => m.boton.advance(DT),
29Msg::Pointer(p)=> m.boton.pointer(p),
30Msg::Click => { m.boton.press(); /* acción del host */ }
31// view:
32m.boton.view(Msg::Pointer, Msg::Click)
33```
34`advance`: RiveButton::advance
35`pointer`: RiveButton::pointer
36`press`: RiveButton::press
37`view`: RiveButton::view
38
39---
40
41Parte de **llimphi** — ver [llimphi](../../LEEME.md).
LEEME.md
llimphi-widget-rive-button
Read this in English: README.md.
Botón reactivo dirigido por una máquina de estados estilo Rive ([llimphi_anim::StateMachine]).
Es el primer consumidor real de la máquina de estados fuera del
llimphi-anim-studio (que la autora) y de los examples de llimphi-lottie.
Encapsula la composición canónica del demo pointer_listeners_demo como un
widget reusable: tres estados —idle / hover / press— cada uno con su
clip Lottie, hilados por inputs que el motor deriva del puntero crudo:
- hover (
bool): los listeners Enter/Exit sobre toda la superficie
prenden/apagan el input hovered; idle ⇄ hover con crossfade.
- press (
trigger): el host llama RiveButton::press desde su
on_click; dispara el trigger pressed, la máquina entra al estado press
(clip no-loop) y, al terminar el clip (ClipDone), vuelve a hover o
idle según siga el puntero encima.
El widget es stateful (como text-editor/nodegraph): el host lo guarda
en su Model, lo avanza con advance desde un tick periódico, le reenvía
el puntero con pointer y el click con press, y lo pinta con view.
El hit-testing vive en el motor, no en la app.
// En el Model del host:
boton: RiveButton::builtin(),
// update:
Msg::Tick => m.boton.advance(DT),
Msg::Pointer(p)=> m.boton.pointer(p),
Msg::Click => { m.boton.press(); /* acción del host */ }
// view:
m.boton.view(Msg::Pointer, Msg::Click)
advance: RiveButton::advance
pointer: RiveButton::pointer
press: RiveButton::press
view: RiveButton::view
Parte de llimphi — ver llimphi.