diff --git a/imports/Spectral/Component/FullScreenImage.qml b/imports/Spectral/Component/FullScreenImage.qml index 0caf0a779..9bb380c07 100644 --- a/imports/Spectral/Component/FullScreenImage.qml +++ b/imports/Spectral/Component/FullScreenImage.qml @@ -36,6 +36,8 @@ ApplicationWindow { anchors.top: parent.top anchors.right: parent.right + id: closeButton + width: 64 height: 64 diff --git a/imports/Spectral/Dialog/RoomSettingsDialog.qml b/imports/Spectral/Dialog/RoomSettingsDialog.qml index 6b211301e..0003a71de 100644 --- a/imports/Spectral/Dialog/RoomSettingsDialog.qml +++ b/imports/Spectral/Dialog/RoomSettingsDialog.qml @@ -30,6 +30,24 @@ Dialog { hint: room.displayName source: room.avatarMediaId + + RippleEffect { + anchors.fill: parent + + circular: true + + onClicked: { + var fileDialog = openFileDialog.createObject(ApplicationWindow.overlay) + + fileDialog.chosen.connect(function(path) { + if (!path) return + + room.changeAvatar(path) + }) + + fileDialog.open() + } + } } ColumnLayout { @@ -230,7 +248,7 @@ Dialog { text: "Set background image" onClicked: { - var fileDialog = chatBackgroundDialog.createObject(ApplicationWindow.overlay) + var fileDialog = openFileDialog.createObject(ApplicationWindow.overlay) fileDialog.chosen.connect(function(path) { if (!path) return @@ -262,7 +280,7 @@ Dialog { } Component { - id: chatBackgroundDialog + id: openFileDialog OpenFileDialog {} } diff --git a/src/controller.cpp b/src/controller.cpp index 256f74a15..3d97345e6 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -8,8 +8,10 @@ #include "events/roommessageevent.h" #include "csapi/account-data.h" +#include "csapi/content-repo.h" #include "csapi/joining.h" #include "csapi/logout.h" +#include "csapi/profile.h" #include "utils.h" @@ -310,3 +312,12 @@ int Controller::dpi() { void Controller::setDpi(int dpi) { SettingsGroup("Interface").setValue("dpi", dpi); } + +void Controller::changeAvatar(Connection* conn, QUrl localFile) { + auto job = conn->uploadFile(localFile.toLocalFile()); + if (isJobRunning(job)) { + connect(job, &BaseJob::success, this, [this, conn, job] { + conn->callApi(conn->userId(), job->contentUri()); + }); + } +} diff --git a/src/controller.h b/src/controller.h index a5a4a1012..dafd9c07b 100644 --- a/src/controller.h +++ b/src/controller.h @@ -112,6 +112,7 @@ class Controller : public QObject { void createRoom(Connection* c, const QString& name, const QString& topic); void createDirectChat(Connection* c, const QString& userID); void playAudio(QUrl localFile); + void changeAvatar(Connection* conn, QUrl localFile); }; #endif // CONTROLLER_H diff --git a/src/spectralroom.cpp b/src/spectralroom.cpp index 08de261ae..053574c15 100644 --- a/src/spectralroom.cpp +++ b/src/spectralroom.cpp @@ -6,6 +6,8 @@ #include "csapi/account-data.h" #include "csapi/content-repo.h" #include "csapi/leaving.h" +#include "csapi/room_state.h" +#include "csapi/rooms.h" #include "csapi/typing.h" #include "events/accountdataevents.h" #include "events/typingevent.h" @@ -304,3 +306,13 @@ QString SpectralRoom::backgroundMediaId() { auto url = backgroundUrl(); return url.authority() + url.path(); } + +void SpectralRoom::changeAvatar(QUrl localFile) { + auto job = connection()->uploadFile(localFile.toLocalFile()); + if (isJobRunning(job)) { + connect(job, &BaseJob::success, this, [this, job] { + connection()->callApi( + id(), "m.room.avatar", QJsonObject{{"url", job->contentUri()}}); + }); + } +} diff --git a/src/spectralroom.h b/src/spectralroom.h index 8da631745..7eaa9c15e 100644 --- a/src/spectralroom.h +++ b/src/spectralroom.h @@ -305,6 +305,7 @@ class SpectralRoom : public Room { QString eventId, QString replyContent, QString sendContent); + void changeAvatar(QUrl localFile); }; #endif // SpectralRoom_H