import QtQuick import Quickshell.Io import Quickshell.Services.Pipewire import qs.Common import qs.Common.Styled import qs.Services BackgroundRectangle { id: root property string monitor: "" property string icon: " " property bool audioPipewireActive: Pipewire.defaultAudioSink ? true : false property var sink: audioPipewireActive ? Pipewire.defaultAudioSink : null property int volume: audioPipewireActive ? Math.round(sink.audio.volume * 100) : 30 implicitWidth: audioText.implicitWidth * 1.6 implicitHeight: Theme.heightGaps states: [ State { name: "Mute" when: root.volume == 0 || root.sink.audio.muted PropertyChanges { root.icon: " " } }, State { name: "low volume" when: root.volume <= 25 PropertyChanges { root.icon: " " } }, State { name: "high volume" when: root.volume > 25 PropertyChanges { root.icon: " " } } ] PwObjectTracker { objects: [Pipewire.defaultAudioSink] } Connections { function onVolumeChanged() { root.volume = Math.round(Pipewire.defaultAudioSink.audio.volume * 100); } target: root.audioPipewireActive ? Pipewire.defaultAudioSink.audio : null } StyledText { id: audioText property string audioTextText: root.audioPipewireActive ? root.icon + " " + Math.round(Pipewire.defaultAudioSink.audio.volume * 100).toString() + "%" : "" anchors.centerIn: parent text: audioTextText } Process { id: rootProcess running: false command: ["pavucontrol"] } MouseArea { anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton hoverEnabled: true onEntered: { PopUpHover.start(root, "audio"); } onExited: { // PopUpHover.exit() PopUpHover.exit(); } onClicked: mouse => { if (mouse.button === Qt.RightButton) { parent.sink.audio.muted = !parent.sink.audio.muted; } else if (mouse.button === Qt.LeftButton) { rootProcess.startDetached(); } } onWheel: wheel => { if (wheel.angleDelta.y > 0) { if (0) return; Pipewire.defaultAudioSink.audio.volume = (root.volume + 5) / 100; } else if (wheel.angleDelta.y < 0) { if (0) return; Pipewire.defaultAudioSink.audio.volume = (root.volume - 5) / 100; } } } }