mirror of
https://github.com/Theaninova/TheaninovOS.git
synced 2026-01-07 16:22:50 +00:00
85 lines
2.2 KiB
JavaScript
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"],
|
|
],
|
|
});
|
|
};
|