matrixion/src/ui/UserProfile.h

156 lines
4.5 KiB
C
Raw Normal View History

2021-03-05 02:35:15 +03:00
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
2020-05-17 16:34:47 +03:00
#pragma once
2020-07-04 05:24:28 +03:00
#include <QAbstractListModel>
2020-05-17 16:34:47 +03:00
#include <QObject>
#include <QString>
2020-05-27 11:49:26 +03:00
#include <QVector>
#include <mtx/responses.hpp>
#include <mtx/responses/common.hpp>
2020-05-17 16:34:47 +03:00
2020-07-04 05:24:28 +03:00
namespace verification {
Q_NAMESPACE
2020-05-17 16:34:47 +03:00
2020-07-04 05:24:28 +03:00
enum Status
{
VERIFIED,
UNVERIFIED,
BLOCKED
};
Q_ENUM_NS(Status)
}
2020-07-05 19:03:27 +03:00
class DeviceVerificationFlow;
2020-08-09 06:05:15 +03:00
class TimelineModel;
class TimelineViewManager;
2020-07-05 19:03:27 +03:00
2020-07-04 05:24:28 +03:00
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
2020-05-17 16:34:47 +03:00
{
Q_OBJECT
public:
2020-07-04 05:24:28 +03:00
enum Roles
2020-07-01 15:17:10 +03:00
{
2020-07-04 05:24:28 +03:00
DeviceId,
DeviceName,
VerificationStatus,
2020-07-01 15:17:10 +03:00
};
2020-07-04 05:24:28 +03:00
explicit DeviceInfoModel(QObject *parent = nullptr)
{
(void)parent;
connect(this, &DeviceInfoModel::queueReset, this, &DeviceInfoModel::reset);
};
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override
2020-07-04 05:24:28 +03:00
{
(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_;
friend class UserProfile;
2020-07-04 05:24:28 +03:00
};
class UserProfile : public QObject
{
Q_OBJECT
Q_PROPERTY(QString displayName READ displayName NOTIFY displayNameChanged)
2020-07-04 05:24:28 +03:00
Q_PROPERTY(QString userid READ userid CONSTANT)
Q_PROPERTY(QString avatarUrl READ avatarUrl NOTIFY avatarUrlChanged)
2020-07-04 05:24:28 +03:00
Q_PROPERTY(DeviceInfoModel *deviceList READ deviceList CONSTANT)
2021-01-29 09:25:24 +03:00
Q_PROPERTY(bool isGlobalUserProfile READ isGlobalUserProfile CONSTANT)
Q_PROPERTY(bool isUserVerified READ getUserStatus NOTIFY userStatusChanged)
2021-02-02 14:54:08 +03:00
Q_PROPERTY(bool isLoading READ isLoading NOTIFY loadingChanged)
Q_PROPERTY(
bool userVerificationEnabled READ userVerificationEnabled NOTIFY userStatusChanged)
Q_PROPERTY(bool isSelf READ isSelf CONSTANT)
Q_PROPERTY(TimelineModel *room READ room CONSTANT)
2020-07-04 05:24:28 +03:00
public:
UserProfile(QString roomid,
QString userid,
TimelineViewManager *manager_,
TimelineModel *parent = nullptr);
2020-07-04 05:24:28 +03:00
DeviceInfoModel *deviceList();
QString userid();
QString displayName();
QString avatarUrl();
2021-01-29 09:25:24 +03:00
bool isGlobalUserProfile() const;
2020-07-17 23:16:30 +03:00
bool getUserStatus();
bool userVerificationEnabled() const;
bool isSelf() const;
2021-02-02 14:54:08 +03:00
bool isLoading() const;
TimelineModel *room() const { return model; }
2020-07-01 15:17:10 +03:00
Q_INVOKABLE void verify(QString device = "");
Q_INVOKABLE void unverify(QString device = "");
2020-07-05 19:03:27 +03:00
Q_INVOKABLE void fetchDeviceList(const QString &userID);
2020-06-26 01:54:42 +03:00
Q_INVOKABLE void banUser();
// Q_INVOKABLE void ignoreUser();
Q_INVOKABLE void kickUser();
Q_INVOKABLE void startChat();
Q_INVOKABLE void changeUsername(QString username);
Q_INVOKABLE void changeAvatar();
2020-05-17 16:34:47 +03:00
signals:
void userStatusChanged();
2021-02-02 14:54:08 +03:00
void loadingChanged();
void displayNameChanged();
void avatarUrlChanged();
void displayError(const QString &errorMessage);
2021-01-28 21:45:40 +03:00
void globalUsernameRetrieved(const QString &globalUser);
2021-02-02 14:54:08 +03:00
public slots:
void updateAvatarUrl();
protected slots:
void setGlobalUsername(const QString &globalUser);
private:
void updateRoomMemberState(mtx::events::state::Member member);
void getGlobalProfileData();
2020-05-17 16:34:47 +03:00
private:
2020-07-04 05:24:28 +03:00
QString roomid_, userid_;
QString globalUsername;
QString globalAvatarUrl;
2020-07-04 05:24:28 +03:00
DeviceInfoModel deviceList_;
bool isUserVerified = false;
bool hasMasterKey = false;
2021-02-02 14:54:08 +03:00
bool isLoading_ = false;
TimelineViewManager *manager;
2020-08-09 06:05:15 +03:00
TimelineModel *model;
2020-07-01 15:17:10 +03:00
};