mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
lockscreen: Async load everything and add spinner
This improves the speed initial lockscreen load, and now loads the keypad async. Also adjust the password bar opacity to be consistent with the keys.
This commit is contained in:
parent
d60fea6bdf
commit
dea468b393
2 changed files with 145 additions and 87 deletions
|
|
@ -9,7 +9,7 @@ import QtQuick.Layouts
|
||||||
import org.kde.plasma.core as PlasmaCore
|
import org.kde.plasma.core as PlasmaCore
|
||||||
import org.kde.notificationmanager as Notifications
|
import org.kde.notificationmanager as Notifications
|
||||||
import org.kde.plasma.private.mobileshell.dpmsplugin as DPMS
|
import org.kde.plasma.private.mobileshell.dpmsplugin as DPMS
|
||||||
|
import org.kde.plasma.components 3.0 as PC3
|
||||||
|
|
||||||
import org.kde.kirigami 2.12 as Kirigami
|
import org.kde.kirigami 2.12 as Kirigami
|
||||||
|
|
||||||
|
|
@ -28,30 +28,38 @@ Item {
|
||||||
readonly property bool isWidescreen: root.height < 720 && (root.height < root.width * 0.75)
|
readonly property bool isWidescreen: root.height < 720 && (root.height < root.width * 0.75)
|
||||||
property bool notificationsShown: false
|
property bool notificationsShown: false
|
||||||
|
|
||||||
property var passwordBar: keypad.passwordBar
|
property var passwordBar: flickableLoader.item ? flickableLoader.item.passwordBar : null
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
forceActiveFocus();
|
forceActiveFocus();
|
||||||
|
|
||||||
// Go to closed position when loaded
|
|
||||||
flickable.position = 0;
|
|
||||||
flickable.goToClosePosition();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen for keyboard events, and focus on input area
|
// Listen for keyboard events, and focus on input area
|
||||||
Keys.onPressed: {
|
Keys.onPressed: {
|
||||||
|
if (flickableLoader.item) {
|
||||||
root.lockScreenState.isKeyboardMode = true;
|
root.lockScreenState.isKeyboardMode = true;
|
||||||
flickable.goToOpenPosition();
|
flickableLoader.item.goToOpenPosition();
|
||||||
passwordBar.textField.forceActiveFocus();
|
passwordBar.textField.forceActiveFocus();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Wallpaper blur
|
// Wallpaper blur
|
||||||
Loader {
|
Loader {
|
||||||
|
id: wallpaperLoader
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
active: false
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
|
// This take a while to load, don't pause initial lockscreen loading for it
|
||||||
|
Timer {
|
||||||
|
running: true
|
||||||
|
repeat: false
|
||||||
|
onTriggered: wallpaperLoader.active = true
|
||||||
|
}
|
||||||
|
|
||||||
sourceComponent: WallpaperBlur {
|
sourceComponent: WallpaperBlur {
|
||||||
source: wallpaper
|
source: wallpaper
|
||||||
opacity: flickable.openFactor
|
opacity: flickableLoader.item ? flickableLoader.item.openFactor : 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,8 +68,8 @@ Item {
|
||||||
|
|
||||||
// Ensure keypad is opened when password is updated (ex. keyboard)
|
// Ensure keypad is opened when password is updated (ex. keyboard)
|
||||||
function onPasswordChanged() {
|
function onPasswordChanged() {
|
||||||
if (root.lockScreenState.password !== "") {
|
if (root.lockScreenState.password !== "" && flickableLoader.item) {
|
||||||
flickable.goToOpenPosition();
|
flickableLoader.item.goToOpenPosition();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -72,7 +80,9 @@ Item {
|
||||||
|
|
||||||
onDpmsTurnedOff: (screen) => {
|
onDpmsTurnedOff: (screen) => {
|
||||||
if (screen.name === Screen.name) {
|
if (screen.name === Screen.name) {
|
||||||
flickable.goToClosePosition();
|
if (flickableLoader.item) {
|
||||||
|
flickableLoader.item.goToClosePosition();
|
||||||
|
}
|
||||||
lockScreenState.resetPassword();
|
lockScreenState.resetPassword();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -88,21 +98,65 @@ Item {
|
||||||
z: 1
|
z: 1
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
statusBarHeight: Kirigami.Units.gridUnit * 1.25
|
statusBarHeight: Kirigami.Units.gridUnit * 1.25
|
||||||
openFactor: flickable.openFactor
|
openFactor: flickableLoader.item ? flickableLoader.item.openFactor : 0
|
||||||
notificationsModel: root.notifModel
|
notificationsModel: root.notifModel
|
||||||
onPasswordRequested: root.askPassword()
|
onPasswordRequested: root.askPassword()
|
||||||
}
|
}
|
||||||
|
|
||||||
FlickContainer {
|
// Add loading indicator when status bar has not loaded yet
|
||||||
id: flickable
|
PC3.BusyIndicator {
|
||||||
|
id: flickableLoadingBusyIndicator
|
||||||
|
anchors.centerIn: parent
|
||||||
|
visible: flickableLoader.status != Loader.Ready
|
||||||
|
|
||||||
|
implicitHeight: Kirigami.Units.iconSizes.huge
|
||||||
|
implicitWidth: Kirigami.Units.iconSizes.huge
|
||||||
|
|
||||||
|
Kirigami.Theme.inherit: false
|
||||||
|
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load flickable async
|
||||||
|
Loader {
|
||||||
|
id: flickableLoader
|
||||||
|
|
||||||
|
active: false
|
||||||
|
asynchronous: true
|
||||||
|
opacity: status == Loader.Ready ? 1 : 0
|
||||||
|
visible: opacity > 0
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Behavior on opacity {
|
||||||
|
NumberAnimation {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This take a while to load, don't pause initial lockscreen and wallpaper loading for it
|
||||||
|
Timer {
|
||||||
|
id: loadTimer
|
||||||
|
running: true
|
||||||
|
repeat: false
|
||||||
|
onTriggered: {
|
||||||
|
flickableLoader.active = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Container for lockscreen contents
|
||||||
|
sourceComponent: FlickContainer {
|
||||||
|
id: flickable
|
||||||
|
property alias passwordBar: keypad.passwordBar
|
||||||
|
|
||||||
// Speed up animation when passwordless
|
// Speed up animation when passwordless
|
||||||
animationDuration: root.lockScreenState.canBeUnlocked ? 400 : 800
|
animationDuration: root.lockScreenState.canBeUnlocked ? 400 : 800
|
||||||
|
|
||||||
// Distance to swipe to fully open keypad
|
// Distance to swipe to fully open keypad
|
||||||
keypadHeight: Kirigami.Units.gridUnit * 20
|
keypadHeight: Kirigami.Units.gridUnit * 20
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
// Go to closed position when loaded
|
||||||
|
flickable.position = 0;
|
||||||
|
flickable.goToClosePosition();
|
||||||
|
}
|
||||||
|
|
||||||
// Unlock lockscreen if it's already unlocked and keypad is opened
|
// Unlock lockscreen if it's already unlocked and keypad is opened
|
||||||
onOpened: {
|
onOpened: {
|
||||||
if (root.lockScreenState.canBeUnlocked) {
|
if (root.lockScreenState.canBeUnlocked) {
|
||||||
|
|
@ -187,4 +241,5 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ Rectangle {
|
||||||
readonly property color headerTextInactiveColor: Qt.rgba(255, 255, 255, 0.4)
|
readonly property color headerTextInactiveColor: Qt.rgba(255, 255, 255, 0.4)
|
||||||
|
|
||||||
radius: Kirigami.Units.largeSpacing
|
radius: Kirigami.Units.largeSpacing
|
||||||
color: Qt.rgba(255, 255, 255, 0.3)
|
color: Qt.rgba(255, 255, 255, 0.2)
|
||||||
|
|
||||||
// model for shown dots
|
// model for shown dots
|
||||||
// we need to use a listmodel to avoid all delegates from reloading
|
// we need to use a listmodel to avoid all delegates from reloading
|
||||||
|
|
@ -164,6 +164,8 @@ Rectangle {
|
||||||
// toggle between showing keypad and not
|
// toggle between showing keypad and not
|
||||||
ToolButton {
|
ToolButton {
|
||||||
id: keyboardToggle
|
id: keyboardToggle
|
||||||
|
Kirigami.Theme.inherit: false
|
||||||
|
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
|
||||||
|
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
|
|
@ -175,6 +177,7 @@ Rectangle {
|
||||||
|
|
||||||
implicitWidth: height
|
implicitWidth: height
|
||||||
icon.name: root.lockScreenState.isKeyboardMode ? "input-dialpad-symbolic" : "input-keyboard-virtual-symbolic"
|
icon.name: root.lockScreenState.isKeyboardMode ? "input-dialpad-symbolic" : "input-keyboard-virtual-symbolic"
|
||||||
|
icon.color: 'white'
|
||||||
onClicked: {
|
onClicked: {
|
||||||
root.lockScreenState.isKeyboardMode = !root.lockScreenState.isKeyboardMode;
|
root.lockScreenState.isKeyboardMode = !root.lockScreenState.isKeyboardMode;
|
||||||
if (root.lockScreenState.isKeyboardMode) {
|
if (root.lockScreenState.isKeyboardMode) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue