diff --git a/src/ui/UserProfile.cpp b/src/ui/UserProfile.cpp
index 8c6fb8e4..fde0044b 100644
--- a/src/ui/UserProfile.cpp
+++ b/src/ui/UserProfile.cpp
@@ -5,47 +5,72 @@
#include "Utils.h"
#include "mtx/responses/crypto.hpp"
-#include <iostream> // only for debugging
+UserProfile::UserProfile(QString roomid, QString userid, QObject *parent)
+ : QObject(parent)
+ , roomid_(roomid)
+ , userid_(userid)
+{
+ fetchDeviceList(this->userid_);
+}
+
+QHash<int, QByteArray>
+DeviceInfoModel::roleNames() const
+{
+ return {
+ {DeviceId, "deviceId"},
+ {DeviceName, "deviceName"},
+ {VerificationStatus, "verificationStatus"},
+ };
+}
-Q_DECLARE_METATYPE(UserProfile::Status)
+QVariant
+DeviceInfoModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid() || index.row() >= (int)deviceList_.size() || index.row() < 0)
+ return {};
-UserProfile::UserProfile(QObject *parent)
- : QObject(parent)
+ switch (role) {
+ case DeviceId:
+ return deviceList_[index.row()].device_id;
+ case DeviceName:
+ return deviceList_[index.row()].display_name;
+ case VerificationStatus:
+ return QVariant::fromValue(deviceList_[index.row()].verification_status);
+ default:
+ return {};
+ }
+}
+
+void
+DeviceInfoModel::reset(const std::vector<DeviceInfo> &deviceList)
{
- qRegisterMetaType<UserProfile::Status>();
- connect(
- this, &UserProfile::updateDeviceList, this, [this]() { fetchDeviceList(this->userId); });
- connect(
- this,
- &UserProfile::appendDeviceList,
- this,
- [this](QString device_id, QString device_name, UserProfile::Status verification_status) {
- this->deviceList.push_back(
- DeviceInfo{device_id, device_name, verification_status});
- });
+ beginResetModel();
+ this->deviceList_ = std::move(deviceList);
+ endResetModel();
}
-std::vector<DeviceInfo>
-UserProfile::getDeviceList()
+DeviceInfoModel *
+UserProfile::deviceList()
{
- return this->deviceList;
+ return &this->deviceList_;
}
QString
-UserProfile::getUserId()
+UserProfile::userid()
{
- return this->userId;
+ return this->userid_;
}
-void
-UserProfile::setUserId(const QString &user_id)
+QString
+UserProfile::displayName()
{
- if (this->userId != userId)
- return;
- else {
- this->userId = user_id;
- emit UserProfile::userIdChanged();
- }
+ return cache::displayName(roomid_, userid_);
+}
+
+QString
+UserProfile::avatarUrl()
+{
+ return cache::avatarUrl(roomid_, userid_);
}
void
@@ -74,27 +99,27 @@ UserProfile::callback_fn(const mtx::responses::QueryKeys &res,
auto device = d.second;
// TODO: Verify signatures and ignore those that don't pass.
- UserProfile::Status verified = UserProfile::Status::UNVERIFIED;
+ verification::Status verified = verification::Status::UNVERIFIED;
if (cross_verified.has_value()) {
if (std::find(cross_verified->begin(), cross_verified->end(), d.first) !=
cross_verified->end())
- verified = UserProfile::Status::VERIFIED;
+ verified = verification::Status::VERIFIED;
} else if (device_verified.has_value()) {
if (std::find(device_verified->device_verified.begin(),
device_verified->device_verified.end(),
d.first) != device_verified->device_verified.end())
- verified = UserProfile::Status::VERIFIED;
+ verified = verification::Status::VERIFIED;
} else if (device_verified.has_value()) {
if (std::find(device_verified->device_blocked.begin(),
device_verified->device_blocked.end(),
d.first) != device_verified->device_blocked.end())
- verified = UserProfile::Status::BLOCKED;
+ verified = verification::Status::BLOCKED;
}
- emit UserProfile::appendDeviceList(
- QString::fromStdString(d.first),
- QString::fromStdString(device.unsigned_info.device_display_name),
- verified);
+ deviceInfo.push_back(
+ {QString::fromStdString(d.first),
+ QString::fromStdString(device.unsigned_info.device_display_name),
+ verified});
}
// std::sort(
@@ -102,8 +127,7 @@ UserProfile::callback_fn(const mtx::responses::QueryKeys &res,
// return a.device_id > b.device_id;
// });
- this->deviceList = std::move(deviceInfo);
- emit UserProfile::deviceListUpdated();
+ this->deviceList_.queueReset(std::move(deviceInfo));
}
void
@@ -130,7 +154,7 @@ UserProfile::fetchDeviceList(const QString &userID)
void
UserProfile::banUser()
{
- ChatPage::instance()->banUser(this->userId, "");
+ ChatPage::instance()->banUser(this->userid_, "");
}
// void ignoreUser(){
@@ -140,7 +164,7 @@ UserProfile::banUser()
void
UserProfile::kickUser()
{
- ChatPage::instance()->kickUser(this->userId, "");
+ ChatPage::instance()->kickUser(this->userid_, "");
}
void
@@ -149,7 +173,7 @@ UserProfile::startChat()
mtx::requests::CreateRoom req;
req.preset = mtx::requests::Preset::PrivateChat;
req.visibility = mtx::requests::Visibility::Private;
- if (utils::localUser() != this->userId)
- req.invite = {this->userId.toStdString()};
+ if (utils::localUser() != this->userid_)
+ req.invite = {this->userid_.toStdString()};
emit ChatPage::instance()->createRoom(req);
}
diff --git a/src/ui/UserProfile.h b/src/ui/UserProfile.h
index 1725b961..38002fff 100644
--- a/src/ui/UserProfile.h
+++ b/src/ui/UserProfile.h
@@ -1,34 +1,92 @@
#pragma once
+#include <QAbstractListModel>
#include <QObject>
#include <QString>
#include <QVector>
#include "MatrixClient.h"
-class DeviceInfo;
+namespace verification {
+Q_NAMESPACE
-class UserProfile : public QObject
+enum Status
+{
+ VERIFIED,
+ UNVERIFIED,
+ BLOCKED
+};
+Q_ENUM_NS(Status)
+}
+
+class DeviceInfo
+{
+public:
+ DeviceInfo(const QString deviceID,
+ const QString displayName,
+ verification::Status verification_status_)
+ : device_id(deviceID)
+ , display_name(displayName)
+ , verification_status(verification_status_)
+ {}
+ DeviceInfo()
+ : verification_status(verification::UNVERIFIED)
+ {}
+
+ QString device_id;
+ QString display_name;
+
+ verification::Status verification_status;
+};
+
+class DeviceInfoModel : public QAbstractListModel
{
Q_OBJECT
- Q_PROPERTY(QString userId READ getUserId WRITE setUserId NOTIFY userIdChanged)
- Q_PROPERTY(std::vector<DeviceInfo> deviceList READ getDeviceList NOTIFY deviceListUpdated)
public:
- // constructor
- explicit UserProfile(QObject *parent = 0);
- // getters
- std::vector<DeviceInfo> getDeviceList();
- QString getUserId();
- // setters
- void setUserId(const QString &userId);
+ enum Roles
+ {
+ DeviceId,
+ DeviceName,
+ VerificationStatus,
+ };
- enum Status
+ explicit DeviceInfoModel(QObject *parent = nullptr)
{
- VERIFIED,
- UNVERIFIED,
- BLOCKED
+ (void)parent;
+ connect(this, &DeviceInfoModel::queueReset, this, &DeviceInfoModel::reset);
};
- Q_ENUM(Status)
+ QHash<int, QByteArray> roleNames() const override;
+ int rowCount(const QModelIndex &parent = QModelIndex()) const
+ {
+ (void)parent;
+ return (int)deviceList_.size();
+ }
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+
+signals:
+ void queueReset(const std::vector<DeviceInfo> &deviceList);
+public slots:
+ void reset(const std::vector<DeviceInfo> &deviceList);
+
+private:
+ std::vector<DeviceInfo> deviceList_;
+};
+
+class UserProfile : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QString displayName READ displayName CONSTANT)
+ Q_PROPERTY(QString userid READ userid CONSTANT)
+ Q_PROPERTY(QString avatarUrl READ avatarUrl CONSTANT)
+ Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList CONSTANT)
+public:
+ UserProfile(QString roomid, QString userid, QObject *parent = 0);
+
+ DeviceInfoModel *deviceList();
+
+ QString userid();
+ QString displayName();
+ QString avatarUrl();
void fetchDeviceList(const QString &userID);
Q_INVOKABLE void banUser();
@@ -36,37 +94,13 @@ public:
Q_INVOKABLE void kickUser();
Q_INVOKABLE void startChat();
-signals:
- void userIdChanged();
- void deviceListUpdated();
- void updateDeviceList();
- void appendDeviceList(const QString device_id,
- const QString device_naem,
- const UserProfile::Status verification_status);
-
private:
- std::vector<DeviceInfo> deviceList;
- QString userId;
+ QString roomid_, userid_;
std::optional<std::string> cross_verified;
+ DeviceInfoModel deviceList_;
void callback_fn(const mtx::responses::QueryKeys &res,
mtx::http::RequestErr err,
std::string user_id,
std::optional<std::vector<std::string>> cross_verified);
};
-
-class DeviceInfo
-{
-public:
- DeviceInfo(const QString deviceID,
- const QString displayName,
- UserProfile::Status verification_status_)
- : device_id(deviceID)
- , display_name(displayName)
- , verification_status(verification_status_)
- {}
-
- QString device_id;
- QString display_name;
- UserProfile::Status verification_status;
-};
\ No newline at end of file
diff --git a/src/ui/UserProfileModel.cpp b/src/ui/UserProfileModel.cpp
deleted file mode 100644
index 3fa8fe2d..00000000
--- a/src/ui/UserProfileModel.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#include "UserProfileModel.h"
-#include <QModelIndex>
-
-UserProfileModel::UserProfileModel(QObject *parent)
- : QAbstractListModel(parent)
- , deviceList(nullptr)
-{
- this->deviceList = new UserProfile(this);
-
- connect(this->deviceList, &UserProfile::userIdChanged, this, [this]() {
- emit this->deviceList->updateDeviceList();
- });
- connect(this->deviceList, &UserProfile::deviceListUpdated, this, [this]() {
- beginResetModel();
- this->beginInsertRows(
- QModelIndex(), 0, this->deviceList->getDeviceList().size() - 1);
- this->endInsertRows();
- endResetModel();
- });
-}
-
-int
-UserProfileModel::rowCount(const QModelIndex &parent) const
-{
- if (parent.isValid() || !this->deviceList)
- return 0;
- return this->deviceList->getDeviceList().size();
-}
-
-QVariant
-UserProfileModel::data(const QModelIndex &index, int role) const
-{
- if (!index.isValid() &&
- static_cast<int>(this->deviceList->getDeviceList().size()) <= index.row())
- return QVariant();
-
- const DeviceInfo device = this->deviceList->getDeviceList().at(index.row());
- switch (role) {
- case DEVICEID:
- return QVariant(device.device_id);
- case DISPLAYNAME:
- return QVariant(device.display_name);
- case VERIFIED_STATUS:
- return device.verification_status;
- }
- return QVariant();
-}
-
-QHash<int, QByteArray>
-UserProfileModel::roleNames() const
-{
- QHash<int, QByteArray> names;
- names[DEVICEID] = "deviceID";
- names[DISPLAYNAME] = "displayName";
- names[VERIFIED_STATUS] = "verified_status";
- return names;
-}
-
-UserProfile *
-UserProfileModel::getList() const
-{
- return (this->deviceList);
-}
diff --git a/src/ui/UserProfileModel.h b/src/ui/UserProfileModel.h
deleted file mode 100644
index ba7a2525..00000000
--- a/src/ui/UserProfileModel.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#pragma once
-
-#include "UserProfile.h"
-#include <QAbstractListModel>
-
-class UserProfile; // forward declaration of the class UserProfile
-
-class UserProfileModel : public QAbstractListModel
-{
- Q_OBJECT
- Q_PROPERTY(UserProfile *deviceList READ getList)
-
-public:
- explicit UserProfileModel(QObject *parent = nullptr);
-
- enum
- {
- DEVICEID,
- DISPLAYNAME,
- VERIFIED_STATUS
- };
- UserProfile *getList() const;
-
- int rowCount(const QModelIndex &parent = QModelIndex()) const override;
- QVariant data(const QModelIndex &index, int role) const override;
- virtual QHash<int, QByteArray> roleNames() const override;
-
-private:
- UserProfile *deviceList;
-};
\ No newline at end of file
|