hyprshell/default/widgets/VolumeMixer.qml

102 lines
2.3 KiB
QML

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Services.Pipewire
import Quickshell.Widgets
Item {
property bool showPopup: true
// Get the default audio sink
property var audioSink: Pipewire.defaultAudioSink
implicitWidth: volumeButton.width + 20
PwObjectTracker {
objects: [audioSink]
}
// Volume icon button
Rectangle {
// text height + 10px padding
id: volumeButton
color: Pipewire.ready ? "transparent" : "red"
width: volumeText.implicitWidth + 20
height: volumeText.implicitHeight + 10
anchors.centerIn: parent
Text {
id: volumeText
anchors.centerIn: parent
text: `Vol: ${Math.floor(audioSink.audio.volume * 100)}%`
color: "white"
}
MouseArea {
anchors.fill: parent
onClicked: {
showPopup = !showPopup;
console.log("Volume clicked, showPopup:", showPopup);
}
}
}
// Floating volume popup window
PanelWindow {
id: volumePopup
visible: showPopup
exclusiveZone: 0
implicitWidth: 500
implicitHeight: 100
anchors.right: parent.right
anchors.top: parent.top
Rectangle {
anchors.fill: parent
color: "black"
ColumnLayout {
anchors.fill: parent
anchors.margins: 30
spacing: 10
RowLayout {
Label {
Layout.fillWidth: true
text: `${audioSink.description}`
color: "white"
font.pixelSize: 16
}
}
RowLayout {
spacing: 10
Label {
text: `${Math.floor(audioSink.audio.volume * 100)}%`
color: "white"
font.pixelSize: 16
}
Slider {
Layout.fillWidth: true
value: audioSink.audio.volume
onValueChanged: audioSink.audio.volume = value
}
}
}
}
}
}