1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
/*
SPDX-FileCopyrightText: 2019 Nicolas Fella <nicolas.fella@gmx.de>
SPDX-FileCopyrightText: 2020 Carson Black <uhhadd@gmail.com>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
import QtQuick 2.6
import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.12
import QtQuick.Controls 2.5 as QQC2
import org.kde.kcm 1.2
import org.kde.kirigami 2.13 as Kirigami
SimpleKCM {
id: usersDetailPage
title: user.displayPrimaryName
property QtObject user
property bool overrideImage: false
property url oldImage
Connections {
target: user
function onApplyError(errorText) {
errorMessage.visible = true
errorMessage.text = errorText
}
}
Connections {
target: user
function onPasswordSuccessfullyChanged() {
// Prompt to change the wallet password of the logged-in user
if (usersDetailPage.user.loggedIn && usersDetailPage.user.usesDefaultWallet()) {
changeWalletPassword.open()
}
}
}
Connections {
target: kcm
function onApply() {
errorMessage.visible = false
usersDetailPage.user.realName = realNametextField.text
usersDetailPage.user.email = emailTextField.text
usersDetailPage.user.name = userNameField.text
usersDetailPage.user.administrator = (usertypeBox.model[usertypeBox.currentIndex]["type"] == "administrator")
user.apply()
usersDetailPage.overrideImage = false
usersDetailPage.oldImage = ""
}
function onReset() {
errorMessage.visible = false
realNametextField.text = usersDetailPage.user.realName
emailTextField.text = usersDetailPage.user.email
userNameField.text = usersDetailPage.user.name
usertypeBox.currentIndex = usersDetailPage.user.administrator ? 1 : 0
if (usersDetailPage.oldImage != "") {
usersDetailPage.overrideImage = false
usersDetailPage.user.face = usersDetailPage.oldImage
}
}
}
function resolvePending() {
let pending = false
let user = usersDetailPage.user
pending = pending || user.realName != realNametextField.text
pending = pending || user.email != emailTextField.text
pending = pending || user.name != userNameField.text
pending = pending || user.administrator != (usertypeBox.model[usertypeBox.currentIndex]["type"] == "administrator")
pending = pending || usersDetailPage.overrideImage
return pending
}
Component.onCompleted: {
kcm.needsSave = Qt.binding(resolvePending)
}
ColumnLayout {
Kirigami.InlineMessage {
id: errorMessage
visible: false
type: Kirigami.MessageType.Error
Layout.fillWidth: true
}
Kirigami.Avatar {
readonly property int size: 6 * Kirigami.Units.gridUnit
Layout.preferredWidth: size
Layout.preferredHeight: size
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: Kirigami.Units.largeSpacing
source: usersDetailPage.user.face
cache: false
name: user.realName
actions {
main: Kirigami.Action {
text: i18n("Change avatar")
onTriggered: {
const component = Qt.createComponent("PicturesSheet.qml")
component.incubateObject(usersDetailPage, {
"parent": usersDetailPage,
})
component.destroy()
}
}
}
}
Kirigami.FormLayout {
QQC2.TextField {
id: realNametextField
focus: true
text: user.realName
Kirigami.FormData.label: i18n("Name:")
}
QQC2.TextField {
id: userNameField
focus: true
text: user.name
Kirigami.FormData.label: i18n("Username:")
}
QQC2.ComboBox {
id: usertypeBox
textRole: "label"
model: [
{ "type": "standard", "label": i18n("Standard") },
{ "type": "administrator", "label": i18n("Administrator") },
]
Kirigami.FormData.label: i18n("Account type:")
currentIndex: user.administrator ? 1 : 0
}
QQC2.TextField {
id: emailTextField
focus: true
text: user.email
Kirigami.FormData.label: i18n("Email address:")
}
QQC2.Button {
text: i18n("Change Password")
onClicked: {
changePassword.account = user
changePassword.openAndClear()
}
}
Item {
Layout.preferredHeight: deleteUser.height
}
QQC2.Button {
id: deleteUser
enabled: !usersDetailPage.user.loggedIn && (!kcm.userModel.rowCount() < 2)
QQC2.Menu {
id: deleteMenu
modal: true
QQC2.MenuItem {
text: i18n("Delete files")
icon.name: "edit-delete-shred"
onClicked: {
kcm.mainUi.deleteUser(usersDetailPage.user.uid, true)
}
}
QQC2.MenuItem {
text: i18n("Keep files")
icon.name: "document-multiple"
onClicked: {
kcm.mainUi.deleteUser(usersDetailPage.user.uid, false)
}
}
}
text: i18n("Delete User…")
icon.name: "edit-delete"
onClicked: deleteMenu.open()
}
}
QQC2.Button {
Layout.topMargin: deleteUser.height
Layout.alignment: Qt.AlignHCenter
flat: false
visible: kcm.fingerprintModel.deviceFound
text: i18n("Configure Fingerprint Authentication…")
icon.name: "fingerprint-gui"
onClicked: {
fingerprintDialog.account = user;
fingerprintDialog.openAndClear();
}
}
QQC2.Label {
Layout.fillWidth: true
Layout.leftMargin: Kirigami.Units.largeSpacing * 2
Layout.rightMargin: Kirigami.Units.largeSpacing * 2
visible: kcm.fingerprintModel.deviceFound
text: xi18nc("@info", "Fingerprints can be used in place of a password when unlocking the screen and providing administrator permissions to applications and command-line programs that request them.<nl/><nl/>Logging into the system with your fingerprint is not yet supported.")
font: Kirigami.Theme.smallFont
wrapMode: Text.Wrap
}
}
ChangePassword { id: changePassword; account: user }
ChangeWalletPassword { id: changeWalletPassword }
FingerprintDialog { id: fingerprintDialog; account: user }
}
|