diff --git a/imports/NeoChat/Settings/AccountEditorPage.qml b/imports/NeoChat/Settings/AccountEditorPage.qml new file mode 100644 index 000000000..564a9f953 --- /dev/null +++ b/imports/NeoChat/Settings/AccountEditorPage.qml @@ -0,0 +1,130 @@ +// SPDX-FileCopyrightText: 2020 Tobias Fella +// SPDX-FileCopyrightText: 2022 Carl Schwan +// 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(); + } + } +} diff --git a/imports/NeoChat/Settings/AccountsPage.qml b/imports/NeoChat/Settings/AccountsPage.qml index 918a8f8d6..8c3064fb9 100644 --- a/imports/NeoChat/Settings/AccountsPage.qml +++ b/imports/NeoChat/Settings/AccountsPage.qml @@ -23,6 +23,7 @@ Kirigami.ScrollablePage { ListView { model: AccountRegistry + anchors.fill: parent delegate: Kirigami.BasicListItem { text: model.connection.localUser.displayName labelItem.textFormat: Text.PlainText @@ -30,31 +31,39 @@ Kirigami.ScrollablePage { icon: model.connection.localUser.avatarMediaId ? ("image://mxc/" + model.connection.localUser.avatarMediaId) : "im-user" onClicked: { - Controller.activeConnection = model.connection - pageStack.layers.pop() + Controller.activeConnection = model.connection; + pageStack.layers.pop(); } trailing: RowLayout { Controls.ToolButton { display: Controls.AbstractButton.IconOnly + Controls.ToolTip { + text: parent.action.text + } action: Kirigami.Action { text: i18n("Edit this account") iconName: "document-edit" - onTriggered: { - userEditSheet.connection = model.connection - userEditSheet.open() - } + onTriggered: pageSettingStack.pushDialogLayer(Qt.resolvedUrl('./AccountEditorPage.qml'), { + connection: model.connection + }, { + title: i18n('Account editor') + }); } } Controls.ToolButton { display: Controls.AbstractButton.IconOnly + Controls.ToolTip { + text: parent.action.text + } action: Kirigami.Action { text: i18n("Logout") iconName: "im-kick-user" onTriggered: { - Controller.logout(model.connection, true) - if(Controller.accountCount === 1) - pageStack.layers.pop() + Controller.logout(model.connection, true); + if (Controller.accountCount === 1) { + pageStack.layers.pop(); + } } } } @@ -76,141 +85,29 @@ Kirigami.ScrollablePage { } } } - Connections { + + property Connections connection: Connections { target: Controller function onConnectionAdded() { if (pageStack.layers.depth > 2) pageStack.layers.pop() } function onPasswordStatus(status) { - if(status == Controller.Success) - showPassiveNotification(i18n("Password changed successfully")) - else if(status == Controller.Wrong) - showPassiveNotification(i18n("Wrong password entered")) - else - showPassiveNotification(i18n("Unknown problem while trying to change password")) + if (status === Controller.Success) { + showPassiveNotification(i18n("Password changed successfully")); + } else if (status === Controller.Wrong) { + showPassiveNotification(i18n("Wrong password entered")); + } else { + showPassiveNotification(i18n("Unknown problem while trying to change password")); + } } } - Component { + property Component openFileDialog: Component { id: openFileDialog OpenFileDialog { 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 = "" - } - } - } - } - } } diff --git a/imports/NeoChat/Settings/DevicesPage.qml b/imports/NeoChat/Settings/DevicesPage.qml index 1999dba7b..2e77fede1 100644 --- a/imports/NeoChat/Settings/DevicesPage.qml +++ b/imports/NeoChat/Settings/DevicesPage.qml @@ -17,6 +17,8 @@ Kirigami.ScrollablePage { id: devices } + anchors.fill: parent + Kirigami.PlaceholderMessage { visible: parent.model.count === 0 // We can assume 0 means loading since there is at least one device anchors.centerIn: parent diff --git a/imports/NeoChat/Settings/Emoticons.qml b/imports/NeoChat/Settings/Emoticons.qml index da4992faf..c1181f030 100644 --- a/imports/NeoChat/Settings/Emoticons.qml +++ b/imports/NeoChat/Settings/Emoticons.qml @@ -19,9 +19,10 @@ Kirigami.ScrollablePage { title: i18nc('@title:window', 'Custom Emojis') ListView { + anchors.fill: parent + model: CustomEmojiModel { id: emojiModel - connection: Controller.activeConnection }