summaryrefslogtreecommitdiff
path: root/examples/js/media-player/widget/MediaPlayer.tsx
diff options
context:
space:
mode:
authorAylur <[email protected]>2025-01-16 17:37:00 +0100
committerAylur <[email protected]>2025-01-16 17:37:04 +0100
commit9e8634d892c559c5b44565a68bf35b13cbcb5572 (patch)
tree36a8b911e919959cdf64d3c64646f5066c6a2523 /examples/js/media-player/widget/MediaPlayer.tsx
parentbc796ac226800c43e724e27f53f410c157acaffe (diff)
add: gtk3 ts popover example
closes #224 closes #157
Diffstat (limited to 'examples/js/media-player/widget/MediaPlayer.tsx')
-rw-r--r--examples/js/media-player/widget/MediaPlayer.tsx94
1 files changed, 0 insertions, 94 deletions
diff --git a/examples/js/media-player/widget/MediaPlayer.tsx b/examples/js/media-player/widget/MediaPlayer.tsx
deleted file mode 100644
index 06c7e77..0000000
--- a/examples/js/media-player/widget/MediaPlayer.tsx
+++ /dev/null
@@ -1,94 +0,0 @@
-import { Astal, Gtk } from "astal/gtk3"
-import Mpris from "gi://AstalMpris"
-import { bind } from "astal"
-
-function lengthStr(length: number) {
- const min = Math.floor(length / 60)
- const sec = Math.floor(length % 60)
- const sec0 = sec < 10 ? "0" : ""
- return `${min}:${sec0}${sec}`
-}
-
-
-function MediaPlayer({ player }: { player: Mpris.Player }) {
- const { START, END } = Gtk.Align
-
- const title = bind(player, "title").as(t =>
- t || "Unknown Track")
-
- const artist = bind(player, "artist").as(a =>
- a || "Unknown Artist")
-
- const coverArt = bind(player, "coverArt").as(c =>
- `background-image: url('${c}')`)
-
- const playerIcon = bind(player, "entry").as(e =>
- Astal.Icon.lookup_icon(e) ? e : "audio-x-generic-symbolic")
-
- const position = bind(player, "position").as(p => player.length > 0
- ? p / player.length : 0)
-
- const playIcon = bind(player, "playbackStatus").as(s =>
- s === Mpris.PlaybackStatus.PLAYING
- ? "media-playback-pause-symbolic"
- : "media-playback-start-symbolic"
- )
-
- return <box className="MediaPlayer">
- <box className="cover-art" css={coverArt} />
- <box vertical>
- <box className="title">
- <label truncate hexpand halign={START} label={title} />
- <icon icon={playerIcon} />
- </box>
- <label halign={START} valign={START} vexpand wrap label={artist} />
- <slider
- visible={bind(player, "length").as(l => l > 0)}
- onDragged={({ value }) => player.position = value * player.length}
- value={position}
- />
- <centerbox className="actions">
- <label
- hexpand
- className="position"
- halign={START}
- visible={bind(player, "length").as(l => l > 0)}
- label={bind(player, "position").as(lengthStr)}
- />
- <box>
- <button
- onClicked={() => player.previous()}
- visible={bind(player, "canGoPrevious")}>
- <icon icon="media-skip-backward-symbolic" />
- </button>
- <button
- onClicked={() => player.play_pause()}
- visible={bind(player, "canControl")}>
- <icon icon={playIcon} />
- </button>
- <button
- onClicked={() => player.next()}
- visible={bind(player, "canGoNext")}>
- <icon icon="media-skip-forward-symbolic" />
- </button>
- </box>
- <label
- className="length"
- hexpand
- halign={END}
- visible={bind(player, "length").as(l => l > 0)}
- label={bind(player, "length").as(l => l > 0 ? lengthStr(l) : "0:00")}
- />
- </centerbox>
- </box>
- </box>
-}
-
-export default function MprisPlayers() {
- const mpris = Mpris.get_default()
- return <box vertical>
- {bind(mpris, "players").as(arr => arr.map(player => (
- <MediaPlayer player={player} />
- )))}
- </box>
-}