Newer
Older
// SPDX-FileCopyrightText: Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QAbstractListModel>
#include <QSortFilterProxyModel>
#include <mtx/events/power_levels.hpp>
class MemberListBackend final : public QAbstractListModel
Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
Q_PROPERTY(int memberCount READ memberCount NOTIFY memberCountChanged)
Q_PROPERTY(QString avatarUrl READ avatarUrl NOTIFY avatarUrlChanged)
Q_PROPERTY(QString roomId READ roomId NOTIFY roomIdChanged)
Q_PROPERTY(int numUsersLoaded READ numUsersLoaded NOTIFY numUsersLoadedChanged)
Q_PROPERTY(bool loadingMoreMembers READ loadingMoreMembers NOTIFY loadingMoreMembersChanged)
enum Roles
{
Mxid,
DisplayName,
AvatarUrl,
Trustlevel,
MemberListBackend(const QString &room_id, QObject *parent = nullptr);
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override
{
Q_UNUSED(parent)
return static_cast<int>(m_memberList.size());
}
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QString roomName() const { return QString::fromStdString(info_.name); }
int memberCount() const { return (int)info_.member_count; }
QString avatarUrl() const { return QString::fromStdString(info_.avatar_url); }
QString roomId() const { return room_id_; }
int numUsersLoaded() const { return numUsersLoaded_; }
bool loadingMoreMembers() const { return loadingMoreMembers_; }
void roomNameChanged();
void memberCountChanged();
void avatarUrlChanged();
void roomIdChanged();
void numUsersLoadedChanged();
void loadingMoreMembersChanged();
void addUsers(const std::vector<RoomMember> &users);
bool canFetchMore(const QModelIndex &) const override;
void fetchMore(const QModelIndex &) override;
QVector<QPair<RoomMember, QString>> m_memberList;
QString room_id_;
RoomInfo info_;
int numUsersLoaded_{0};
bool loadingMoreMembers_{false};
mtx::events::state::PowerLevels powerLevels_;
friend class MemberList;
};
class MemberList final : public QSortFilterProxyModel
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
{
Q_OBJECT
Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
Q_PROPERTY(int memberCount READ memberCount NOTIFY memberCountChanged)
Q_PROPERTY(QString avatarUrl READ avatarUrl NOTIFY avatarUrlChanged)
Q_PROPERTY(QString roomId READ roomId NOTIFY roomIdChanged)
Q_PROPERTY(int numUsersLoaded READ numUsersLoaded NOTIFY numUsersLoadedChanged)
Q_PROPERTY(bool loadingMoreMembers READ loadingMoreMembers NOTIFY loadingMoreMembersChanged)
public:
enum MemberSortRoles
{
Mxid = MemberListBackend::Roles::Mxid,
DisplayName = MemberListBackend::Roles::DisplayName,
Powerlevel = MemberListBackend::Roles::Powerlevel,
};
Q_ENUM(MemberSortRoles)
MemberList(const QString &room_id, QObject *parent = nullptr);
QString roomName() const { return m_model.roomName(); }
int memberCount() const { return m_model.memberCount(); }
QString avatarUrl() const { return m_model.avatarUrl(); }
QString roomId() const { return m_model.roomId(); }
int numUsersLoaded() const { return m_model.numUsersLoaded(); }
bool loadingMoreMembers() const { return m_model.loadingMoreMembers(); }
signals:
void roomNameChanged();
void memberCountChanged();
void avatarUrlChanged();
void roomIdChanged();
void numUsersLoadedChanged();
void loadingMoreMembersChanged();
public slots:
void setFilterString(const QString &text);
void sortBy(const MemberSortRoles role);
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
private: