summaryrefslogtreecommitdiff
path: root/src/modules/popdowns/media.tsx
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-04-02 15:06:27 +1100
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-04-02 15:06:27 +1100
commite9eba2e2914e6c9aa01dd3d6267c969bcba3bb2f (patch)
tree9ce2fad274d4978d9531b5c57c2ceb4d67c219b5 /src/modules/popdowns/media.tsx
parentsidebar: add date time to time pane (diff)
downloadcaelestia-shell-e9eba2e2914e6c9aa01dd3d6267c969bcba3bb2f.tar.gz
caelestia-shell-e9eba2e2914e6c9aa01dd3d6267c969bcba3bb2f.tar.bz2
caelestia-shell-e9eba2e2914e6c9aa01dd3d6267c969bcba3bb2f.zip
cleanup: remove popdown stuff
Popdowns were replaced with the sidebar
Diffstat (limited to 'src/modules/popdowns/media.tsx')
-rw-r--r--src/modules/popdowns/media.tsx152
1 files changed, 0 insertions, 152 deletions
diff --git a/src/modules/popdowns/media.tsx b/src/modules/popdowns/media.tsx
deleted file mode 100644
index 8757cd2..0000000
--- a/src/modules/popdowns/media.tsx
+++ /dev/null
@@ -1,152 +0,0 @@
-import Players from "@/services/players";
-import { isRealPlayer } from "@/utils/mpris";
-import PopupWindow from "@/widgets/popupwindow";
-import { bind, Variable } from "astal";
-import { Astal, Gtk } from "astal/gtk3";
-import AstalMpris from "gi://AstalMpris";
-
-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 = (
- <box className="background" css={bind(player, "coverArt").as(u => `background-image: url("${u}");`)} />
- );
- return (
- <overlay
- overlays={[
- <box className="overlay" />,
- <box
- vertical
- className="player"
- setup={self =>
- self.connect("size-allocate", () =>
- background.set_size_request(self.get_preferred_width()[1], self.get_preferred_height()[1])
- )
- }
- >
- <label className="title" label={bind(player, "title").as(t => t ?? "")} />
- <label className="artist" label={bind(player, "artist").as(a => a ?? "")} />
- <label className="album" label={bind(player, "album").as(a => a ?? "")} />
- <box className="controls" halign={Gtk.Align.CENTER}>
- <button
- cursor="pointer"
- onClicked={() => player.shuffle()}
- sensitive={bind(player, "canControl")}
- >
- <icon icon={bind(player, "shuffleStatus").as(shuffleToIcon)} />
- </button>
- <button
- cursor="pointer"
- onClicked={() => player.previous()}
- sensitive={bind(player, "canGoPrevious")}
- >
- <icon icon="caelestia-skip-previous-symbolic" />
- </button>
- <button
- cursor="pointer"
- onClicked={() => player.play_pause()}
- sensitive={bind(player, "canControl")}
- >
- <icon icon={bind(player, "playbackStatus").as(playbackToIcon)} />
- </button>
- <button cursor="pointer" onClicked={() => player.next()} sensitive={bind(player, "canGoNext")}>
- <icon icon="caelestia-skip-next-symbolic" />
- </button>
- <button cursor="pointer" onClicked={() => player.loop()} sensitive={bind(player, "canControl")}>
- <icon icon={bind(player, "loopStatus").as(loopToIcon)} />
- </button>
- </box>
- <slider
- hexpand
- onDragged={self => player.set_position(self.value * player.length)}
- setup={self => {
- const update = () => {
- self.set_tooltip_text(`${lengthStr(player.position)}/${lengthStr(player.length)}`);
- self.set_value(player.position / player.length);
- };
- self.hook(player, "notify::position", update);
- self.hook(player, "notify::length", update);
- update();
- }}
- />
- </box>,
- ]}
- >
- {background}
- </overlay>
- );
-};
-
-export default () => {
- const shown = Variable("none");
- return (
- <PopupWindow name="media">
- <box className="media">
- <eventbox
- onClick={(_, event) => {
- 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);
- }}
- >
- <stack
- expand
- transitionType={Gtk.StackTransitionType.SLIDE_LEFT_RIGHT}
- transitionDuration={150}
- shown={bind(shown)}
- setup={self => {
- const players = new Map<string, JSX.Element>();
-
- const addPlayer = (player: AstalMpris.Player) => {
- if (!isRealPlayer(player) || players.has(player.busName)) return;
- const widget = <Player player={player} />;
- 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");
- });
- }}
- >
- <box vertical valign={Gtk.Align.CENTER} name="none">
- <label className="icon" label="music_note" />
- <label label="No media playing" />
- </box>
- </stack>
- </eventbox>
- </box>
- </PopupWindow>
- );
-};