pragma ComponentBehavior: Bound import QtQuick import QtQuick.Layouts import Caelestia.Config import qs.components import qs.components.controls import qs.services import qs.utils Item { id: root required property Brightness.Monitor monitor required property DrawerVisibilities visibilities required property real volume required property bool muted required property real sourceVolume required property bool sourceMuted required property real brightness implicitWidth: layout.implicitWidth + Tokens.padding.extraLargeIncreased implicitHeight: layout.implicitHeight + Tokens.padding.extraLargeIncreased ColumnLayout { id: layout anchors.centerIn: parent spacing: Tokens.spacing.medium // Speaker volume CustomMouseArea { function onWheel(event: WheelEvent) { if (event.angleDelta.y > 0) Audio.incrementVolume(); else if (event.angleDelta.y < 0) Audio.decrementVolume(); } implicitWidth: Tokens.sizes.osd.sliderWidth implicitHeight: Tokens.sizes.osd.sliderHeight FilledSlider { anchors.fill: parent icon: Icons.getVolumeIcon(value, root.muted) value: root.volume to: GlobalConfig.services.maxVolume onMoved: Audio.setVolume(value) } } // Microphone volume WrappedLoader { shouldBeActive: Config.osd.enableMicrophone && (!Config.osd.enableBrightness || !root.visibilities.session) sourceComponent: CustomMouseArea { function onWheel(event: WheelEvent) { if (event.angleDelta.y > 0) Audio.incrementSourceVolume(); else if (event.angleDelta.y < 0) Audio.decrementSourceVolume(); } implicitWidth: Tokens.sizes.osd.sliderWidth implicitHeight: Tokens.sizes.osd.sliderHeight FilledSlider { anchors.fill: parent icon: Icons.getMicVolumeIcon(value, root.sourceMuted) value: root.sourceVolume to: GlobalConfig.services.maxVolume onMoved: Audio.setSourceVolume(value) } } } // Brightness WrappedLoader { shouldBeActive: Config.osd.enableBrightness sourceComponent: CustomMouseArea { function onWheel(event: WheelEvent) { const monitor = root.monitor; if (!monitor) return; if (event.angleDelta.y > 0) monitor.setBrightness(monitor.brightness + GlobalConfig.services.brightnessIncrement); else if (event.angleDelta.y < 0) monitor.setBrightness(monitor.brightness - GlobalConfig.services.brightnessIncrement); } implicitWidth: Tokens.sizes.osd.sliderWidth implicitHeight: Tokens.sizes.osd.sliderHeight FilledSlider { anchors.fill: parent icon: `brightness_${(Math.round(value * 6) + 1)}` value: root.brightness onMoved: root.monitor?.setBrightness(value) } } } } component WrappedLoader: Loader { required property bool shouldBeActive asynchronous: true Layout.preferredHeight: shouldBeActive ? Tokens.sizes.osd.sliderHeight : 0 opacity: shouldBeActive ? 1 : 0 active: opacity > 0 visible: active Behavior on Layout.preferredHeight { Anim { type: Anim.Emphasized } } Behavior on opacity { Anim {} } } }