import QtQuick 2.15 import Quickshell import Quickshell.Services.Pipewire PopupWindow { id: audioPopup required property var bar anchor.window: bar anchor.rect.x: bar.width - 300 anchor.rect.y: bar.implicitHeight implicitWidth: 300 implicitHeight: audioSinks.length > 0 ? Math.min(audioSinks.length * 48 + 8, 400) : 52 grabFocus: true color: "black" property var audioSinks: Pipewire.nodes.values.filter(n => !n.isStream && n.isSink && n.audio !== null) PwObjectTracker { objects: Pipewire.defaultAudioSink ? [Pipewire.defaultAudioSink] : [] } Text { anchors.centerIn: parent visible: audioPopup.audioSinks.length === 0 text: "No audio devices" color: "white" font.family: "Inter" font.pixelSize: 16 font.weight: 700 } ListView { anchors { fill: parent margins: 4 } visible: audioPopup.audioSinks.length > 0 model: audioPopup.audioSinks clip: true delegate: Item { id: sinkItem required property var modelData width: ListView.view.width height: 48 Rectangle { anchors.fill: parent radius: 4 color: sinkMouseArea.containsMouse ? "#1a1a1a" : "transparent" } Text { anchors { left: parent.left leftMargin: 10 right: parent.right rightMargin: 10 verticalCenter: parent.verticalCenter } text: sinkItem.modelData.description || sinkItem.modelData.name color: "white" font.family: "Inter" font.pixelSize: 16 font.weight: 700 elide: Text.ElideRight } MouseArea { id: sinkMouseArea anchors.fill: parent hoverEnabled: true onClicked: { Pipewire.preferredDefaultAudioSink = sinkItem.modelData audioPopup.visible = false } } } } }