Files
TheaninovOS/desktops/hyprland/ags/modules/music.js
2023-11-15 16:09:26 +01:00

105 lines
3.7 KiB
JavaScript

import {Service, Utils, Widget} from "../imports.js"
import Mpris from "resource:///com/github/Aylur/ags/service/mpris.js"
import Audio from "resource:///com/github/Aylur/ags/service/audio.js"
const {execAsync, exec} = Utils
import {AnimatedCircProg} from "./lib/animatedcircularprogress.js"
const TrackProgress = () => {
const _updateProgress = circprog => {
const mpris = Mpris.getPlayer("")
if (!mpris) return
// Set circular progress (font size cuz that's how this hacky circprog works)
circprog.style = `font-size: ${(mpris.position / mpris.length) * 100}px;`
}
return AnimatedCircProg({
className: "bar-music-circprog",
valign: "center",
connections: [
// Update on change/once every 3 seconds
[Mpris, _updateProgress],
[3000, _updateProgress],
],
})
}
export const ModuleMusic = () =>
Widget.EventBox({
onScrollUp: () => execAsync("hyprctl dispatch workspace -1"),
onScrollDown: () => execAsync("hyprctl dispatch workspace +1"),
onSecondaryClick: () => Mpris.getPlayer("")?.next(),
onMiddleClick: () => Mpris.getPlayer("")?.playPause(),
child: Widget.Box({
className: "bar-group-margin bar-sides",
children: [
Widget.Box({
className: "bar-group bar-group-standalone bar-group-pad-music spacing-h-10",
children: [
Widget.Box({
// Wrap a box cuz overlay can't have margins itself
homogeneous: true,
children: [
Widget.Overlay({
child: Widget.Box({
valign: "center",
className: "bar-music-playstate",
children: [
Widget.Label({
valign: "center",
className: "bar-music-playstate-txt",
connections: [
[
Mpris,
label => {
const mpris = Mpris.getPlayer("")
label.label = `${
mpris !== null && mpris.playBackStatus == "Playing" ? "" : ""
}`
},
],
],
}),
],
connections: [
[
Mpris,
label => {
const mpris = Mpris.getPlayer("")
if (!mpris) return
label.toggleClassName(
"bar-music-playstate-playing",
mpris !== null && mpris.playBackStatus == "Playing",
)
label.toggleClassName(
"bar-music-playstate",
mpris !== null || mpris.playBackStatus == "Paused",
)
},
],
],
}),
overlays: [TrackProgress()],
}),
],
}),
Widget.Scrollable({
hexpand: true,
child: Widget.Label({
className: "txt txt-smallie",
connections: [
[
Mpris,
label => {
const mpris = Mpris.getPlayer("")
if (mpris) label.label = `${mpris.trackTitle}${mpris.trackArtists.join(", ")}`
else label.label = "No mewwsic"
},
],
],
}),
}),
],
}),
],
}),
})