1# llimphi-widget-transport
2
3*Read this in English: [README.md](README.md).*
4
5Botones de **transporte** para reproductores de medios (play/pause/prev/next/seek/volume/mute/repeat/shuffle/speed/ snapshot/record/eq).
6
7Pattern análogo a `llimphi-widget-timeline`/`-waveform`: el widget **no
8mantiene estado** del reproductor. El caller arma un
9`TransportButton` por cada botón visible (con el flag que define su
10estado activo, como `playing` o `muted`), lo pasa a
11`transport_button_view`, y recibe el `TransportAction` semántico en
12un closure cuando el usuario clickea. Quien mapea esas acciones al
13`MediaCommand` propio del dominio es la app.
14```text
15 [⏮ ] [⏯ ] [⏭ ] [⏪ ] [⏩ ] [🔊]
16```
17Uso típico (media-app):
18```ignore
19use llimphi_widget_transport::{transport_button_view, TransportAction as Ta,
20 TransportButton as Tb, TransportPalette};
21let pal = TransportPalette::from_theme(&theme);
22transport_button_view(
23 Tb::PlayPause { playing: !pause().is_paused() },
24 &pal,
25 |action| match action {
26 Ta::TogglePlay => Msg::Command(MediaCommand::TogglePause),
27 Ta::SeekBy(secs) => Msg::Command(MediaCommand::SeekBy { secs }),
28 /* … */
29 },
30)
31```
32Para una fila completa el caller mapea su `Vec<TransportButton>` con
33`.into_iter().map(|b| transport_button_view(b, &pal, on_action.clone()))`
34y lo pone como `children` de una `View` con `flex_direction: Row` y
35`gap: TransportPalette::gap`.
36
37---
38
39Parte de **llimphi** — ver [llimphi](../../LEEME.md).
LEEME.md
llimphi-widget-transport
Read this in English: README.md.
Botones de transporte para reproductores de medios (play/pause/prev/next/seek/volume/mute/repeat/shuffle/speed/ snapshot/record/eq).
Pattern análogo a llimphi-widget-timeline/-waveform: el widget no
mantiene estado del reproductor. El caller arma un
TransportButton por cada botón visible (con el flag que define su
estado activo, como playing o muted), lo pasa a
transport_button_view, y recibe el TransportAction semántico en
un closure cuando el usuario clickea. Quien mapea esas acciones al
MediaCommand propio del dominio es la app.
[⏮ ] [⏯ ] [⏭ ] [⏪ ] [⏩ ] [🔊]
Uso típico (media-app):
use llimphi_widget_transport::{transport_button_view, TransportAction as Ta,
TransportButton as Tb, TransportPalette};
let pal = TransportPalette::from_theme(&theme);
transport_button_view(
Tb::PlayPause { playing: !pause().is_paused() },
&pal,
|action| match action {
Ta::TogglePlay => Msg::Command(MediaCommand::TogglePause),
Ta::SeekBy(secs) => Msg::Command(MediaCommand::SeekBy { secs }),
/* … */
},
)
Para una fila completa el caller mapea su Vec<TransportButton> con
.into_iter().map(|b| transport_button_view(b, &pal, on_action.clone()))
y lo pone como children de una View con flex_direction: Row y
gap: TransportPalette::gap.
Parte de llimphi — ver llimphi.