You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
8.7 KiB
232 lines
8.7 KiB
/*
|
|
* Copyright 2019 Romain V. <contact@rokin.in> - <https://github.com/Rokin05>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this program; if not, see <https://www.gnu.org/licenses>.
|
|
*/
|
|
|
|
import QtQuick 2.8
|
|
import QtQuick.Layouts 1.3
|
|
import "components"
|
|
|
|
// ============================================================
|
|
// BE AWARE, THIS IS A DELEGATE FILE of Skel (Main.qml)
|
|
// You can access on Skel propriety here !
|
|
// ============================================================
|
|
|
|
GridLayout {
|
|
id: grid
|
|
property bool newUser: false // Switch signal userlist < > usernameBox view.
|
|
readonly property string usernameValue: newUser ? usernameBox.text : userlist.selectedUserLogin
|
|
readonly property string passwordValue: passwordBox.text
|
|
|
|
// For Skel.qml & javascript function.
|
|
readonly property real miniloginSize: Math.round(miniloginButton.width + miniloginButton.anchors.leftMargin)
|
|
|
|
implicitWidth: isFull ? root.width : taskbarSize
|
|
LayoutMirroring.enabled: isMirror
|
|
anchors.left: parent.left
|
|
columns: (isHalf || isFull) ? 1 : 999
|
|
columnSpacing: 0 // = Vertical (view) adjust.
|
|
rowSpacing: 45
|
|
|
|
// From userlist to Skel.qml : Propagation "onClicked" like.
|
|
signal userSelected()
|
|
|
|
// ==============
|
|
// Row/Column 1/2
|
|
// ==============
|
|
|
|
Item {
|
|
Layout.preferredWidth: isFull ? root.width : isHalf ? taskbarSize : iconSize
|
|
Layout.preferredHeight: grid.newUser ? newUserAvatar.height : userlist.height
|
|
|
|
UserList {
|
|
id: userlist
|
|
//width: isFull ? root.width : implicitWidth
|
|
anchors.horizontalCenter : parent.horizontalCenter
|
|
orientationUserlist: (isHalf || isFull) ? "horizontal" : "vertical"
|
|
showUsername: (isHalf || isFull) ? true : false
|
|
clip: (isFull || !isHalf) ? false : true
|
|
visible: grid.newUser ? false : true
|
|
opacity: visible ? 1 : 0
|
|
Behavior on opacity { NumberAnimation { duration: 500 } }
|
|
onUserSelected: grid.userSelected()
|
|
}
|
|
|
|
User {
|
|
id: newUserAvatar
|
|
anchors.horizontalCenter : parent.horizontalCenter
|
|
width: parent.width
|
|
faceSize: config["userlist/icon.size"]
|
|
borderSize: config["userlist/frame.spacing"]
|
|
avatarPath: config["path/login.icon.default"]
|
|
name: textConstants.prompt
|
|
constrainText: true
|
|
isCurrent: true
|
|
showUsername: (isHalf || isFull) ? true : false
|
|
visible: grid.newUser ? true : false
|
|
opacity: visible ? 1 : 0
|
|
Behavior on opacity { NumberAnimation { duration: 500 } }
|
|
font.pointSize: 9
|
|
font.bold: false
|
|
font.italic: false
|
|
onSelectMe: grid.userSelected()
|
|
}
|
|
}
|
|
|
|
// ==============
|
|
// Row/Column 2/2
|
|
// ==============
|
|
|
|
ColumnLayout {
|
|
Layout.preferredWidth: isFull ? root.width : taskbarSize
|
|
LayoutMirroring.enabled: isMirror
|
|
|
|
UsernameLabel {
|
|
Layout.leftMargin: 4
|
|
Layout.rightMargin: 4
|
|
text: userlist.selectedUserName
|
|
visible: ((taskbarSize - iconSize) >= implicitWidth) && !grid.newUser && !(isHalf || isFull)
|
|
opacity: visible ? 1 : 0
|
|
Behavior on opacity { NumberAnimation { duration: 500 } }
|
|
}
|
|
|
|
NotificationMessage {
|
|
id: notification
|
|
LayoutMirroring.enabled: isMirror
|
|
Layout.maximumWidth: isFull ? root.width : isHalf ? taskbarSize : (taskbarSize - iconSize)
|
|
Layout.minimumWidth: (taskbarSize - iconSize)
|
|
Layout.fillWidth: true
|
|
Layout.preferredHeight: text == "" ? 1 : implicitHeight
|
|
Layout.leftMargin: 4
|
|
Layout.rightMargin: 4
|
|
horizontalAlignment: (isHalf || isFull) ? Text.AlignHCenter : Text.AlignLeft
|
|
visible: textboxVisible()
|
|
}
|
|
|
|
TextBox {
|
|
id: usernameBox
|
|
Layout.alignment: (isHalf || isFull) ? Qt.AlignCenter : Qt.AlignVCenter | Qt.AlignLeft
|
|
Layout.preferredWidth: textboxWidth()
|
|
Layout.topMargin: 5
|
|
echoMode: TextInput.Normal
|
|
placeholderText: textConstants.userName
|
|
clearButtonShown: true
|
|
revealPasswordButtonShown: false
|
|
focus: visible ? true : false
|
|
visible: textboxVisible() && grid.newUser
|
|
opacity: visible ? 1 : 0
|
|
Behavior on opacity { NumberAnimation { duration: 500 } }
|
|
onAccepted: passwordBox.forceActiveFocus()
|
|
// See : https://github.com/sddm/sddm/issues/202 (keyboard.layouts)
|
|
Keys.onPressed: keyboardButton.displayText = keyboard.layouts[keyboard.currentLayout].longName;
|
|
}
|
|
|
|
TextBox {
|
|
id: passwordBox
|
|
Layout.alignment: (isHalf || isFull) ? Qt.AlignCenter : Qt.AlignVCenter | Qt.AlignLeft
|
|
Layout.preferredWidth: textboxWidth()
|
|
Layout.topMargin: 5
|
|
echoMode: TextInput.Password
|
|
placeholderText: textConstants.password
|
|
clearButtonShown: true
|
|
revealPasswordButtonShown: true
|
|
focus: usernameBox.visible ? false : true
|
|
visible: textboxVisible()
|
|
opacity: visible ? 1 : 0
|
|
Behavior on opacity { NumberAnimation { duration: 500 } }
|
|
onAccepted: grid.login()
|
|
Keys.onPressed: keyboardButton.displayText = keyboard.layouts[keyboard.currentLayout].longName;
|
|
}
|
|
|
|
LoginButton {
|
|
id: loginButton
|
|
Layout.alignment: Qt.AlignCenter
|
|
Layout.preferredWidth: passwordBox.width
|
|
Layout.topMargin: 5
|
|
text: textConstants.login
|
|
enabled: (grid.newUser && grid.usernameValue == "") ? false : true
|
|
visible: (isHalf || isFull) ? true : false
|
|
opacity: visible ? 1 : 0
|
|
Behavior on opacity { NumberAnimation { duration: 500 } }
|
|
onClicked: grid.login()
|
|
}
|
|
|
|
// *info : im not a ColumnLayout direct child.
|
|
LoginButton {
|
|
id: miniloginButton
|
|
parent: passwordBox
|
|
LayoutMirroring.enabled: isMirror
|
|
anchors.left: parent.right
|
|
anchors.leftMargin: 4
|
|
text: isMirror ? "<" : ">"
|
|
enabled: (grid.newUser && grid.usernameValue == "") ? false : true
|
|
visible: !(isHalf || isFull) ? true : false
|
|
opacity: visible ? 1 : 0
|
|
Behavior on opacity { NumberAnimation { duration: 500 } }
|
|
onClicked: grid.login()
|
|
}
|
|
}
|
|
|
|
//Item { id: keepmeImAutoWidthAnchor; anchors.fill: parent } //finalydontkeepmeidoshit
|
|
|
|
function textboxWidth() {
|
|
if (!isFull) {
|
|
var size = (taskbarSize - iconSize) - miniloginSize;
|
|
if (size < 0) return 0;
|
|
if (size > parseInt(config["textfield/width"])) return parseInt(config["textfield/width"]);
|
|
return size;
|
|
}
|
|
return parseInt(config["textfield/width"]);
|
|
}
|
|
|
|
function textboxVisible() {
|
|
if (!isFull) {
|
|
var size = (taskbarSize - iconSize) - miniloginSize;
|
|
if (size < parseInt(config["textfield/width.min"])) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
// ==============
|
|
// Misc
|
|
// ==============
|
|
|
|
Keys.onPressed: {
|
|
if (event.key == Qt.Key_Left) userlist.decrementCurrentIndex();
|
|
if (event.key == Qt.Key_Right) userlist.incrementCurrentIndex();
|
|
if (event.key == Qt.Key_Up) userlist.incrementCurrentIndex();
|
|
if (event.key == Qt.Key_Down) userlist.decrementCurrentIndex();
|
|
}
|
|
|
|
Connections {
|
|
target: sddm
|
|
onLoginSucceeded: grid.opacity = 0
|
|
onLoginFailed: {
|
|
notification.msg = textConstants.loginFailed;
|
|
passwordBox.selectAll();
|
|
passwordBox.forceActiveFocus();
|
|
}
|
|
}
|
|
|
|
function login() {
|
|
if (grid.usernameValue !== "") {
|
|
loginButton.visible ? loginButton.forceActiveFocus() : miniloginButton.forceActiveFocus();
|
|
sddm.login(grid.usernameValue, grid.passwordValue, sessionButton.currentIndex);
|
|
}
|
|
}
|
|
|
|
}
|