import QtQuick 2.15 import QtQuick.Controls 2.0 import SddmComponents 2.0 import "components" Rectangle { id : gRoot property color cTextNormal : "#ffffff" property color cTextFailure : "#f43841" property color cTextSuccess : "#00ff00" property color cBackgroundRoot : "#000000" property color cBackgroundNormal : "#333333" property color cBackgroundActive : "#285577" property color cBorderNormal : "#222222" property color cBorderActive : "#4c7899" property string fontFamily : "monospace" property int fontSize : 16 property string defaultUser : "" property int panelSize : 420 property int offset : 96 color: cBackgroundRoot property int activeInput : initInputs() property int currentSessionsIndex : sessionModel.lastIndex property string currentSession: sessionModel.data(sessionModel.index(currentSessionsIndex, 0), Qt.UserRole + 4) function xCenter(sz) { return gRoot.width / 2 - sz / 2; } function yCenter(sz) { return gRoot.height / 2 - sz / 2; } function initInputs() { if(defaultUser != "") { gPasswordInput.forceActiveFocus(); return 1; } else { gLoginInput.forceActiveFocus(); return 0; } } function initInfoText() { var text = ""; if(sddm.canPowerOff) { text += "f1 shutdown" } if(sddm.canReboot) { if(text != "") { text += " " } text += "f2 reboot" } return text; } function sessionsCycleSelectPrev() { if(timer.running) { return; } if (currentSessionsIndex - 1 < 0) { currentSessionsIndex = sessionModel.rowCount() - 1; } else { currentSessionsIndex--; } } function sessionsCycleSelectNext() { if(timer.running) { return; } if (currentSessionsIndex >= sessionModel.rowCount() - 1) { currentSessionsIndex = 0; } else { currentSessionsIndex++; } } function focusNext() { if(timer.running) { return; } if(gRoot.activeInput == 0) { gPasswordInput.forceActiveFocus(); gRoot.activeInput = 1; } else if(gRoot.activeInput == -1) { gLoginInput.forceActiveFocus(); gRoot.activeInput = 0; } } function focusPrev() { if(timer.running) { return; } if(gRoot.activeInput == 1) { gLoginInput.forceActiveFocus(); gRoot.activeInput = 0; } else if(gRoot.activeInput == 0) { gSessionBox.forceActiveFocus(); gRoot.activeInput = -1; } } function setInputLock(lock) { gLoginInput.readOnly = lock; gPasswordInput.readOnly = lock; gLoginInput.enabled = !lock; gPasswordInput.enabled = !lock; gSessionBox.enabled = !lock; } Timer { id: timer interval: 750 repeat: true running: false onTriggered: { gInfoLabel.text += "."; } } function tryLogin() { gInfoLabel.color = cTextNormal; gInfoLabel.text = "."; timer.start(); setInputLock(true); sddm.login(gLoginInput.text, gPasswordInput.text, currentSessionsIndex); } Connections { target: sddm function onLoginSucceeded() { timer.stop(); gInfoLabel.color = cTextSuccess gInfoLabel.text = "success" } function onLoginFailed() { timer.stop(); gInfoLabel.color = cTextFailure gInfoLabel.text = "auth failure" setInputLock(false); } } Shortcut { sequence: "Down" onActivated: focusNext(); } Shortcut { sequence: "Up" onActivated: focusPrev(); } Shortcut { sequence: "F1" onActivated: { sddm.powerOff(); } } Shortcut { sequence: "F2" onActivated: { sddm.reboot(); } } Text { x: xCenter(panelSize) y: yCenter(panelSize) width: panelSize height: 2 * fontSize horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter font.pixelSize: fontSize font.family: fontFamily color: cTextNormal text: sddm.hostName; } Text { x: 0 y: gRoot.height - 2 * fontSize width: gRoot.width height: 2 * fontSize horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter font.pixelSize: fontSize font.family: fontFamily color: cTextNormal text: initInfoText(); } Rectangle { x: xCenter(panelSize) y: yCenter(panelSize) + 3 * fontSize Text { width: panelSize height: 2 * fontSize horizontalAlignment: Qt.AlignHLeft verticalAlignment: Qt.AlignVCenter font.pixelSize: fontSize font.family: fontFamily color: cTextNormal text: "session:" } SessionSelect { id: gSessionBox x: offset width: panelSize - offset height: fontSize * 2 text: currentSession onPrevClicked: sessionsCycleSelectPrev(); onNextClicked: sessionsCycleSelectNext(); KeyNavigation.tab : gLoginInput Keys.onPressed: function (event) { if(event.key == Qt.Key_Return || event.key == Qt.Key_Enter) { focusNext(); event.accepted = true; } } } } Rectangle { x: xCenter(panelSize) y: yCenter(panelSize) + 2 * 3 * fontSize Text { width: panelSize height: 2 * fontSize horizontalAlignment: Qt.AlignHLeft verticalAlignment: Qt.AlignVCenter font.pixelSize: fontSize font.family: fontFamily color: cTextNormal text: "login:" } TextBoxCustom { id: gLoginInput x: offset width: panelSize - offset height: 2 * fontSize font.pixelSize: fontSize font.family: fontFamily cText: cTextNormal // TODO set the remaining colors text: defaultUser KeyNavigation.tab : gPasswordInput KeyNavigation.backtab : gSessionBox Keys.onPressed: function (event) { if(event.key == Qt.Key_Return || event.key == Qt.Key_Enter) { focusNext(); event.accepted = true; } } } } Rectangle { x: xCenter(panelSize) y: yCenter(panelSize) + 3 * 3 * fontSize Text { width: panelSize height: 2 * fontSize horizontalAlignment: Qt.AlignHLeft verticalAlignment: Qt.AlignVCenter font.pixelSize: fontSize font.family: fontFamily color: cTextNormal text: "password:" } TextBoxCustom { id: gPasswordInput x: offset width: panelSize - offset height: 2 * fontSize font.pixelSize: fontSize font.family: fontFamily cText: cTextNormal // todo set the remaining colors here echoMode: TextInput.Password Keys.onPressed: function(event) { if(event.key == Qt.Key_Return || event.key == Qt.Key_Enter) { tryLogin(); event.accepted = true; } } } } Text { id: gInfoLabel text: "" x: xCenter(panelSize) y: yCenter(panelSize) + 4 * 3 * fontSize width: panelSize height: 2 * fontSize horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter color: cTextNormal } }