mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 22:33:08 +00:00
Restores a fix for https://invent.kde.org/plasma/plasma-mobile/-/issues/381 The pw notifications model right at load appears to say there are notifications at load, but then fixes itself once the component finishes loading.
142 lines
No EOL
4.5 KiB
QML
142 lines
No EOL
4.5 KiB
QML
// SPDX-FileCopyrightText: 2021-2024 Devin Lin <devin@kde.org>
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
import QtQuick
|
|
import QtQuick.Layouts
|
|
import QtQuick.Effects
|
|
|
|
import org.kde.kirigami 2.20 as Kirigami
|
|
import org.kde.plasma.workspace.keyboardlayout 1.0
|
|
import org.kde.notificationmanager as Notifications
|
|
import org.kde.plasma.private.mobileshell as MobileShell
|
|
|
|
Item {
|
|
id: root
|
|
|
|
required property var lockScreenState
|
|
required property bool isVertical
|
|
|
|
property var notificationsModel: []
|
|
property bool notificationsShown: false
|
|
|
|
property real fullHeight
|
|
|
|
signal passwordRequested()
|
|
|
|
// Vertical layout
|
|
ColumnLayout {
|
|
id: verticalLayout
|
|
visible: root.isVertical
|
|
spacing: 0
|
|
|
|
// Center clock when no notifications are shown, otherwise move the clock upward
|
|
anchors.topMargin: root.notificationsShown ? Kirigami.Units.gridUnit * 5 : Math.round(root.fullHeight / 2 - (verticalLayout.implicitHeight / 2))
|
|
anchors.bottomMargin: Kirigami.Units.gridUnit
|
|
anchors.fill: parent
|
|
|
|
// Animate clock centering change when notifications come in
|
|
Behavior on anchors.topMargin {
|
|
id: topMarginAnim
|
|
enabled: false
|
|
|
|
NumberAnimation {
|
|
duration: Kirigami.Units.veryLongDuration
|
|
easing.type: Easing.InOutExpo
|
|
}
|
|
}
|
|
|
|
LayoutItemProxy { target: clockAndMediaWidget }
|
|
LayoutItemProxy { target: notificationComponent }
|
|
}
|
|
|
|
// HACK: don't animate top margin at beginning, while notification model figures itself out
|
|
Timer {
|
|
running: true
|
|
repeat: false
|
|
onTriggered: topMarginAnim.enabled = true
|
|
}
|
|
|
|
// Horizontal layout (landscape on smaller devices)
|
|
Item {
|
|
id: horizontalLayout
|
|
anchors.fill: parent
|
|
visible: !root.isVertical
|
|
|
|
ColumnLayout {
|
|
id: leftLayout
|
|
width: parent.width / 2
|
|
anchors {
|
|
top: parent.top
|
|
bottom: parent.bottom
|
|
left: parent.left
|
|
leftMargin: Kirigami.Units.gridUnit * 3
|
|
}
|
|
|
|
LayoutItemProxy { target: clockAndMediaWidget }
|
|
}
|
|
|
|
ColumnLayout {
|
|
id: rightLayout
|
|
anchors {
|
|
top: parent.top
|
|
bottom: parent.bottom
|
|
left: leftLayout.right
|
|
right: parent.right
|
|
rightMargin: Kirigami.Units.gridUnit
|
|
}
|
|
|
|
LayoutItemProxy { target: notificationComponent }
|
|
}
|
|
}
|
|
|
|
// Clock and media widget column
|
|
ColumnLayout {
|
|
id: clockAndMediaWidget
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: root.isVertical
|
|
spacing: Kirigami.Units.gridUnit * 2
|
|
|
|
Clock {
|
|
layoutAlignment: root.isVertical ? Qt.AlignHCenter : Qt.AlignLeft
|
|
Layout.alignment: root.isVertical ? Qt.AlignHCenter : Qt.AlignLeft
|
|
Layout.fillWidth: true
|
|
Layout.bottomMargin: root.isVertical ? Kirigami.Units.gridUnit * 2 : 0
|
|
}
|
|
|
|
MobileShell.MediaControlsWidget {
|
|
Layout.alignment: root.isVertical ? Qt.AlignHCenter : Qt.AlignLeft
|
|
Layout.fillWidth: true
|
|
Layout.maximumWidth: Kirigami.Units.gridUnit * 25
|
|
Layout.leftMargin: root.isVertical ? Kirigami.Units.gridUnit : 0
|
|
Layout.rightMargin: root.isVertical ? Kirigami.Units.gridUnit : 0
|
|
|
|
layer.enabled: true
|
|
layer.effect: MultiEffect {
|
|
blurMax: 16
|
|
shadowEnabled: true
|
|
shadowVerticalOffset: 1
|
|
shadowOpacity: 0.5
|
|
shadowColor: Qt.lighter(Kirigami.Theme.backgroundColor, 0.1)
|
|
}
|
|
}
|
|
}
|
|
|
|
NotificationsComponent {
|
|
id: notificationComponent
|
|
lockScreenState: root.lockScreenState
|
|
notificationsModel: root.notificationsModel
|
|
|
|
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
|
|
Layout.fillHeight: true
|
|
Layout.fillWidth: true
|
|
Layout.maximumWidth: Kirigami.Units.gridUnit * (25 + 2) // clip margins
|
|
|
|
leftMargin: root.isVertical ? 0 : Kirigami.Units.gridUnit
|
|
rightMargin: root.isVertical ? 0 : Kirigami.Units.gridUnit
|
|
bottomMargin: root.isVertical ? 0 : Kirigami.Units.gridUnit
|
|
topMargin: Kirigami.Units.gridUnit
|
|
|
|
onPasswordRequested: root.passwordRequested()
|
|
onNotificationsShownChanged: root.notificationsShown = notificationsShown
|
|
}
|
|
} |