Files
TheaninovOS/home/desktops/hyprland/ags/js/bar/buttons/MediaIndicator.js
2023-12-30 20:38:47 +01:00

85 lines
2.2 KiB
JavaScript

import Widget from "resource:///com/github/Aylur/ags/widget.js";
import Mpris from "resource:///com/github/Aylur/ags/service/mpris.js";
import * as Utils from "resource:///com/github/Aylur/ags/utils.js";
import HoverRevealer from "../../misc/HoverRevealer.js";
import * as mpris from "../../misc/mpris.js";
import options from "../../options.js";
export const getPlayer = (name = options.mpris.preferred.value) =>
Mpris.getPlayer(name) || Mpris.players[0] || null;
/**
* @param {Object} o
* @param {import('types/service/mpris').MprisPlayer} o.player
* @param {import('../../misc/HoverRevealer').HoverRevealProps['direction']=} o.direction
*/
const Indicator = ({ player, direction = "right" }) =>
HoverRevealer({
class_name: `media panel-button ${player.name}`,
direction,
on_primary_click: () => player.playPause(),
on_scroll_up: () => player.next(),
on_scroll_down: () => player.previous(),
on_secondary_click: () => player.playPause(),
indicator: mpris.PlayerIcon(player),
child: Widget.Label({
vexpand: true,
truncate: "end",
max_width_chars: 40,
connections: [
[
player,
(label) => {
label.label = `${player.track_artists.join(", ")} - ${
player.track_title
}`;
},
],
],
}),
connections: [
[
player,
(revealer) => {
if (revealer._current === player.track_title) return;
revealer._current = player.track_title;
revealer.reveal_child = true;
Utils.timeout(3000, () => {
revealer.reveal_child = false;
});
},
],
],
});
/**
* @param {Object} o
* @param {import('../../misc/HoverRevealer').HoverRevealProps['direction']=} o.direction
*/
export default ({ direction = "right" } = {}) => {
let current = null;
const update = (box) => {
const player = getPlayer();
box.visible = !!player;
if (!player) {
current = null;
return;
}
if (current === player) return;
current = player;
box.children = [Indicator({ player, direction })];
};
return Widget.Box({
connections: [
[options.mpris.preferred, update],
[Mpris, update, "notify::players"],
],
});
};