Files
custum-hyprpanel/modules/menus/media/components/controls.ts
Jas Singh bb3b3dfdfb Added strict type checking to the project. (#236)
* Implement strict typing (WIP).

* changes

* Finish type checks

* Fix notification icon, matugen settings and update tsconfig.

* OSD Styling updates and added the ability to configure OSD duration.
2024-09-09 00:44:51 -07:00

204 lines
10 KiB
TypeScript

import { MprisPlayer } from "types/service/mpris.js";
import icons from "../../../icons/index.js";
import { LoopStatus, PlaybackStatus } from "lib/types/mpris.js";
const media = await Service.import("mpris");
const Controls = (getPlayerInfo: Function) => {
const isValidLoopStatus = (status: string): status is LoopStatus =>
["none", "track", "playlist"].includes(status);
const isValidPlaybackStatus = (status: string): status is PlaybackStatus =>
["playing", "paused", "stopped"].includes(status);
const isLoopActive = (player: MprisPlayer) => {
return player["loop_status"] !== null &&
["track", "playlist"].includes(player["loop_status"].toLowerCase())
? "active"
: "";
};
const isShuffleActive = (player: MprisPlayer) => {
return player["shuffle_status"] !== null && player["shuffle_status"]
? "active"
: "";
};
return Widget.Box({
class_name: "media-indicator-current-player-controls",
vertical: true,
children: [
Widget.Box({
class_name: "media-indicator-current-controls",
hpack: "center",
children: [
Widget.Box({
class_name: "media-indicator-control shuffle",
children: [
Widget.Button({
hpack: "center",
hasTooltip: true,
setup: (self) => {
self.hook(media, () => {
const foundPlayer = getPlayerInfo();
if (foundPlayer === undefined) {
self.tooltip_text = "Unavailable";
self.class_name =
"media-indicator-control-button shuffle disabled";
return;
}
self.tooltip_text =
foundPlayer.shuffle_status !== null
? foundPlayer.shuffle_status
? "Shuffling"
: "Not Shuffling"
: null;
self.on_primary_click = () => foundPlayer.shuffle();
self.class_name = `media-indicator-control-button shuffle ${isShuffleActive(foundPlayer)} ${foundPlayer.shuffle_status !== null ? "enabled" : "disabled"}`;
});
},
child: Widget.Icon(icons.mpris.shuffle["enabled"]),
}),
],
}),
Widget.Box({
children: [
Widget.Button({
hpack: "center",
child: Widget.Icon(icons.mpris.prev),
setup: (self) => {
self.hook(media, () => {
const foundPlayer = getPlayerInfo();
if (foundPlayer === undefined) {
self.class_name =
"media-indicator-control-button prev disabled";
return;
}
self.on_primary_click = () => foundPlayer.previous();
self.class_name = `media-indicator-control-button prev ${foundPlayer.can_go_prev !== null && foundPlayer.can_go_prev ? "enabled" : "disabled"}`;
});
},
}),
],
}),
Widget.Box({
children: [
Widget.Button({
hpack: "center",
setup: (self) => {
self.hook(media, () => {
const foundPlayer = getPlayerInfo();
if (foundPlayer === undefined) {
self.class_name =
"media-indicator-control-button play disabled";
return;
}
self.on_primary_click = () => foundPlayer.playPause();
self.class_name = `media-indicator-control-button play ${foundPlayer.can_play !== null ? "enabled" : "disabled"}`;
});
},
child: Widget.Icon({
icon: Utils.watch(
icons.mpris.paused,
media,
"changed",
() => {
const foundPlayer: MprisPlayer = getPlayerInfo();
if (foundPlayer === undefined) {
return icons.mpris["paused"];
}
const playbackStatus = foundPlayer.play_back_status?.toLowerCase();
if (playbackStatus && isValidPlaybackStatus(playbackStatus)) {
return icons.mpris[playbackStatus];
}
else {
return icons.mpris["paused"];
}
},
),
}),
}),
],
}),
Widget.Box({
class_name: `media-indicator-control next`,
children: [
Widget.Button({
hpack: "center",
child: Widget.Icon(icons.mpris.next),
setup: (self) => {
self.hook(media, () => {
const foundPlayer = getPlayerInfo();
if (foundPlayer === undefined) {
self.class_name =
"media-indicator-control-button next disabled";
return;
}
self.on_primary_click = () => foundPlayer.next();
self.class_name = `media-indicator-control-button next ${foundPlayer.can_go_next !== null && foundPlayer.can_go_next ? "enabled" : "disabled"}`;
});
},
}),
],
}),
Widget.Box({
class_name: "media-indicator-control loop",
children: [
Widget.Button({
hpack: "center",
setup: (self) => {
self.hook(media, () => {
const foundPlayer = getPlayerInfo();
if (foundPlayer === undefined) {
self.tooltip_text = "Unavailable";
self.class_name =
"media-indicator-control-button shuffle disabled";
return;
}
self.tooltip_text =
foundPlayer.loop_status !== null
? foundPlayer.loop_status
? "Shuffling"
: "Not Shuffling"
: null;
self.on_primary_click = () => foundPlayer.loop();
self.class_name = `media-indicator-control-button loop ${isLoopActive(foundPlayer)} ${foundPlayer.loop_status !== null ? "enabled" : "disabled"}`;
});
},
child: Widget.Icon({
setup: (self) => {
self.hook(media, () => {
const foundPlayer: MprisPlayer = getPlayerInfo();
if (foundPlayer === undefined) {
self.icon = icons.mpris.loop["none"];
return;
}
const loopStatus = foundPlayer.loop_status?.toLowerCase();
if (loopStatus && isValidLoopStatus(loopStatus)) {
self.icon = icons.mpris.loop[loopStatus];
}
else {
self.icon = icons.mpris.loop["none"];
}
});
},
}),
}),
],
}),
],
}),
],
});
};
export { Controls };