Cleanup account page
- Fix small padding on the right when they is not enough elements for a scrollbar to appear (possibly due to a kirigami regression) - Move account editor to a seperate page - Cleanup a bit the code style - Add tooltip to toolbuttons Signed-off-by: Carl Schwan <carl@carlschwan.eu>
This commit is contained in:
130
imports/NeoChat/Settings/AccountEditorPage.qml
Normal file
130
imports/NeoChat/Settings/AccountEditorPage.qml
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
// SPDX-FileCopyrightText: 2020 Tobias Fella <fella@posteo.de>
|
||||||
|
// SPDX-FileCopyrightText: 2022 Carl Schwan <carl@carlschwan.eu>
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
import QtQuick 2.15
|
||||||
|
import QtQuick.Controls 2.15 as Controls
|
||||||
|
import QtQuick.Layouts 1.15
|
||||||
|
import Qt.labs.platform 1.1
|
||||||
|
|
||||||
|
import org.kde.kirigami 2.15 as Kirigami
|
||||||
|
|
||||||
|
import org.kde.neochat 1.0
|
||||||
|
import NeoChat.Dialog 1.0
|
||||||
|
|
||||||
|
Kirigami.ScrollablePage {
|
||||||
|
id: root
|
||||||
|
title: i18n("Edit Account")
|
||||||
|
property var connection
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
Kirigami.FormLayout {
|
||||||
|
RowLayout {
|
||||||
|
Kirigami.Avatar {
|
||||||
|
id: avatar
|
||||||
|
source: root.connection && root.connection.localUser.avatarMediaId ? ("image://mxc/" + root.connection.localUser.avatarMediaId) : ""
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
property var fileDialog: null;
|
||||||
|
onClicked: {
|
||||||
|
if (fileDialog != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fileDialog = openFileDialog.createObject(Controls.ApplicationWindow.Overlay)
|
||||||
|
|
||||||
|
fileDialog.chosen.connect(function(receivedSource) {
|
||||||
|
mouseArea.fileDialog = null;
|
||||||
|
if (!receivedSource) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
parent.source = receivedSource;
|
||||||
|
});
|
||||||
|
fileDialog.onRejected.connect(function() {
|
||||||
|
mouseArea.fileDialog = null;
|
||||||
|
});
|
||||||
|
fileDialog.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Controls.Button {
|
||||||
|
visible: avatar.source.toString().length !== 0
|
||||||
|
icon.name: "edit-clear"
|
||||||
|
|
||||||
|
onClicked: avatar.source = ""
|
||||||
|
}
|
||||||
|
Kirigami.FormData.label: i18n("Avatar:")
|
||||||
|
}
|
||||||
|
Controls.TextField {
|
||||||
|
id: name
|
||||||
|
text: root.connection ? root.connection.localUser.displayName : ""
|
||||||
|
Kirigami.FormData.label: i18n("Name:")
|
||||||
|
}
|
||||||
|
Controls.TextField {
|
||||||
|
id: accountLabel
|
||||||
|
text: root.connection ? root.connection.localUser.accountLabel : ""
|
||||||
|
Kirigami.FormData.label: i18n("Label:")
|
||||||
|
}
|
||||||
|
Controls.TextField {
|
||||||
|
id: currentPassword
|
||||||
|
Kirigami.FormData.label: i18n("Current Password:")
|
||||||
|
enabled: roto.connection !== undefined && root.connection.canChangePassword !== false
|
||||||
|
echoMode: TextInput.Password
|
||||||
|
}
|
||||||
|
Controls.TextField {
|
||||||
|
id: newPassword
|
||||||
|
Kirigami.FormData.label: i18n("New Password:")
|
||||||
|
enabled: root.connection !== undefined && root.connection.canChangePassword !== false
|
||||||
|
echoMode: TextInput.Password
|
||||||
|
|
||||||
|
}
|
||||||
|
Controls.TextField {
|
||||||
|
id: confirmPassword
|
||||||
|
Kirigami.FormData.label: i18n("Confirm new Password:")
|
||||||
|
enabled: root.connection !== undefined && root.connection.canChangePassword !== false
|
||||||
|
echoMode: TextInput.Password
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer: RowLayout {
|
||||||
|
Item {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Controls.Button {
|
||||||
|
text: i18n("Save")
|
||||||
|
Layout.bottomMargin: Kirigami.Units.smallSpacing
|
||||||
|
Layout.topMargin: Kirigami.Units.smallSpacing
|
||||||
|
onClicked: {
|
||||||
|
if (!Controller.setAvatar(root.connection, avatar.source)) {
|
||||||
|
showPassiveNotification("The Avatar could not be set");
|
||||||
|
}
|
||||||
|
if (root.connection.localUser.displayName !== name.text) {
|
||||||
|
root.connection.localUser.rename(name.text);
|
||||||
|
}
|
||||||
|
if (root.connection.localUser.accountLabel !== accountLabel.text) {
|
||||||
|
root.connection.localUser.setAccountLabel(accountLabel.text);
|
||||||
|
}
|
||||||
|
if(currentPassword.text !== "" && newPassword.text !== "" && confirmPassword.text !== "") {
|
||||||
|
if(newPassword.text === confirmPassword.text) {
|
||||||
|
Controller.changePassword(root.connection, currentPassword.text, newPassword.text);
|
||||||
|
} else {
|
||||||
|
showPassiveNotification(i18n("Passwords do not match"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
root.closeDialog();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Controls.Button {
|
||||||
|
text: i18n("Cancel")
|
||||||
|
Layout.rightMargin: Kirigami.Units.smallSpacing
|
||||||
|
Layout.bottomMargin: Kirigami.Units.smallSpacing
|
||||||
|
Layout.topMargin: Kirigami.Units.smallSpacing
|
||||||
|
onClicked: root.closeDialog();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@ Kirigami.ScrollablePage {
|
|||||||
|
|
||||||
ListView {
|
ListView {
|
||||||
model: AccountRegistry
|
model: AccountRegistry
|
||||||
|
anchors.fill: parent
|
||||||
delegate: Kirigami.BasicListItem {
|
delegate: Kirigami.BasicListItem {
|
||||||
text: model.connection.localUser.displayName
|
text: model.connection.localUser.displayName
|
||||||
labelItem.textFormat: Text.PlainText
|
labelItem.textFormat: Text.PlainText
|
||||||
@@ -30,31 +31,39 @@ Kirigami.ScrollablePage {
|
|||||||
icon: model.connection.localUser.avatarMediaId ? ("image://mxc/" + model.connection.localUser.avatarMediaId) : "im-user"
|
icon: model.connection.localUser.avatarMediaId ? ("image://mxc/" + model.connection.localUser.avatarMediaId) : "im-user"
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
Controller.activeConnection = model.connection
|
Controller.activeConnection = model.connection;
|
||||||
pageStack.layers.pop()
|
pageStack.layers.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
trailing: RowLayout {
|
trailing: RowLayout {
|
||||||
Controls.ToolButton {
|
Controls.ToolButton {
|
||||||
display: Controls.AbstractButton.IconOnly
|
display: Controls.AbstractButton.IconOnly
|
||||||
|
Controls.ToolTip {
|
||||||
|
text: parent.action.text
|
||||||
|
}
|
||||||
action: Kirigami.Action {
|
action: Kirigami.Action {
|
||||||
text: i18n("Edit this account")
|
text: i18n("Edit this account")
|
||||||
iconName: "document-edit"
|
iconName: "document-edit"
|
||||||
onTriggered: {
|
onTriggered: pageSettingStack.pushDialogLayer(Qt.resolvedUrl('./AccountEditorPage.qml'), {
|
||||||
userEditSheet.connection = model.connection
|
connection: model.connection
|
||||||
userEditSheet.open()
|
}, {
|
||||||
}
|
title: i18n('Account editor')
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Controls.ToolButton {
|
Controls.ToolButton {
|
||||||
display: Controls.AbstractButton.IconOnly
|
display: Controls.AbstractButton.IconOnly
|
||||||
|
Controls.ToolTip {
|
||||||
|
text: parent.action.text
|
||||||
|
}
|
||||||
action: Kirigami.Action {
|
action: Kirigami.Action {
|
||||||
text: i18n("Logout")
|
text: i18n("Logout")
|
||||||
iconName: "im-kick-user"
|
iconName: "im-kick-user"
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
Controller.logout(model.connection, true)
|
Controller.logout(model.connection, true);
|
||||||
if(Controller.accountCount === 1)
|
if (Controller.accountCount === 1) {
|
||||||
pageStack.layers.pop()
|
pageStack.layers.pop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,141 +85,29 @@ Kirigami.ScrollablePage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Connections {
|
|
||||||
|
property Connections connection: Connections {
|
||||||
target: Controller
|
target: Controller
|
||||||
function onConnectionAdded() {
|
function onConnectionAdded() {
|
||||||
if (pageStack.layers.depth > 2)
|
if (pageStack.layers.depth > 2)
|
||||||
pageStack.layers.pop()
|
pageStack.layers.pop()
|
||||||
}
|
}
|
||||||
function onPasswordStatus(status) {
|
function onPasswordStatus(status) {
|
||||||
if(status == Controller.Success)
|
if (status === Controller.Success) {
|
||||||
showPassiveNotification(i18n("Password changed successfully"))
|
showPassiveNotification(i18n("Password changed successfully"));
|
||||||
else if(status == Controller.Wrong)
|
} else if (status === Controller.Wrong) {
|
||||||
showPassiveNotification(i18n("Wrong password entered"))
|
showPassiveNotification(i18n("Wrong password entered"));
|
||||||
else
|
} else {
|
||||||
showPassiveNotification(i18n("Unknown problem while trying to change password"))
|
showPassiveNotification(i18n("Unknown problem while trying to change password"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Component {
|
property Component openFileDialog: Component {
|
||||||
id: openFileDialog
|
id: openFileDialog
|
||||||
|
|
||||||
OpenFileDialog {
|
OpenFileDialog {
|
||||||
folder: StandardPaths.writableLocation(StandardPaths.PicturesLocation)
|
folder: StandardPaths.writableLocation(StandardPaths.PicturesLocation)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Kirigami.OverlaySheet {
|
|
||||||
id: userEditSheet
|
|
||||||
|
|
||||||
property var connection
|
|
||||||
|
|
||||||
title: i18n("Edit Account")
|
|
||||||
|
|
||||||
Kirigami.FormLayout {
|
|
||||||
RowLayout {
|
|
||||||
Kirigami.Avatar {
|
|
||||||
id: avatar
|
|
||||||
source: userEditSheet.connection && userEditSheet.connection.localUser.avatarMediaId ? ("image://mxc/" + userEditSheet.connection.localUser.avatarMediaId) : ""
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
id: mouseArea
|
|
||||||
anchors.fill: parent
|
|
||||||
property var fileDialog: null;
|
|
||||||
onClicked: {
|
|
||||||
if (fileDialog != null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fileDialog = openFileDialog.createObject(Controls.ApplicationWindow.Overlay)
|
|
||||||
|
|
||||||
fileDialog.chosen.connect(function(receivedSource) {
|
|
||||||
mouseArea.fileDialog = null;
|
|
||||||
if (!receivedSource) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
parent.source = receivedSource;
|
|
||||||
});
|
|
||||||
fileDialog.onRejected.connect(function() {
|
|
||||||
mouseArea.fileDialog = null;
|
|
||||||
});
|
|
||||||
fileDialog.open();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Controls.Button {
|
|
||||||
visible: avatar.source.toString().length !== 0
|
|
||||||
icon.name: "edit-clear"
|
|
||||||
|
|
||||||
onClicked: avatar.source = ""
|
|
||||||
}
|
|
||||||
Kirigami.FormData.label: i18n("Avatar:")
|
|
||||||
}
|
|
||||||
Controls.TextField {
|
|
||||||
id: name
|
|
||||||
text: userEditSheet.connection ? userEditSheet.connection.localUser.displayName : ""
|
|
||||||
Kirigami.FormData.label: i18n("Name:")
|
|
||||||
}
|
|
||||||
Controls.TextField {
|
|
||||||
id: accountLabel
|
|
||||||
text: userEditSheet.connection ? userEditSheet.connection.localUser.accountLabel : ""
|
|
||||||
Kirigami.FormData.label: i18n("Label:")
|
|
||||||
}
|
|
||||||
Controls.TextField {
|
|
||||||
id: currentPassword
|
|
||||||
Kirigami.FormData.label: i18n("Current Password:")
|
|
||||||
enabled: userEditSheet.connection !== undefined && userEditSheet.connection.canChangePassword !== false
|
|
||||||
echoMode: TextInput.Password
|
|
||||||
}
|
|
||||||
Controls.TextField {
|
|
||||||
id: newPassword
|
|
||||||
Kirigami.FormData.label: i18n("New Password:")
|
|
||||||
enabled: userEditSheet.connection !== undefined && userEditSheet.connection.canChangePassword !== false
|
|
||||||
echoMode: TextInput.Password
|
|
||||||
|
|
||||||
}
|
|
||||||
Controls.TextField {
|
|
||||||
id: confirmPassword
|
|
||||||
Kirigami.FormData.label: i18n("Confirm new Password:")
|
|
||||||
enabled: userEditSheet.connection !== undefined && userEditSheet.connection.canChangePassword !== false
|
|
||||||
echoMode: TextInput.Password
|
|
||||||
}
|
|
||||||
|
|
||||||
RowLayout {
|
|
||||||
Controls.Button {
|
|
||||||
text: i18n("Save")
|
|
||||||
onClicked: {
|
|
||||||
if(!Controller.setAvatar(userEditSheet.connection, avatar.source))
|
|
||||||
showPassiveNotification("The Avatar could not be set")
|
|
||||||
if(userEditSheet.connection.localUser.displayName !== name.text)
|
|
||||||
userEditSheet.connection.localUser.rename(name.text)
|
|
||||||
if(userEditSheet.connection.localUser.accountLabel !== accountLabel.text)
|
|
||||||
userEditSheet.connection.localUser.setAccountLabel(accountLabel.text)
|
|
||||||
if(currentPassword.text !== "" && newPassword.text !== "" && confirmPassword.text !== "") {
|
|
||||||
if(newPassword.text === confirmPassword.text) {
|
|
||||||
Controller.changePassword(userEditSheet.connection, currentPassword.text, newPassword.text)
|
|
||||||
} else {
|
|
||||||
showPassiveNotification(i18n("Passwords do not match"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
userEditSheet.close()
|
|
||||||
currentPassword.text = ""
|
|
||||||
newPassword.text = ""
|
|
||||||
confirmPassword.text = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Controls.Button {
|
|
||||||
text: i18n("Cancel")
|
|
||||||
onClicked: {
|
|
||||||
userEditSheet.close()
|
|
||||||
avatar.source = userEditSheet.connection.localUser.avatarMediaId ? ("image://mxc/" + userEditSheet.connection.localUser.avatarMediaId) : ""
|
|
||||||
currentPassword.text = ""
|
|
||||||
newPassword.text = ""
|
|
||||||
confirmPassword.text = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ Kirigami.ScrollablePage {
|
|||||||
id: devices
|
id: devices
|
||||||
}
|
}
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
Kirigami.PlaceholderMessage {
|
Kirigami.PlaceholderMessage {
|
||||||
visible: parent.model.count === 0 // We can assume 0 means loading since there is at least one device
|
visible: parent.model.count === 0 // We can assume 0 means loading since there is at least one device
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
|
|||||||
@@ -19,9 +19,10 @@ Kirigami.ScrollablePage {
|
|||||||
title: i18nc('@title:window', 'Custom Emojis')
|
title: i18nc('@title:window', 'Custom Emojis')
|
||||||
|
|
||||||
ListView {
|
ListView {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
model: CustomEmojiModel {
|
model: CustomEmojiModel {
|
||||||
id: emojiModel
|
id: emojiModel
|
||||||
|
|
||||||
connection: Controller.activeConnection
|
connection: Controller.activeConnection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user