Files
sddm-theme/themes/sm1tee/components/LockScreen.qml
Ваше Имя ed9ba99412 update
2025-06-30 23:19:29 +03:00

177 lines
6.3 KiB
QML

import QtQuick
import QtQuick.Effects
import QtQuick.Layouts
import QtQuick.Controls
Item {
id: lockScreen
signal loginRequested
// TODO: Support for weather info?
ColumnLayout {
id: timePositioner
spacing: Config.dateMarginTop
Text {
id: time
visible: Config.clockDisplay
font.pixelSize: Config.clockFontSize
font.weight: Config.clockFontWeight
font.family: Config.clockFontFamily
color: Config.clockColor
Layout.alignment: Config.clockAlign === "left" ? Qt.AlignLeft : (Config.clockAlign === "right" ? Qt.AlignRight : Qt.AlignHCenter)
function updateTime() {
text = new Date().toLocaleString(Qt.locale(""), Config.clockFormat);
}
}
Text {
id: date
Layout.alignment: Config.clockAlign === "left" ? Qt.AlignLeft : (Config.clockAlign === "right" ? Qt.AlignRight : Qt.AlignHCenter)
visible: Config.dateDisplay
font.pixelSize: Config.dateFontSize
font.family: Config.dateFontFamily
font.weight: Config.dateFontWeight
color: Config.dateColor
function updateDate() {
text = new Date().toLocaleString(Qt.locale("ru_RU"), Config.dateFormat);
}
}
Timer {
id: clockTimer
interval: 1000
repeat: true
running: true
onTriggered: {
time.updateTime();
date.updateDate();
}
}
Component.onDestruction: {
if (clockTimer) {
clockTimer.stop();
}
}
anchors {
// FIX: Height calculation fixes - protect against zero division
topMargin: Config.lockScreenPaddingTop || (lockScreen.height > 0 ? lockScreen.height / 10 : 50)
rightMargin: Config.lockScreenPaddingRight || (lockScreen.height > 0 ? lockScreen.height / 10 : 50)
bottomMargin: Config.lockScreenPaddingBottom || (lockScreen.height > 0 ? lockScreen.height / 10 : 50)
leftMargin: Config.lockScreenPaddingLeft || (lockScreen.height > 0 ? lockScreen.height / 10 : 50)
}
Component.onCompleted: {
lockScreen.alignItem(timePositioner, Config.clockPosition);
time.updateTime();
date.updateDate();
}
}
ColumnLayout {
id: messagePositioner
visible: Config.lockMessageDisplay
spacing: Config.lockMessageSpacing
Image {
id: lockIcon
source: Config.getIcon(Config.lockMessageIcon)
Layout.alignment: Config.lockMessageAlign === "left" ? Qt.AlignLeft : (Config.lockMessageAlign === "right" ? Qt.AlignRight : Qt.AlignHCenter)
visible: Config.lockMessageDisplayIcon
Layout.preferredWidth: Config.lockMessageIconSize
Layout.preferredHeight: Config.lockMessageIconSize
sourceSize: Qt.size(width, height)
fillMode: Image.PreserveAspectFit
MultiEffect {
source: lockIcon
anchors.fill: lockIcon
colorization: Config.lockMessagePaintIcon ? 1 : 0
colorizationColor: Config.lockMessageColor
}
}
Text {
id: lockMessage
Layout.alignment: Config.lockMessageAlign === "left" ? Qt.AlignLeft : (Config.lockMessageAlign === "right" ? Qt.AlignRight : Qt.AlignHCenter)
font.pixelSize: Config.lockMessageFontSize
font.family: Config.lockMessageFontFamily
font.weight: Config.lockMessageFontWeight
color: Config.lockMessageColor
text: Config.lockMessageText
}
anchors {
// FIX: Height calculation fixes - protect against zero division
topMargin: Config.lockScreenPaddingTop || (lockScreen.height > 0 ? lockScreen.height / 10 : 50)
rightMargin: Config.lockScreenPaddingRight || (lockScreen.height > 0 ? lockScreen.height / 10 : 50)
bottomMargin: Config.lockScreenPaddingBottom || (lockScreen.height > 0 ? lockScreen.height / 10 : 50)
leftMargin: Config.lockScreenPaddingLeft || (lockScreen.height > 0 ? lockScreen.height / 10 : 50)
}
Component.onCompleted: lockScreen.alignItem(messagePositioner, Config.lockMessagePosition)
}
function alignItem(item, pos) {
switch (pos) {
case "top-left":
item.anchors.top = lockScreen.top;
item.anchors.left = lockScreen.left;
break;
case "top-center":
item.anchors.top = lockScreen.top;
item.anchors.horizontalCenter = lockScreen.horizontalCenter;
break;
case "top-right":
item.anchors.top = lockScreen.top;
item.anchors.right = lockScreen.right;
break;
case "center-left":
item.anchors.verticalCenter = lockScreen.verticalCenter;
item.anchors.left = lockScreen.left;
break;
case "center":
item.anchors.verticalCenter = lockScreen.verticalCenter;
item.anchors.horizontalCenter = lockScreen.horizontalCenter;
break;
case "center-right":
item.anchors.verticalCenter = lockScreen.verticalCenter;
item.anchors.right = lockScreen.right;
break;
case "bottom-left":
item.anchors.bottom = lockScreen.bottom;
item.anchors.left = lockScreen.left;
break;
case "bottom-center":
item.anchors.bottom = lockScreen.bottom;
item.anchors.horizontalCenter = lockScreen.horizontalCenter;
break;
default:
item.anchors.bottom = lockScreen.bottom;
item.anchors.right = lockScreen.right;
}
}
MouseArea {
id: lockScreenMouseArea
hoverEnabled: true
z: -1
anchors.fill: lockScreen
onClicked: lockScreen.loginRequested()
}
Keys.onPressed: function (event) {
if (event.key === Qt.Key_CapsLock) {
root.capsLockOn = !root.capsLockOn;
}
if (event.key === Qt.Key_Escape) {
event.accepted = false;
return;
} else {
lockScreen.loginRequested();
}
event.accepted = true;
}
}