summary refs log tree commit diff
path: root/src/ui
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2020-07-04 04:24:28 +0200
committerCH Chethan Reddy <40890937+Chethan2k1@users.noreply.github.com>2020-07-30 22:10:27 +0530
commit08028d5c57d134fb3d0ca9004730f0b2c99e5e67 (patch)
tree1268c0d9fdfd47966fb386028098ce6634195479 /src/ui
parentSome issue with UserProfile (diff)
downloadnheko-08028d5c57d134fb3d0ca9004730f0b2c99e5e67.tar.xz
Refactor UserProfile
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/UserProfile.cpp108
-rw-r--r--src/ui/UserProfile.h118
-rw-r--r--src/ui/UserProfileModel.cpp63
-rw-r--r--src/ui/UserProfileModel.h30
4 files changed, 142 insertions, 177 deletions
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