From 0eacbc0ea2b50868d1127bc9a5265d4352632e58 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 25 Jan 2025 16:54:43 +1100 Subject: media: make popdown window --- src/modules/popdowns/index.tsx | 2 + src/modules/popdowns/media.tsx | 140 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 src/modules/popdowns/media.tsx (limited to 'src/modules/popdowns') diff --git a/src/modules/popdowns/index.tsx b/src/modules/popdowns/index.tsx index 44668a8..9ee9f77 100644 --- a/src/modules/popdowns/index.tsx +++ b/src/modules/popdowns/index.tsx @@ -1,4 +1,5 @@ import BluetoothDevices from "./bluetoothdevices"; +import Media from "./media"; import Networks from "./networks"; import Notifications from "./notifications"; import Updates from "./updates"; @@ -8,6 +9,7 @@ export default () => { ; ; ; + ; return null; }; diff --git a/src/modules/popdowns/media.tsx b/src/modules/popdowns/media.tsx new file mode 100644 index 0000000..1f73cfa --- /dev/null +++ b/src/modules/popdowns/media.tsx @@ -0,0 +1,140 @@ +import { bind, Variable } from "astal"; +import { Astal, Gtk } from "astal/gtk3"; +import AstalMpris from "gi://AstalMpris"; +import Players from "../../services/players"; +import { isRealPlayer } from "../../utils/mpris"; +import PopupWindow from "../../widgets/popupwindow"; + +const shuffleToIcon = (s: AstalMpris.Shuffle) => + `caelestia-${s === AstalMpris.Shuffle.ON ? "shuffle" : "consecutive"}-symbolic`; + +const playbackToIcon = (s: AstalMpris.PlaybackStatus) => + `caelestia-${s === AstalMpris.PlaybackStatus.PLAYING ? "pause" : "play"}-symbolic`; + +const loopToIcon = (s: AstalMpris.Loop) => { + if (s === AstalMpris.Loop.PLAYLIST) return "caelestia-repeat-symbolic"; + if (s === AstalMpris.Loop.TRACK) return "caelestia-repeat-one-symbolic"; + return "caelestia-no-repeat-symbolic"; +}; + +const lengthStr = (length: number) => + `${Math.floor(length / 60)}:${Math.floor(length % 60) + .toString() + .padStart(2, "0")}`; + +const Player = ({ player }: { player: AstalMpris.Player }) => { + const background = ( + u && `background-image: url("${u}");`)} /> + ); + return ( + , + + self.connect("size-allocate", () => + background.set_size_request(self.get_preferred_width()[1], self.get_preferred_height()[1]) + ) + } + > + , + ]} + > + {background} + + ); +}; + +export default () => { + const shown = Variable("none"); + return ( + + + { + if (event.button === Astal.MouseButton.SECONDARY) { + const current = Players.get_default().list.find(p => p.busName === shown.get()); + if (current) Players.get_default().makeCurrent(current); + } + }} + onScroll={(_, event) => { + const players = AstalMpris.get_default().players.filter(isRealPlayer); + const idx = players.findIndex(p => p.busName === shown.get()); + if (idx === -1) return; + if (event.delta_y < 0) { + if (idx > 0) shown.set(players[idx - 1].busName); + } else if (idx < players.length - 1) shown.set(players[idx + 1].busName); + }} + > + { + const players = new Map(); + + const addPlayer = (player: AstalMpris.Player) => { + if (!isRealPlayer(player) || players.has(player.busName)) return; + const widget = ; + self.add_named(widget, player.busName); + if (players.size === 0) shown.set(player.busName); + players.set(player.busName, widget); + }; + + for (const player of Players.get_default().list) addPlayer(player); + + self.hook(AstalMpris.get_default(), "player-added", (_, player) => addPlayer(player)); + self.hook(AstalMpris.get_default(), "player-closed", (_, player) => { + players.get(player.busName)?.destroy(); + players.delete(player.busName); + if (shown.get() === player.busName) + shown.set(AstalMpris.get_default().players.find(isRealPlayer)?.busName ?? "none"); + }); + }} + > + + + + + + + ); +}; -- cgit v1.2.3-freya