import Quickshell // for PanelWindow import QtQuick // for Text import QtQuick.Controls import QtQuick.Layouts import Quickshell.Io import Quickshell.Widgets import Quickshell.Hyprland import Quickshell.Services.Pipewire ScrollView { anchors.fill: parent ColumnLayout { anchors.fill: parent spacing: 0 ClippingWrapperRectangle { color: Settings.colors.color11 radius: 5 Layout.margins: 5 Layout.alignment: Qt.AlignVCenter | Qt.AlignTop implicitWidth: parent.width - 2 * Layout.margins RowLayout { width: parent.width Text { color: Settings.colors.color0 Layout.margins: 5 Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter text: 'Output' } Slider { from: 0 to: 2 orientation: Qt.Horizontal implicitWidth: 500 value: Pipewire.defaultAudioSink.audio.volume onValueChanged: Pipewire.defaultAudioSink.audio.volume = value } } } ColumnLayout { Repeater { id: outputs model: { Pipewire.nodes.values.filter(n => n.isSink && n.audio && n.nickname != "") } Button { text: outputs.model[index].nickname onClicked: { Pipewire.preferredDefaultAudioSink = outputs.model[index] } PwObjectTracker { objects: [ outputs.model[index] ] } } } } ClippingWrapperRectangle { color: Settings.colors.color11 radius: 5 Layout.margins: 5 Layout.alignment: Qt.AlignVCenter | Qt.AlignTop implicitWidth: parent.width - 2 * Layout.margins RowLayout { width: parent.width Text { color: Settings.colors.color0 Layout.margins: 5 Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter text: 'Input' } Slider { from: 0 to: 2 visible: false orientation: Qt.Horizontal implicitWidth: 500 value: Pipewire.defaultAudioSource.audio.volume onValueChanged: Pipewire.defaultAudioSource.audio.volume = value } } } ColumnLayout { Repeater { id: inputs model: { Pipewire.nodes.values.filter(n => !n.isSink && n.audio && n.nickname != "") } Button { text: inputs.model[index].nickname onClicked: { Pipewire.preferredDefaultAudioSource = inputs.model[index] } } } } } }