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" }, ], ], }), }), ], }), ], }), })