136 lines
4.6 KiB
QML
136 lines
4.6 KiB
QML
import QtQuick
|
|
import Quickshell.Services.Pipewire
|
|
import "../services" as S
|
|
import "../applets" as C
|
|
|
|
Item {
|
|
id: root
|
|
|
|
width: 280
|
|
|
|
property real wavePhase: 0
|
|
property real screenWidth: 0
|
|
property real unlockFade: 1
|
|
|
|
// Fly in when wave exits the right edge, latch once fully revealed.
|
|
// With reducedMotion the wave never runs, so show immediately.
|
|
property bool _revealed: false
|
|
on_RawProgressChanged: if (_rawProgress >= 1)
|
|
_revealed = true
|
|
readonly property real _rawProgress: S.Theme.reducedMotion ? 1 : (screenWidth > 0 ? Math.max(0, Math.min(1, (wavePhase - screenWidth) / 500)) : 0)
|
|
readonly property real _progress: (_revealed ? 1 : _rawProgress) * unlockFade
|
|
opacity: _progress
|
|
property real _slideX: (1 - _progress) * 80
|
|
|
|
transform: Translate {
|
|
x: root._slideX
|
|
}
|
|
|
|
implicitHeight: _widgetContent.implicitHeight
|
|
visible: _weatherCard.visible || _mprisCard.visible || _volumeCard.visible || _backlightCard.visible || _notifPills.visible
|
|
|
|
Column {
|
|
id: _widgetContent
|
|
width: parent.width
|
|
spacing: 12
|
|
|
|
// Weather widget
|
|
Rectangle {
|
|
id: _weatherCard
|
|
width: parent.width
|
|
height: _weatherContent.implicitHeight + 16
|
|
radius: S.Theme.radius + 2
|
|
color: Qt.rgba(S.Theme.base01.r, S.Theme.base01.g, S.Theme.base01.b, 0.7)
|
|
border.color: Qt.rgba(S.Theme.base03.r, S.Theme.base03.g, S.Theme.base03.b, 0.3)
|
|
border.width: 1
|
|
visible: (S.Modules.lock.weather ?? true) && S.WeatherService.available
|
|
|
|
C.WeatherApplet {
|
|
id: _weatherContent
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
anchors.topMargin: 8
|
|
accentColor: S.Theme.base0C
|
|
}
|
|
}
|
|
|
|
// Notification pills
|
|
LockNotifPills {
|
|
id: _notifPills
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
}
|
|
|
|
// Media widget
|
|
Rectangle {
|
|
id: _mprisCard
|
|
width: parent.width
|
|
height: _mprisContent.implicitHeight + 16
|
|
radius: S.Theme.radius + 2
|
|
color: Qt.rgba(S.Theme.base01.r, S.Theme.base01.g, S.Theme.base01.b, 0.7)
|
|
border.color: Qt.rgba(S.Theme.base03.r, S.Theme.base03.g, S.Theme.base03.b, 0.3)
|
|
border.width: 1
|
|
visible: (S.Modules.lock.mpris ?? true) && S.MprisService.player !== null
|
|
|
|
C.MprisApplet {
|
|
id: _mprisContent
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
anchors.topMargin: 8
|
|
accentColor: S.Theme.base0D
|
|
}
|
|
}
|
|
|
|
// Volume widget
|
|
Rectangle {
|
|
id: _volumeCard
|
|
width: parent.width
|
|
height: _volumeContent.implicitHeight + 16
|
|
radius: S.Theme.radius + 2
|
|
color: Qt.rgba(S.Theme.base01.r, S.Theme.base01.g, S.Theme.base01.b, 0.7)
|
|
border.color: Qt.rgba(S.Theme.base03.r, S.Theme.base03.g, S.Theme.base03.b, 0.3)
|
|
border.width: 1
|
|
visible: (S.Modules.lock.volume ?? true) && Pipewire.defaultAudioSink !== null
|
|
|
|
PwObjectTracker {
|
|
objects: [Pipewire.defaultAudioSink]
|
|
}
|
|
|
|
C.VolumeApplet {
|
|
id: _volumeContent
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
anchors.topMargin: 8
|
|
sink: Pipewire.defaultAudioSink
|
|
sinkList: []
|
|
streamList: []
|
|
accentColor: S.Theme.base0E
|
|
}
|
|
}
|
|
|
|
// Brightness widget
|
|
Rectangle {
|
|
id: _backlightCard
|
|
width: parent.width
|
|
height: _backlightContent.implicitHeight + 8
|
|
radius: S.Theme.radius + 2
|
|
color: Qt.rgba(S.Theme.base01.r, S.Theme.base01.g, S.Theme.base01.b, 0.7)
|
|
border.color: Qt.rgba(S.Theme.base03.r, S.Theme.base03.g, S.Theme.base03.b, 0.3)
|
|
border.width: 1
|
|
visible: S.BacklightService.available
|
|
|
|
C.BacklightApplet {
|
|
id: _backlightContent
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
anchors.topMargin: 4
|
|
percent: S.BacklightService.percent
|
|
accentColor: S.Theme.base0A
|
|
onSetPercent: pct => S.BacklightService.setPercent(pct)
|
|
}
|
|
}
|
|
}
|
|
}
|