diff --git a/src/ui/RoomSettings.h b/src/ui/RoomSettings.h
index 4cb5bcf4..35698310 100644
--- a/src/ui/RoomSettings.h
+++ b/src/ui/RoomSettings.h
@@ -5,10 +5,13 @@
#pragma once
+#include <QAbstractListModel>
#include <QObject>
#include <QSet>
#include <QString>
+#include <unordered_set>
+
#include <mtx/events/event_type.hpp>
#include <mtx/events/guest_access.hpp>
@@ -27,6 +30,43 @@ signals:
void stopLoading();
};
+class RoomSettings;
+
+class RoomSettingsAllowedRoomsModel : public QAbstractListModel
+{
+ Q_OBJECT
+
+public:
+ enum Roles
+ {
+ Name,
+ IsAllowed,
+ IsSpaceParent,
+ };
+
+ explicit RoomSettingsAllowedRoomsModel(RoomSettings *parent);
+
+ QHash<int, QByteArray> roleNames() const override;
+ int rowCount(const QModelIndex &) const override;
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+ bool
+ setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole) override;
+ Q_INVOKABLE void addRoom(QString room);
+
+ Qt::ItemFlags flags(const QModelIndex &) const override
+ {
+ return Qt::ItemIsEditable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled |
+ Qt::ItemNeverHasChildren;
+ }
+
+ QStringList allowedRoomIds;
+
+private:
+ QStringList listedRoomIds;
+ std::unordered_set<QString> parentSpaces;
+ RoomSettings *settings;
+};
+
class RoomSettings : public QObject
{
Q_OBJECT
@@ -39,7 +79,10 @@ class RoomSettings : public QObject
Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY avatarUrlChanged)
Q_PROPERTY(int memberCount READ memberCount CONSTANT)
Q_PROPERTY(int notifications READ notifications NOTIFY notificationsChanged)
- Q_PROPERTY(int accessJoinRules READ accessJoinRules NOTIFY accessJoinRulesChanged)
+ Q_PROPERTY(bool privateAccess READ privateAccess NOTIFY accessJoinRulesChanged)
+ Q_PROPERTY(bool guestAccess READ guestAccess NOTIFY accessJoinRulesChanged)
+ Q_PROPERTY(bool knockingEnabled READ knockingEnabled NOTIFY accessJoinRulesChanged)
+ Q_PROPERTY(bool restrictedEnabled READ restrictedEnabled NOTIFY accessJoinRulesChanged)
Q_PROPERTY(bool isLoading READ isLoading NOTIFY loadingChanged)
Q_PROPERTY(bool canChangeAvatar READ canChangeAvatar CONSTANT)
Q_PROPERTY(bool canChangeJoinRules READ canChangeJoinRules CONSTANT)
@@ -49,6 +92,11 @@ class RoomSettings : public QObject
Q_PROPERTY(bool supportsKnocking READ supportsKnocking CONSTANT)
Q_PROPERTY(bool supportsRestricted READ supportsRestricted CONSTANT)
Q_PROPERTY(bool supportsKnockRestricted READ supportsKnockRestricted CONSTANT)
+ Q_PROPERTY(
+ QStringList allowedRooms READ allowedRooms WRITE setAllowedRooms NOTIFY allowedRoomsChanged)
+ Q_PROPERTY(RoomSettingsAllowedRoomsModel *allowedRoomsModel MEMBER allowedRoomsModel CONSTANT)
+ Q_PROPERTY(
+ bool allowedRoomsModified READ allowedRoomsModified NOTIFY allowedRoomsModifiedChanged)
public:
RoomSettings(QString roomid, QObject *parent = nullptr);
@@ -62,7 +110,10 @@ public:
QString roomAvatarUrl();
int memberCount() const;
int notifications();
- int accessJoinRules();
+ bool privateAccess() const;
+ bool guestAccess() const;
+ bool knockingEnabled() const;
+ bool restrictedEnabled() const;
bool isLoading() const;
//! Whether the user has enough power level to send m.room.join_rules events.
bool canChangeJoinRules() const;
@@ -76,14 +127,22 @@ public:
bool supportsKnocking() const;
bool supportsRestricted() const;
bool supportsKnockRestricted() const;
+ QStringList allowedRooms() const;
+ void setAllowedRooms(QStringList rooms);
+ bool allowedRoomsModified() const { return allowedRoomsModified_; }
Q_INVOKABLE void enableEncryption();
Q_INVOKABLE void updateAvatar();
- Q_INVOKABLE void changeAccessRules(int index);
+ Q_INVOKABLE void changeAccessRules(bool private_,
+ bool guestsAllowed,
+ bool knockingAllowed,
+ bool restrictedAllowed);
Q_INVOKABLE void changeNotifications(int currentIndex);
Q_INVOKABLE void changeTopic(QString topic);
Q_INVOKABLE void changeName(QString name);
+ Q_INVOKABLE void applyAllowedFromModel();
+
signals:
void loadingChanged();
void roomNameChanged();
@@ -92,7 +151,9 @@ signals:
void encryptionChanged();
void notificationsChanged();
void accessJoinRulesChanged();
+ void allowedRoomsChanged();
void displayError(const QString &errorMessage);
+ void allowedRoomsModifiedChanged();
public slots:
void stopLoading();
@@ -106,9 +167,14 @@ private:
private:
QString roomid_;
- bool usesEncryption_ = false;
- bool isLoading_ = false;
+ bool usesEncryption_ = false;
+ bool isLoading_ = false;
+ bool allowedRoomsModified_ = false;
RoomInfo info_;
int notifications_ = 0;
- int accessRules_ = 0;
+
+ mtx::events::state::JoinRules accessRules_;
+ mtx::events::state::AccessState guestRules_ = mtx::events::state::AccessState::Forbidden;
+
+ RoomSettingsAllowedRoomsModel *allowedRoomsModel;
};
|