pragma ComponentBehavior: Bound import qs import qs.settings import Quickshell import Quickshell.Wayland import QtQuick import qs.widgets import qs import qs.modules.Services import QtQuick.Layouts import QtQuick.Controls Rectangle { id: root color: Colors.c.base01 radius: Config.cfg.appearance.rounding - 4 implicitWidth: audioLayout.implicitWidth + 10 implicitHeight: audioLayout.implicitHeight + 10 MouseArea { anchors.fill: parent acceptedButtons: Qt.AllButtons } ColumnLayout { id: audioLayout anchors.centerIn: parent spacing: 8 Repeater { id: audioRep model: Audio.sinks delegate: Rectangle { Layout.margins: 5 id: audioDelContainer Layout.fillWidth: true color: Colors.c.base02 radius: Config.cfg.appearance.rounding - 4 required property var modelData implicitHeight: audioRow.implicitHeight + 8 implicitWidth: audioRow.implicitWidth RowLayout { id: audioRow anchors.fill: parent StyledText { text: audioDelContainer.modelData.nickname Layout.leftMargin: 10 Layout.fillWidth: true Layout.maximumWidth: 200 elide: Text.ElideRight } StyledIcon { Layout.leftMargin: 10 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 { readonly property bool isDefault: audioDelContainer.modelData === Audio.defaultAudio readonly property bool isPreferred: audioDelContainer.modelData === Audio.preferredAudio iconName: "radio-button" fill: isDefault opacity: (isPreferred && !isDefault) ? 0.5 : 1.0 MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor acceptedButtons: Qt.LeftButton onClicked: { Audio.setDefaultSink(audioDelContainer.modelData); } } } Slider { Layout.rightMargin: 10 focusPolicy: Qt.NoFocus value: audioDelContainer.modelData.audio.volume from: 0 to: 1 onMoved: { audioDelContainer.modelData.audio.volume = value; } } } } } } }