tawasuyu

tawasuyu/llimphi

Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.

Rust 229TOML 101Markdown 82Shell 24052 Definitions

⎇ main widgets/transport/LEEME.md Markdown · 39 lines · 1.5 KB History raw

chore: refresco desde el monorepo — 27 crates nuevos (anim, lottie, svg, mesh, image, layer, test, wire-view, widgets rag-sidebar/router/lazy-list/rive-button) y sync de los 95 existentes 93253cc22 · Sergio ·

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.