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"); }); }} > ); };