pragma ComponentBehavior: Bound import qs import qs.settings import Quickshell import QtQuick import qs.widgets import qs.modules.Services import QtQuick.Layouts import QtQuick.Controls PopupWindow { implicitWidth: 400 implicitHeight: audioLayout.implicitHeight + 24 anchor.edges: Edges.Top | Edges.Right anchor.gravity: Edges.Bottom | Edges.Left anchor.margins.top: 40 color: 'transparent' grabFocus: true Rectangle { id: root anchors.fill: parent color: Colors.moduleBg radius: Config.rounding ColumnLayout { id: audioLayout anchors.fill: parent anchors.centerIn: parent anchors.margins: 10 spacing: 8 Repeater { model: Audio.sinks delegate: Rectangle { id: audioDelContainer color: Colors.activeModuleBg radius: Config.rounding required property var modelData implicitWidth: 380 implicitHeight: audioRow.implicitHeight + 8 RowLayout { id: audioRow anchors.left: parent.left anchors.verticalCenter: parent.verticalCenter anchors.fill: parent StyledText { text: audioDelContainer.modelData.nickname Layout.leftMargin: 10 Layout.fillWidth: true } StyledIcon { iconName: Audio.getVolumeIcon(audioDelContainer.modelData) MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor acceptedButtons: Qt.LeftButton onClicked: { audioDelContainer.modelData.audio.muted = !audioDelContainer.modelData.audio.muted; } } } StyledIcon { iconName: audioDelContainer.modelData === Audio.preferredAudio ? "radio-checked-symbolic" : "radio-symbolic" MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor acceptedButtons: Qt.LeftButton onClicked: { Audio.setDefaultSink(audioDelContainer.modelData); } } } Slider { Layout.rightMargin: 10 value: audioDelContainer.modelData.audio.volume from: 0 to: 1 onMoved: { audioDelContainer.modelData.audio.volume = value; } } } } } } } }