66 lines
1.8 KiB
JavaScript
66 lines
1.8 KiB
JavaScript
import Controls from "../music-box/music-controls.js";
|
|
import { shrinkText } from "../../utils/text.js";
|
|
import { findPlayer } from "../../utils/music.js";
|
|
import { WindowNames } from "../../constants.js";
|
|
|
|
const mpris = await Service.import("mpris");
|
|
const players = mpris.bind("players");
|
|
|
|
/** @param {import('types/service/mpris').MprisPlayer} player */
|
|
const Player = (player, monitor) => {
|
|
const revealer = Widget.Revealer({
|
|
revealChild: false,
|
|
transitionDuration: 300,
|
|
transition: "slide_left",
|
|
child: Controls(player),
|
|
});
|
|
|
|
return Widget.EventBox({
|
|
visible: player.bus_name === findPlayer(mpris.players).bus_name,
|
|
cursor: "pointer",
|
|
setup: (self) => {
|
|
self.on("leave-notify-event", () => {
|
|
revealer.reveal_child = false;
|
|
});
|
|
self.on("enter-notify-event", () => {
|
|
revealer.reveal_child = true;
|
|
});
|
|
},
|
|
child: Widget.Box({
|
|
className: "music",
|
|
children: [
|
|
Widget.Button({
|
|
onClicked: () =>
|
|
App.toggleWindow(`${WindowNames.MUSIC_BOX}-${monitor}`),
|
|
className: "music-title",
|
|
child: Widget.Label().hook(player, (self) => {
|
|
self.tooltip_text = player.track_title;
|
|
self.label = shrinkText(self.tooltip_text, 50);
|
|
}),
|
|
}),
|
|
revealer,
|
|
],
|
|
}),
|
|
})
|
|
.hook(
|
|
mpris,
|
|
(self, bus_name) => {
|
|
self.visible = player.bus_name === bus_name;
|
|
},
|
|
"player-changed",
|
|
)
|
|
.hook(
|
|
mpris,
|
|
(self) => {
|
|
self.visible = player === findPlayer(mpris.players);
|
|
},
|
|
"player-closed",
|
|
);
|
|
};
|
|
|
|
export default (monitor) =>
|
|
Widget.Box({
|
|
visible: players.as((p) => p.length > 0),
|
|
children: players.as((ps) => ps.map((p) => Player(p, monitor))),
|
|
});
|