Allow the avatar to be changed

This Merge Request allows an avatar to be set through the userEditSheet
The parts in controller.cpp decode the url and check whether the image
is valid, through qimagereader.
This commit is contained in:
Arnav Rawat
2021-03-05 00:31:44 +00:00
committed by Carl Schwan
parent a9678b6fc3
commit b6787ae242
3 changed files with 85 additions and 17 deletions

View File

@@ -7,10 +7,12 @@
import QtQuick 2.14 import QtQuick 2.14
import QtQuick.Controls 2.14 as Controls import QtQuick.Controls 2.14 as Controls
import QtQuick.Layouts 1.14 import QtQuick.Layouts 1.14
import Qt.labs.platform 1.1
import org.kde.kirigami 2.12 as Kirigami import org.kde.kirigami 2.13 as Kirigami
import org.kde.neochat 1.0 import org.kde.neochat 1.0
import NeoChat.Dialog 1.0
Kirigami.ScrollablePage { Kirigami.ScrollablePage {
title: i18n("Accounts") title: i18n("Accounts")
@@ -29,7 +31,7 @@ Kirigami.ScrollablePage {
text: model.user.displayName text: model.user.displayName
subtitle: model.user.id subtitle: model.user.id
icon: model.connection.user.avatarMediaId ? "image://mxc/" + model.connection.user.avatarMediaId : "im-user" icon: model.user.avatarMediaId ? ("image://mxc/" + model.user.avatarMediaId) : "im-user"
onClicked: { onClicked: {
Controller.activeConnection = model.connection Controller.activeConnection = model.connection
@@ -80,6 +82,14 @@ Kirigami.ScrollablePage {
onTriggered: pageStack.layers.push("qrc:/imports/NeoChat/Page/WelcomePage.qml") onTriggered: pageStack.layers.push("qrc:/imports/NeoChat/Page/WelcomePage.qml")
} }
Component {
id: openFileDialog
OpenFileDialog {
folder: StandardPaths.writableLocation(StandardPaths.PicturesLocation)
}
}
Kirigami.OverlaySheet { Kirigami.OverlaySheet {
id: userEditSheet id: userEditSheet
@@ -91,6 +101,32 @@ Kirigami.ScrollablePage {
Kirigami.FormLayout { Kirigami.FormLayout {
anchors.top: passwordsMessage.bottom anchors.top: passwordsMessage.bottom
RowLayout {
Kirigami.Avatar {
id: avatar
source: userEditSheet.connection.localUser.avatarMediaId ? ("image://mxc/" + userEditSheet.connection.localUser.avatarMediaId) : ""
MouseArea {
anchors.fill: parent
onClicked: {
const fileDialog = openFileDialog.createObject(Controls.ApplicationWindow.Overlay)
fileDialog.chosen.connect(function(receivedSource) {
if (!receivedSource) return
parent.source = receivedSource
})
fileDialog.open()
}
}
}
Controls.Button {
visible: avatar.source.length !== 0
icon.name: "edit-clear"
onClicked: avatar.source = ""
}
Kirigami.FormData.label: i18n("Avatar:")
}
Controls.TextField { Controls.TextField {
id: name id: name
text: userEditSheet.connection.localUser.displayName text: userEditSheet.connection.localUser.displayName
@@ -113,23 +149,37 @@ Kirigami.ScrollablePage {
echoMode: TextInput.Password echoMode: TextInput.Password
} }
Controls.Button { RowLayout {
text: i18n("Save") Controls.Button {
onClicked: { text: i18n("Save")
if(userEditSheet.connection.localUser.displayName !== name.text) onClicked: {
userEditSheet.connection.localUser.rename(name.text) if(!Controller.setAvatar(userEditSheet.connection, avatar.source))
if(currentPassword.text !== "" && newPassword.text !== "" && confirmPassword.text !== "") { showPassiveNotification("The Avatar could not be set")
if(newPassword.text === confirmPassword.text) { if(userEditSheet.connection.localUser.displayName !== name.text)
Controller.changePassword(userEditSheet.connection, currentPassword.text, newPassword.text) userEditSheet.connection.localUser.rename(name.text)
} else { if(currentPassword.text !== "" && newPassword.text !== "" && confirmPassword.text !== "") {
showPassiveNotification(i18n("Passwords do not match")) if(newPassword.text === confirmPassword.text) {
return 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 = ""
} }
userEditSheet.close()
currentPassword.text = ""
newPassword.text = ""
confirmPassword.text = ""
} }
} }
} }

View File

@@ -441,6 +441,22 @@ void Controller::changePassword(Connection *connection, const QString &currentPa
}); });
} }
bool Controller::setAvatar(Connection *connection, const QUrl &avatarSource)
{
User *localUser = connection->user();
QString decoded = avatarSource.path();
if (decoded.isEmpty()) {
connection->callApi<SetAvatarUrlJob>(localUser->id(), "");
return true;
}
if (QImageReader(decoded).read().isNull()) {
return false;
}
else {
return localUser->setAvatar(decoded);
}
}
NeochatChangePasswordJob::NeochatChangePasswordJob(const QString &newPassword, bool logoutDevices, const Omittable<QJsonObject> &auth) NeochatChangePasswordJob::NeochatChangePasswordJob(const QString &newPassword, bool logoutDevices, const Omittable<QJsonObject> &auth)
: BaseJob(HttpVerb::Post, QStringLiteral("ChangePasswordJob"), QStringLiteral("/_matrix/client/r0") % "/account/password") : BaseJob(HttpVerb::Post, QStringLiteral("ChangePasswordJob"), QStringLiteral("/_matrix/client/r0") % "/account/password")
{ {

View File

@@ -50,6 +50,8 @@ public:
Q_INVOKABLE void changePassword(Quotient::Connection *connection, const QString &currentPassword, const QString &newPassword); Q_INVOKABLE void changePassword(Quotient::Connection *connection, const QString &currentPassword, const QString &newPassword);
Q_INVOKABLE bool setAvatar(Quotient::Connection *connection, const QUrl &avatarSource);
[[nodiscard]] int accountCount() const; [[nodiscard]] int accountCount() const;
[[nodiscard]] static bool quitOnLastWindowClosed(); [[nodiscard]] static bool quitOnLastWindowClosed();