Warning, /plasma/sddm-kcm/src/ui/Advanced.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2020 David Redondo <kde@david-redondo.de>
0003 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005
0006 import QtQuick 2.15
0007 import QtQuick.Controls 2.15 as QQC2
0008 import QtQuick.Dialogs 6.3
0009 import QtQuick.Layouts 1.15
0010
0011 import org.kde.kcmutils as KCM
0012 import org.kde.kirigami 2.14 as Kirigami
0013 import org.kde.kitemmodels 1.0 as ItemModels
0014 import org.kde.private.kcms.sddm 1.0
0015
0016 Kirigami.Page {
0017 title: i18nc("@title", "Behavior")
0018
0019 Kirigami.FormLayout {
0020 width: parent.width
0021
0022 RowLayout {
0023 Kirigami.FormData.label: i18nc("option:check", "Automatically log in:")
0024 spacing: Kirigami.Units.smallSpacing
0025
0026 QQC2.CheckBox {
0027 id: autologinBox
0028 text: i18nc("@label:listbox, the following combobox selects the user to log in automatically", "as user:")
0029 checked: kcm.sddmSettings.user != ""
0030 KCM.SettingHighlighter {
0031 highlight: (kcm.sddmSettings.user != "" && kcm.sddmSettings.defaultUser == "") ||
0032 (kcm.sddmSettings.user == "" && kcm.sddmSettings.defaultUser != "")
0033 }
0034 onToggled: {
0035 // Deliberately imperative because we only want the message
0036 // to appear when the user checks the checkbox, not all the
0037 // time when the checkbox is checked.
0038 if (checked && kcm.KDEWalletAvailable()) {
0039 autologinMessage.visible = true;
0040 }
0041 }
0042 }
0043 QQC2.ComboBox {
0044 id: autologinUser
0045 model: ItemModels.KSortFilterProxyModel {
0046 sourceModel: UsersModel {
0047 id: userModel
0048 }
0049 filterRowCallback: function(sourceRow, sourceParent) {
0050 const id = userModel.data(userModel.index(sourceRow, 0, sourceParent), UsersModel.UidRole)
0051 return kcm.sddmSettings.minimumUid <= id && id <= kcm.sddmSettings.maximumUid
0052 }
0053 }
0054 textRole: "display"
0055 editable: true
0056 onActivated: kcm.sddmSettings.user = currentText
0057 onEnabledChanged: enabled ? kcm.sddmSettings.user = currentText : kcm.sddmSettings.user = ""
0058 KCM.SettingStateBinding {
0059 visible: autologinBox.checked
0060 configObject: kcm.sddmSettings
0061 settingName: "User"
0062 extraEnabledConditions: autologinBox.checked
0063 }
0064 Component.onCompleted: {
0065 updateSelectedUser();
0066
0067 // In the initial state, comboBox sets currentIndex to 0 (the first value from the comboBox).
0068 // After component is completed currentIndex changes to the correct value using `updateSelectUser` here.
0069 // This implicit initial changing of the currentIndex (to 0) calls the onEditTextChanged handler,
0070 // which in turn saves the wrong login in kcm.sddmSettings.user (the first value from the comboBox).
0071 // So we need connect to editTextChanged signal here after the correct currentIndex was settled
0072 // thus reacting only to user input and pressing the Reset/Default buttons.
0073 autologinUser.editTextChanged.connect(setUserFromEditText);
0074 }
0075 function setUserFromEditText() {
0076 kcm.sddmSettings.user = editText;
0077 }
0078 function updateSelectedUser() {
0079 const index = find(kcm.sddmSettings.user);
0080 if (index != -1) {
0081 currentIndex = index;
0082 }
0083 editText = kcm.sddmSettings.user;
0084 }
0085 Connections { // Needed for "Reset" and "Default" buttons to work
0086 target: kcm.sddmSettings
0087 function onUserChanged() { autologinUser.updateSelectedUser(); }
0088 }
0089 }
0090 QQC2.Label {
0091 enabled: autologinBox.checked
0092 text: i18nc("@label:listbox, the following combobox selects the session that is started automatically", "with session")
0093 }
0094 QQC2.ComboBox {
0095 id: autologinSession
0096 model: SessionModel {}
0097 textRole: "name"
0098 valueRole: "file"
0099 onActivated: kcm.sddmSettings.session = currentValue
0100 onEnabledChanged: enabled ? kcm.sddmSettings.session = currentValue : kcm.sddmSettings.session = ""
0101 KCM.SettingStateBinding {
0102 visible: autologinBox.checked
0103 configObject: kcm.sddmSettings
0104 settingName: "Session"
0105 extraEnabledConditions: autologinBox.checked
0106 }
0107 Component.onCompleted: updateCurrentIndex()
0108 function updateCurrentIndex() {
0109 currentIndex = Math.max(indexOfValue(kcm.sddmSettings.session), 0);
0110 }
0111 Connections { // Needed for "Reset" and "Default" buttons to work
0112 target: kcm.sddmSettings
0113 function onSessionChanged() { autologinSession.updateCurrentIndex(); }
0114 }
0115 }
0116 }
0117 Kirigami.InlineMessage {
0118 id: autologinMessage
0119
0120 Layout.fillWidth: true
0121
0122 type: Kirigami.MessageType.Warning
0123
0124 text: xi18nc("@info", "Auto-login does not support unlocking your KDE Wallet automatically, so it will ask you to unlock it every time you log in.\
0125 <nl/><nl/>\
0126 To avoid this, you can change the wallet to have a blank password. Note that this is insecure and should only be done in a trusted environment.")
0127
0128 actions: Kirigami.Action {
0129 text: i18n("Open KDE Wallet Settings")
0130 icon.name: "kwalletmanager"
0131 onTriggered: kcm.openKDEWallet();
0132 }
0133 }
0134 QQC2.CheckBox {
0135 text: i18nc("@option:check", "Log in again immediately after logging off")
0136 checked: kcm.sddmSettings.relogin
0137 onToggled: kcm.sddmSettings.relogin = checked
0138 KCM.SettingStateBinding {
0139 configObject: kcm.sddmSettings
0140 settingName: "Relogin"
0141 extraEnabledConditions: autologinBox.checked
0142 }
0143 }
0144 Item {
0145 Kirigami.FormData.isSection: true
0146 }
0147 QQC2.SpinBox {
0148 Kirigami.FormData.label: i18nc("@label:spinbox", "Minimum user UID:")
0149 id: minSpinBox
0150 from: 1000
0151 to: maxSpinBox.value
0152 value: kcm.sddmSettings.minimumUid
0153 onValueModified: kcm.sddmSettings.minimumUid = value
0154 KCM.SettingStateBinding {
0155 configObject: kcm.sddmSettings
0156 settingName: "MinimumUid"
0157 }
0158 }
0159 QQC2.SpinBox {
0160 Kirigami.FormData.label: i18nc("@label:spinbox", "Maximum user UID:")
0161 id: maxSpinBox
0162 from: minSpinBox.value
0163 to: 60513
0164 value: kcm.sddmSettings.maximumUid
0165 onValueModified: kcm.sddmSettings.maximumUid = value
0166 KCM.SettingStateBinding {
0167 configObject: kcm.sddmSettings
0168 settingName: "MaximumUid"
0169 }
0170 }
0171 Item {
0172 Kirigami.FormData.isSection: true
0173 }
0174 RowLayout {
0175 Kirigami.FormData.label: i18nc("@label:textbox", "Halt Command:")
0176 Layout.fillWidth: true
0177 spacing: Kirigami.Units.smallSpacing
0178
0179 Kirigami.ActionTextField {
0180 id: haltField
0181 Layout.fillWidth: true
0182 text: kcm.sddmSettings.haltCommand
0183 readOnly: false
0184 onTextChanged: kcm.sddmSettings.haltCommand = text
0185 rightActions: [ Kirigami.Action {
0186 icon.name: haltField.LayoutMirroring.enabled ? "edit-clear-locationbar-ltr" : "edit-clear-locationbar-rtl"
0187 visible: haltField.text.length > 0
0188 onTriggered: kcm.sddmSettings.haltCommand = ""
0189 }]
0190 KCM.SettingStateBinding {
0191 configObject: kcm.sddmSettings
0192 settingName: "HaltCommand"
0193 }
0194 }
0195 QQC2.Button {
0196 id: haltButton
0197 icon.name: "document-open-folder"
0198 enabled: haltField.enabled
0199 function selectFile() {
0200 fileDialog.handler = (url => kcm.sddmSettings.haltCommand = kcm.toLocalFile(url))
0201 fileDialog.open()
0202 }
0203 onClicked: selectFile()
0204 }
0205 }
0206 RowLayout {
0207 Layout.fillWidth: true
0208 Kirigami.FormData.label: i18nc("@label:textbox", "Reboot Command:")
0209 spacing: Kirigami.Units.smallSpacing
0210
0211 Kirigami.ActionTextField {
0212 id: rebootField
0213 Layout.fillWidth: true
0214 text: kcm.sddmSettings.rebootCommand
0215 readOnly: false
0216 onTextChanged: kcm.sddmSettings.rebootCommand = text
0217 rightActions: [ Kirigami.Action {
0218 icon.name: rebootField.LayoutMirroring.enabled ? "edit-clear-locationbar-ltr" : "edit-clear-locationbar-rtl"
0219 visible: rebootField.text.length > 0
0220 onTriggered: kcm.sddmSettings.rebootCommand = ""
0221 }]
0222 KCM.SettingStateBinding {
0223 configObject: kcm.sddmSettings
0224 settingName: "RebootCommand"
0225 }
0226 }
0227 QQC2.Button {
0228 id: rebootButton
0229 icon.name: "document-open-folder"
0230 enabled: rebootField.enabled
0231 function selectFile() {
0232 fileDialog.handler = (url => kcm.sddmSettings.rebootCommand = kcm.toLocalFile(url))
0233 fileDialog.open()
0234 }
0235 onClicked: selectFile()
0236 }
0237 }
0238 FileDialog {
0239 id: fileDialog
0240 property var handler
0241 onAccepted: {
0242 handler(fileUrl)
0243 }
0244 }
0245 }
0246 }