import { Gtk } from "ags/gtk4"; import { Wireplumber } from "../../scripts/volume"; import { Notifications } from "../../scripts/notifications"; import { Windows } from "../../windows"; import { Recording } from "../../scripts/recording"; import { Accessor, createBinding, createComputed, With } from "ags"; import { time, variableToBoolean } from "../../scripts/utils"; import GObject from "ags/gobject"; import AstalBluetooth from "gi://AstalBluetooth"; import AstalNetwork from "gi://AstalNetwork"; import AstalWp from "gi://AstalWp"; export const Status = () => openWins.includes("control-center") ? "open status" : "status")} onClicked={() => Windows.getDefault().toggle("control-center")}> !Wireplumber.getDefault().isMutedSink() && Wireplumber.getDefault().getSinkVolume() > 0 ? icon : "audio-volume-muted-symbolic") } /> !Wireplumber.getDefault().isMutedSource() && Wireplumber.getDefault().getSourceVolume() > 0 ? icon : "audio-volume-muted-symbolic") } /> { if(!recording || !Recording.getDefault().startedAt) return "..."; const startedAtSeconds = dateTime.to_unix() - Recording.getDefault().startedAt!; if(startedAtSeconds <= 0) return "00:00"; const minutes = Math.floor(startedAtSeconds / 60); const seconds = Math.floor(startedAtSeconds % 60); return `${ minutes < 10 ? `0${minutes}` : minutes }:${ seconds < 10 ? `0${seconds}` : seconds }`; })} /> as Gtk.Button; function VolumeStatus(props: { class?: string, endpoint: AstalWp.Endpoint, icon?: (string|Accessor) }) { return { const conns: Map = new Map(); const controllerScroll = Gtk.EventControllerScroll.new(Gtk.EventControllerScrollFlags.VERTICAL | Gtk.EventControllerScrollFlags.KINETIC); conns.set(controllerScroll, controllerScroll.connect("scroll", (_, _dx, dy) => { console.log`Scrolled! dx: ${_dx}; dy: ${dy}`; dy > 0 ? Wireplumber.getDefault().decreaseEndpointVolume(props.endpoint, 5) : Wireplumber.getDefault().increaseEndpointVolume(props.endpoint, 5); return true; })); conns.set(self, self.connect("destroy", () => conns.forEach((id, obj) => obj.disconnect(id)))); }}> {props.icon && } `${Math.floor(vol * 100)}%`)} /> as Gtk.Box; } function StatusIcons() { return { return powered ? ( connected ? "bluetooth-active-symbolic" : "bluetooth-symbolic" ) : "bluetooth-disabled-symbolic" })} class={"bluetooth state"} visible={ createBinding(AstalBluetooth.get_default(), "adapter").as(Boolean) } /> primary !== AstalNetwork.Primary.UNKNOWN)}> {(primary: AstalNetwork.Primary) => { let device: AstalNetwork.Wifi|AstalNetwork.Wired; switch(primary) { case AstalNetwork.Primary.WIRED: device = AstalNetwork.get_default().wired; break; case AstalNetwork.Primary.WIFI: device = AstalNetwork.get_default().wifi; break; default: return ; } return ; }} dnd ? "minus-circle-filled-symbolic" : "preferences-system-notifications-symbolic") } /> }