From 1fdecdcc213fe91711649243a315ebd11809f0f9 Mon Sep 17 00:00:00 2001
From: Loren Burkholder <computersemiexpert@outlook.com>
Date: Fri, 13 Aug 2021 20:05:26 -0400
Subject: [PATCH] Get direct chat jdenticons to line up

---
 resources/qml/RoomList.qml     |  3 +++
 resources/qml/TopBar.qml       |  1 +
 src/timeline/RoomlistModel.cpp |  6 ++++++
 src/timeline/RoomlistModel.h   |  2 ++
 src/timeline/TimelineModel.cpp | 13 +++++++++++++
 src/timeline/TimelineModel.h   |  4 ++++
 6 files changed, 29 insertions(+)

diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index a0009174f..fcb2644e2 100644
--- a/resources/qml/RoomList.qml
+++ b/resources/qml/RoomList.qml
@@ -143,6 +143,8 @@ Page {
             required property int notificationCount
             required property bool hasLoudNotification
             required property bool hasUnreadMessages
+            required property int roomMemberCount
+            required property string directChatAvatarMxid
 
             color: background
             height: avatarSize + 2 * Nheko.paddingMedium
@@ -237,6 +239,7 @@ Page {
                     width: avatarSize
                     url: avatarUrl.replace("mxc://", "image://MxcImage/")
                     displayName: roomName
+                    userid: roomMemberCount < 3 ?  directChatAvatarMxid : roomId
 
                     Rectangle {
                         id: collapsedNotificationBubble
diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml
index 7f67c028d..0b50f7c67 100644
--- a/resources/qml/TopBar.qml
+++ b/resources/qml/TopBar.qml
@@ -65,6 +65,7 @@ Rectangle {
             width: Nheko.avatarSize
             height: Nheko.avatarSize
             url: avatarUrl.replace("mxc://", "image://MxcImage/")
+            userid: room.roomMemberCount < 3 ? room.directChatAvatarMxid : room.roomId
             displayName: roomName
             onClicked: {
                 if (room)
diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp
index 942a4b05c..88411236d 100644
--- a/src/timeline/RoomlistModel.cpp
+++ b/src/timeline/RoomlistModel.cpp
@@ -76,6 +76,8 @@ RoomlistModel::roleNames() const
           {IsSpace, "isSpace"},
           {Tags, "tags"},
           {ParentSpaces, "parentSpaces"},
+          {RoomMemberCount, "roomMemberCount"},
+          {DirectChatAvatarMxid, "directChatAvatarMxid"},
         };
 }
 
@@ -129,6 +131,10 @@ RoomlistModel::data(const QModelIndex &index, int role) const
                                         list.push_back(QString::fromStdString(t));
                                 return list;
                         }
+                        case Roles::RoomMemberCount:
+                                return room->roomMemberCount();
+                        case Roles::DirectChatAvatarMxid:
+                                return room->directChatAvatarMxid();
                         default:
                                 return {};
                         }
diff --git a/src/timeline/RoomlistModel.h b/src/timeline/RoomlistModel.h
index 6ac6da186..aca74ea19 100644
--- a/src/timeline/RoomlistModel.h
+++ b/src/timeline/RoomlistModel.h
@@ -65,6 +65,8 @@ public:
                 IsPreviewFetched,
                 Tags,
                 ParentSpaces,
+                RoomMemberCount,
+                DirectChatAvatarMxid,
         };
 
         RoomlistModel(TimelineViewManager *parent = nullptr);
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 78409e1dc..4daf44f3e 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -2073,3 +2073,16 @@ TimelineModel::roomMemberCount() const
 {
         return (int)cache::client()->memberCount(room_id_.toStdString());
 }
+
+QString
+TimelineModel::directChatAvatarMxid() const
+{
+        if (roomMemberCount() < 3) {
+                QString id;
+                for (auto member : cache::getMembers(room_id_.toStdString()))
+                        if (member.user_id != UserSettings::instance()->userId())
+                                id = member.user_id;
+                return id;
+        } else
+                return "";
+}
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 417fbb7fb..8c34fc1da 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -176,6 +176,8 @@ class TimelineModel : public QAbstractListModel
         Q_PROPERTY(bool isEncrypted READ isEncrypted NOTIFY encryptionChanged)
         Q_PROPERTY(bool isSpace READ isSpace CONSTANT)
         Q_PROPERTY(int trustlevel READ trustlevel NOTIFY trustlevelChanged)
+        Q_PROPERTY(
+          QString directChatAvatarMxid READ directChatAvatarMxid NOTIFY directChatAvatarMxidChanged)
         Q_PROPERTY(InputBar *input READ input CONSTANT)
         Q_PROPERTY(Permissions *permissions READ permissions NOTIFY permissionsChanged)
 
@@ -292,6 +294,7 @@ public:
         bool isEncrypted() const { return isEncrypted_; }
         crypto::Trust trustlevel() const;
         int roomMemberCount() const;
+        QString directChatAvatarMxid() const;
 
         std::optional<mtx::events::collections::TimelineEvents> eventById(const QString &id)
         {
@@ -391,6 +394,7 @@ signals:
         void roomTopicChanged();
         void roomAvatarUrlChanged();
         void roomMemberCountChanged();
+        void directChatAvatarMxidChanged();
         void permissionsChanged();
         void forwardToRoom(mtx::events::collections::TimelineEvents *e, QString roomId);
 
-- 
GitLab