177 lines
6.3 KiB
QML
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;
|
|
}
|
|
}
|