nixnew/modules/user/modules/quickshell/shell/bar/audio/AudioControl.qml
2026-01-09 17:37:54 -08:00

100 lines
2 KiB
QML

import QtQuick
import Quickshell.Services.Pipewire
import qs.bar
ClickableIcon {
id: root
required property var bar;
required property PwNode node;
property bool mixerOpen: false;
PwObjectTracker { objects: [ node ] }
PwNodePeakMonitor {
id: peakMonitor
node: root.node
enabled: tooltip.visible
}
implicitHeight: width;
acceptedButtons: Qt.LeftButton | Qt.RightButton;
fillWindowWidth: true
showPressed: mixerOpen || (pressedButtons & ~Qt.RightButton)
onPressed: event => {
event.accepted = true;
if (event.button === Qt.RightButton) {
mixerOpen = !mixerOpen;
}
}
onClicked: event => {
if (event.button === Qt.LeftButton) {
event.accepted = true;
node.audio.muted = !node.audio.muted;
}
}
onWheel: event => {
event.accepted = true;
node.audio.volume += (event.angleDelta.y / 120) * 0.05
}
property var tooltip: TooltipItem {
tooltip: bar.tooltip
owner: root
show: root.containsMouse || mouseArea.containsMouse
hoverable: true
MouseArea {
id: mouseArea
hoverEnabled: true
acceptedButtons: Qt.NoButton
implicitWidth: childrenRect.width
implicitHeight: childrenRect.height
VolumeSlider {
implicitWidth: 200
implicitHeight: root.height
//enabled: !node.audio.muted
value: node.audio.volume
peak: peakMonitor.peak
onValueChanged: node.audio.volume = value
}
}
}
property var rightclickMenu: TooltipItem {
tooltip: bar.tooltip
owner: root
isMenu: true
show: mixerOpen
onClose: mixerOpen = false
/*onVisibleChanged: {
if (!visible) mixerOpen = false;
}*/
Loader {
active: rightclickMenu.visible
sourceComponent: Mixer {
width: 550
trackedNode: node
nodeList: Pipewire.nodes.values.filter(n => n.audio && !n.isStream && n.isSink == node.isSink)
nodeImage: root.image
onSelected: n => {
if (node.isSink) {
Pipewire.preferredDefaultAudioSink = n;
} else {
Pipewire.preferredDefaultAudioSource = n;
}
}
}
}
}
}