#include "userdirectorylistmodel.h" UserDirectoryListModel::UserDirectoryListModel(QObject* parent) : QAbstractListModel(parent) {} void UserDirectoryListModel::setConnection(Connection* conn) { if (m_connection == conn) return; beginResetModel(); m_limited = false; attempted = false; users.clear(); if (m_connection) { m_connection->disconnect(this); } endResetModel(); m_connection = conn; if (job) { job->abandon(); job = nullptr; } emit connectionChanged(); emit limitedChanged(); } void UserDirectoryListModel::setKeyword(const QString& value) { if (m_keyword == value) return; m_keyword = value; m_limited = false; attempted = false; if (job) { job->abandon(); job = nullptr; } emit keywordChanged(); emit limitedChanged(); } void UserDirectoryListModel::search(int count) { if (count < 1) return; if (job) { qDebug() << "UserDirectoryListModel: Other jobs running, ignore"; return; } if (attempted) return; job = m_connection->callApi(m_keyword, count); connect(job, &BaseJob::finished, this, [=] { attempted = true; if (job->status() == BaseJob::Success) { auto users = job->results(); this->beginResetModel(); this->users = users; this->m_limited = job->limited(); this->endResetModel(); } this->job = nullptr; emit limitedChanged(); }); } QVariant UserDirectoryListModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) return QVariant(); if (index.row() >= users.count()) { qDebug() << "UserDirectoryListModel, something's wrong: index.row() >= " "users.count()"; return {}; } auto user = users.at(index.row()); if (role == NameRole) { auto displayName = user.displayName; if (!displayName.isEmpty()) { return displayName; } displayName = user.userId; if (!displayName.isEmpty()) { return displayName; } return "Unknown User"; } if (role == AvatarRole) { auto avatarUrl = user.avatarUrl; if (avatarUrl.isEmpty()) { return ""; } return avatarUrl.remove(0, 6); } if (role == UserIDRole) { return user.userId; } if (role == DirectChatsRole) { if (!m_connection) return {}; auto userObj = m_connection->user(user.userId); auto directChats = m_connection->directChats(); if (userObj && directChats.contains(userObj)) { auto directChatsForUser = directChats.values(userObj); if (!directChatsForUser.isEmpty()) { return QVariant::fromValue(directChatsForUser); } } } return {}; } QHash UserDirectoryListModel::roleNames() const { QHash roles; roles[NameRole] = "name"; roles[AvatarRole] = "avatar"; roles[UserIDRole] = "userID"; roles[DirectChatsRole] = "directChats"; return roles; } int UserDirectoryListModel::rowCount(const QModelIndex& parent) const { if (parent.isValid()) return 0; return users.count(); }