102 lines
2.3 KiB
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
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|