From 8d709be51ad244bbbdf4f515e319e19cd42f9064 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 7 Jun 2026 17:07:25 +1000 Subject: [PATCH] feat: add per stream volume page --- modules/nexus/PageCompRegistry.qml | 4 ++ modules/nexus/pages/audio/AppVolumes.qml | 69 ++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 modules/nexus/pages/audio/AppVolumes.qml diff --git a/modules/nexus/PageCompRegistry.qml b/modules/nexus/PageCompRegistry.qml index 1d28ae6d..a4292df2 100644 --- a/modules/nexus/PageCompRegistry.qml +++ b/modules/nexus/PageCompRegistry.qml @@ -3,6 +3,7 @@ pragma Singleton import QtQuick import qs.modules.nexus.common import qs.modules.nexus.pages +import qs.modules.nexus.pages.audio import qs.modules.nexus.pages.bluetooth import qs.modules.nexus.pages.wallandstyle @@ -58,6 +59,9 @@ QtObject { Component { AudioPage {} } + Component { + AppVolumes {} + } } } ] diff --git a/modules/nexus/pages/audio/AppVolumes.qml b/modules/nexus/pages/audio/AppVolumes.qml new file mode 100644 index 00000000..46639688 --- /dev/null +++ b/modules/nexus/pages/audio/AppVolumes.qml @@ -0,0 +1,69 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import QtQuick.Layouts +import Quickshell +import Quickshell.Services.Pipewire +import Caelestia.Config +import qs.components +import qs.services +import qs.utils +import qs.modules.nexus.common + +PageBase { + id: root + + title: qsTr("App volumes") + isSubPage: true + + ColumnLayout { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + width: root.cappedWidth + spacing: Tokens.spacing.extraSmall / 2 + + StyledText { + Layout.fillWidth: true + Layout.bottomMargin: Tokens.spacing.medium + text: qsTr("Adjust the volume of individual apps currently playing audio.") + color: Colours.palette.m3outline + font: Tokens.font.body.small + wrapMode: Text.WordWrap + } + + ItemList { + id: streamList + + first: true + last: true + showList: true + placeholderIcon: "music_off" + placeholderText: qsTr("No apps playing audio") + color: list.count === 0 ? Colours.tPalette.m3surfaceContainer : "transparent" + list.spacing: Tokens.spacing.extraSmall / 2 + + model: ScriptModel { + values: [...Audio.streams] + } + + delegate: SliderRow { + id: stream + + required property PwNode modelData + required property int index + + anchors.left: streamList.list.contentItem.left + anchors.right: streamList.list.contentItem.right + first: index === 0 + last: index === streamList.list.count - 1 + + icon: Icons.getVolumeIcon(stream.modelData?.audio?.volume ?? 0, stream.modelData?.audio?.muted ?? false) + label: Audio.getStreamName(stream.modelData) + valueLabel: Math.round(value * 100) + "%" + value: stream.modelData?.audio?.volume ?? 0 + enabled: !stream.modelData?.audio?.muted + onMoved: v => Audio.setStreamVolume(stream.modelData, v) + } + } + } +}