From 83957d7ca3c5e87e382f9392d75176d550ba01a5 Mon Sep 17 00:00:00 2001 From: Black Hat Date: Sun, 6 Oct 2019 23:34:21 -0700 Subject: [PATCH] Per-room avatar and displayname. --- .../Component/Timeline/AudioDelegate.qml | 4 +-- .../Component/Timeline/FileDelegate.qml | 4 +-- .../Component/Timeline/ImageDelegate.qml | 4 +-- .../Component/Timeline/MessageDelegate.qml | 4 +-- .../Component/Timeline/StateDelegate.qml | 2 +- .../Component/Timeline/VideoDelegate.qml | 4 +-- imports/Spectral/Dialog/UserDetailDialog.qml | 23 +++++++---------- src/messageeventmodel.cpp | 25 +++++++++++++------ src/userlistmodel.cpp | 2 +- 9 files changed, 39 insertions(+), 33 deletions(-) diff --git a/imports/Spectral/Component/Timeline/AudioDelegate.qml b/imports/Spectral/Component/Timeline/AudioDelegate.qml index b5b43fc8d..3483476a2 100644 --- a/imports/Spectral/Component/Timeline/AudioDelegate.qml +++ b/imports/Spectral/Component/Timeline/AudioDelegate.qml @@ -17,7 +17,7 @@ import Spectral.Effect 2.0 RowLayout { readonly property bool avatarVisible: !sentByMe && showAuthor - readonly property bool sentByMe: author === currentRoom.localUser + readonly property bool sentByMe: author.isLocalUser id: root @@ -46,7 +46,7 @@ RowLayout { circular: true - onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author}).open() + onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author.object, "displayName": author.displayName, "avatarMediaId": author.avatarMediaId, "avatarUrl": author.avatarUrl}).open() } } diff --git a/imports/Spectral/Component/Timeline/FileDelegate.qml b/imports/Spectral/Component/Timeline/FileDelegate.qml index 616b4d85d..dd4a81760 100644 --- a/imports/Spectral/Component/Timeline/FileDelegate.qml +++ b/imports/Spectral/Component/Timeline/FileDelegate.qml @@ -16,7 +16,7 @@ import Spectral.Effect 2.0 RowLayout { readonly property bool avatarVisible: !sentByMe && showAuthor - readonly property bool sentByMe: author === currentRoom.localUser + readonly property bool sentByMe: author.isLocalUser property bool openOnFinished: false readonly property bool downloaded: progressInfo && progressInfo.completed @@ -50,7 +50,7 @@ RowLayout { circular: true - onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author}).open() + onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author.object, "displayName": author.displayName, "avatarMediaId": author.avatarMediaId, "avatarUrl": author.avatarUrl}).open() } } diff --git a/imports/Spectral/Component/Timeline/ImageDelegate.qml b/imports/Spectral/Component/Timeline/ImageDelegate.qml index aa1d195f9..3432822ca 100644 --- a/imports/Spectral/Component/Timeline/ImageDelegate.qml +++ b/imports/Spectral/Component/Timeline/ImageDelegate.qml @@ -16,7 +16,7 @@ import Spectral.Font 0.1 RowLayout { readonly property bool avatarVisible: showAuthor && !sentByMe - readonly property bool sentByMe: author === currentRoom.localUser + readonly property bool sentByMe: author.isLocalUser readonly property bool isAnimated: contentType === "image/gif" property bool openOnFinished: false @@ -56,7 +56,7 @@ RowLayout { circular: true - onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author}).open() + onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author.object, "displayName": author.displayName, "avatarMediaId": author.avatarMediaId, "avatarUrl": author.avatarUrl}).open() } } diff --git a/imports/Spectral/Component/Timeline/MessageDelegate.qml b/imports/Spectral/Component/Timeline/MessageDelegate.qml index 5602314eb..47b185bd4 100644 --- a/imports/Spectral/Component/Timeline/MessageDelegate.qml +++ b/imports/Spectral/Component/Timeline/MessageDelegate.qml @@ -13,7 +13,7 @@ import Spectral.Effect 2.0 ColumnLayout { readonly property bool avatarVisible: !sentByMe && showAuthor - readonly property bool sentByMe: author === currentRoom.localUser + readonly property bool sentByMe: author.isLocalUser readonly property bool darkBackground: !sentByMe readonly property bool replyVisible: reply || false readonly property bool failed: marks === EventStatus.SendingFailed @@ -57,7 +57,7 @@ ColumnLayout { circular: true - onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author}).open() + onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author.object, "displayName": author.displayName, "avatarMediaId": author.avatarMediaId, "avatarUrl": author.avatarUrl}).open() } } diff --git a/imports/Spectral/Component/Timeline/StateDelegate.qml b/imports/Spectral/Component/Timeline/StateDelegate.qml index 1ce522a02..001c1d74c 100644 --- a/imports/Spectral/Component/Timeline/StateDelegate.qml +++ b/imports/Spectral/Component/Timeline/StateDelegate.qml @@ -46,7 +46,7 @@ Control { circular: true - onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author}).open() + onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author.object, "displayName": author.displayName, "avatarMediaId": author.avatarMediaId, "avatarUrl": author.avatarUrl}).open() } } diff --git a/imports/Spectral/Component/Timeline/VideoDelegate.qml b/imports/Spectral/Component/Timeline/VideoDelegate.qml index bcc4bc56b..3a595ddf5 100644 --- a/imports/Spectral/Component/Timeline/VideoDelegate.qml +++ b/imports/Spectral/Component/Timeline/VideoDelegate.qml @@ -17,7 +17,7 @@ import Spectral.Font 0.1 RowLayout { readonly property bool avatarVisible: showAuthor && !sentByMe - readonly property bool sentByMe: author === currentRoom.localUser + readonly property bool sentByMe: author.isLocalUser property bool openOnFinished: false property bool playOnFinished: false @@ -67,7 +67,7 @@ RowLayout { circular: true - onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author}).open() + onClicked: userDetailDialog.createObject(ApplicationWindow.overlay, {"room": currentRoom, "user": author.object, "displayName": author.displayName, "avatarMediaId": author.avatarMediaId, "avatarUrl": author.avatarUrl}).open() } } diff --git a/imports/Spectral/Dialog/UserDetailDialog.qml b/imports/Spectral/Dialog/UserDetailDialog.qml index bfe21d2ed..a7e42921d 100644 --- a/imports/Spectral/Dialog/UserDetailDialog.qml +++ b/imports/Spectral/Dialog/UserDetailDialog.qml @@ -10,6 +10,10 @@ Dialog { property var room property var user + property string displayName: user.displayName + property string avatarMediaId: user.avatarMediaId + property string avatarUrl: user.avatarUrl + anchors.centerIn: parent width: 360 @@ -27,8 +31,8 @@ Dialog { Layout.preferredWidth: 72 Layout.preferredHeight: 72 - hint: user.displayName - source: user.avatarMediaId + hint: displayName + source: avatarMediaId RippleEffect { anchors.fill: parent @@ -36,8 +40,8 @@ Dialog { circular: true onPrimaryClicked: { - if (user.avatarMediaId) { - fullScreenImage.createObject(parent, {"filename": user.diaplayName, "localPath": room.urlToMxcUrl(user.avatarUrl)}).showFullScreen() + if (avatarMediaId) { + fullScreenImage.createObject(parent, {"filename": displayName, "localPath": room.urlToMxcUrl(avatarUrl)}).showFullScreen() } } } @@ -54,19 +58,10 @@ Dialog { elide: Text.ElideRight wrapMode: Text.NoWrap - text: user.displayName + text: displayName color: MPalette.foreground } - Label { - Layout.fillWidth: true - - visible: user.bridgeName - - text: user.bridgeName - color: MPalette.lighter - } - Label { Layout.fillWidth: true diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp index df47f9a2b..fa2978c3f 100644 --- a/src/messageeventmodel.cpp +++ b/src/messageeventmodel.cpp @@ -269,6 +269,18 @@ int MessageEventModel::rowCount(const QModelIndex& parent) const { return m_currentRoom->timelineSize(); } +inline QVariantMap userAtEvent(SpectralUser* user, SpectralRoom* room, const RoomEvent& evt) { + return QVariantMap{ + {"isLocalUser", user->id() == room->localUser()->id()}, + {"id", user->id()}, + {"avatarMediaId", user->avatarMediaId(room)}, + {"avatarUrl", user->avatarUrl(room)}, + {"displayName", user->displayname(room)}, + {"color", user->color()}, + {"object", QVariant::fromValue(user)}, + }; +} + QVariant MessageEventModel::data(const QModelIndex& idx, int role) const { const auto row = idx.row(); @@ -328,9 +340,9 @@ QVariant MessageEventModel::data(const QModelIndex& idx, int role) const { return EventTypeRegistry::getMatrixType(evt.type()); if (role == AuthorRole) { - // FIXME: It shouldn't be User, it should be its state "as of event" - return QVariant::fromValue(isPending ? m_currentRoom->localUser() - : m_currentRoom->user(evt.senderId())); + auto author = static_cast(isPending ? m_currentRoom->localUser() + : m_currentRoom->user(evt.senderId())); + return userAtEvent(author, m_currentRoom, evt); } if (role == ContentTypeRole) { @@ -444,7 +456,7 @@ QVariant MessageEventModel::data(const QModelIndex& idx, int role) const { {"eventId", replyEventId}, {"display", m_currentRoom->eventToString(replyEvt, Qt::RichText)}, {"author", - QVariant::fromValue(m_currentRoom->user(replyEvt.senderId()))}}; + userAtEvent(static_cast(m_currentRoom->user(replyEvt.senderId())), m_currentRoom, evt)}}; } if (role == ShowAuthorRole) { @@ -522,12 +534,11 @@ QVariant MessageEventModel::data(const QModelIndex& idx, int role) const { } QVariantList res = {}; - QMap>::const_iterator i = - reactions.constBegin(); + auto i = reactions.constBegin(); while (i != reactions.constEnd()) { QVariantList authors; for (auto author : i.value()) { - authors.append(QVariant::fromValue(author)); + authors.append(userAtEvent(author, m_currentRoom, evt)); } bool hasLocalUser = i.value().contains( static_cast(m_currentRoom->localUser())); diff --git a/src/userlistmodel.cpp b/src/userlistmodel.cpp index f711584b3..e7d088a22 100644 --- a/src/userlistmodel.cpp +++ b/src/userlistmodel.cpp @@ -73,7 +73,7 @@ QVariant UserListModel::data(const QModelIndex& index, int role) const { return user->id(); } if (role == AvatarRole) { - return user->avatarMediaId(); + return user->avatarMediaId(m_currentRoom); } if (role == ObjectRole) { return QVariant::fromValue(user);