summary refs log tree commit diff
path: root/src/MemberList.cpp
diff options
context:
space:
mode:
authorLoren Burkholder <computersemiexpert@outlook.com>2021-05-29 21:09:21 -0400
committerLoren Burkholder <computersemiexpert@outlook.com>2021-07-20 21:47:05 -0400
commit77a0c574bfc962b6c37426fb16a70ca16c08a3f5 (patch)
tree63bd4a66b761c4afee8e41468551921b7fa32212 /src/MemberList.cpp
parentExplicitly reload data in delegates, if related events got loaded (diff)
downloadnheko-77a0c574bfc962b6c37426fb16a70ca16c08a3f5.tar.xz
QML the room member list
Diffstat (limited to 'src/MemberList.cpp')
-rw-r--r--src/MemberList.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/MemberList.cpp b/src/MemberList.cpp
new file mode 100644
index 00000000..62488277
--- /dev/null
+++ b/src/MemberList.cpp
@@ -0,0 +1,91 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include <QAbstractSlider>
+#include <QLabel>
+#include <QListWidgetItem>
+#include <QPainter>
+#include <QPushButton>
+#include <QScrollBar>
+#include <QShortcut>
+#include <QStyleOption>
+#include <QVBoxLayout>
+
+#include "MemberList.h"
+
+#include "Cache.h"
+#include "ChatPage.h"
+#include "Config.h"
+#include "Logging.h"
+#include "Utils.h"
+#include "timeline/TimelineViewManager.h"
+#include "ui/Avatar.h"
+
+MemberList::MemberList(const QString &room_id, QWidget *parent)
+  : QAbstractListModel{parent}
+  , room_id_{room_id}
+{
+        try {
+                info_ = cache::singleRoomInfo(room_id_.toStdString());
+        } catch (const lmdb::error &) {
+                nhlog::db()->warn("failed to retrieve room info from cache: {}",
+                                  room_id_.toStdString());
+        }
+
+        try {
+                addUsers(cache::getMembers(room_id_.toStdString()));
+        } catch (const lmdb::error &e) {
+                nhlog::db()->critical("Failed to retrieve members from cache: {}", e.what());
+        }
+}
+
+void
+MemberList::addUsers(const std::vector<RoomMember> &members)
+{
+        beginInsertRows(QModelIndex{}, m_memberList.count(), m_memberList.count() + members.size() - 1);
+
+        for (const auto &member : members)
+                m_memberList.push_back(
+                  {member,
+                   ChatPage::instance()->timelineManager()->rooms()->currentRoom()->avatarUrl(
+                     member.user_id)});
+
+        endInsertRows();
+}
+
+QHash<int, QByteArray>
+MemberList::roleNames() const
+{
+        return {{Mxid, "mxid"}, {DisplayName, "displayName"}, {AvatarUrl, "avatarUrl"}};
+}
+
+QVariant
+MemberList::data(const QModelIndex &index, int role) const
+{
+        if (!index.isValid() || index.row() >= (int)m_memberList.size() || index.row() < 0)
+                return {};
+
+        switch (role) {
+        case Mxid:
+                return m_memberList[index.row()].first.user_id;
+        case DisplayName:
+                return m_memberList[index.row()].first.display_name;
+        case AvatarUrl:
+                return m_memberList[index.row()].second;
+        default:
+                return {};
+        }
+}
+
+bool MemberList::canFetchMore(const QModelIndex &) const
+{
+    const size_t numMembers = rowCount();
+    return (numMembers > 1 && numMembers < info_.member_count);
+}
+
+void
+MemberList::fetchMore(const QModelIndex &)
+{
+        addUsers(cache::getMembers(room_id_.toStdString(), rowCount()));
+}