summary refs log tree commit diff
path: root/src/PowerlevelsEditModels.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/PowerlevelsEditModels.h')
-rw-r--r--src/PowerlevelsEditModels.h95
1 files changed, 87 insertions, 8 deletions
diff --git a/src/PowerlevelsEditModels.h b/src/PowerlevelsEditModels.h

index 9aa955d2..515fdb56 100644 --- a/src/PowerlevelsEditModels.h +++ b/src/PowerlevelsEditModels.h
@@ -48,12 +48,12 @@ public: const QModelIndex &destinationParent, int destinationChild) override; - std::map<std::string, mtx::events::state::power_level_t, std::less<>> toEvents(); - mtx::events::state::power_level_t kick(); - mtx::events::state::power_level_t invite(); - mtx::events::state::power_level_t ban(); - mtx::events::state::power_level_t eventsDefault(); - mtx::events::state::power_level_t stateDefault(); + std::map<std::string, mtx::events::state::power_level_t, std::less<>> toEvents() const; + mtx::events::state::power_level_t kick() const; + mtx::events::state::power_level_t invite() const; + mtx::events::state::power_level_t ban() const; + mtx::events::state::power_level_t eventsDefault() const; + mtx::events::state::power_level_t stateDefault() const; struct Entry { @@ -106,8 +106,8 @@ public: const QModelIndex &destinationParent, int destinationChild) override; - std::map<std::string, mtx::events::state::power_level_t, std::less<>> toUsers(); - mtx::events::state::power_level_t usersDefault(); + std::map<std::string, mtx::events::state::power_level_t, std::less<>> toUsers() const; + mtx::events::state::power_level_t usersDefault() const; struct Entry { @@ -122,38 +122,117 @@ public: mtx::events::state::PowerLevels powerLevels_; }; +class PowerlevelsSpacesListModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(bool applyToChildren READ applyToChildren WRITE setApplyToChildren NOTIFY + applyToChildrenChanged) + Q_PROPERTY(bool overwriteDiverged READ overwriteDiverged WRITE setOverwriteDiverged NOTIFY + overwriteDivergedChanged) + +signals: + void applyToChildrenChanged(); + void overwriteDivergedChanged(); + +public: + enum Roles + { + DisplayName, + AvatarUrl, + IsSpace, + IsEditable, + IsDifferentFromBase, + IsAlreadyUpToDate, + ApplyPermissions, + }; + + explicit PowerlevelsSpacesListModel(const std::string &room_id_, + const mtx::events::state::PowerLevels &pl, + QObject *parent = nullptr); + + QHash<int, QByteArray> roleNames() const override; + int rowCount(const QModelIndex &) const override { return static_cast<int>(spaces.size()); } + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool + setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole) override; + + bool applyToChildren() const { return applyToChildren_; } + bool overwriteDiverged() const { return overwriteDiverged_; } + + void setApplyToChildren(bool val) + { + applyToChildren_ = val; + emit applyToChildrenChanged(); + updateToDefaults(); + } + void setOverwriteDiverged(bool val) + { + overwriteDiverged_ = val; + emit overwriteDivergedChanged(); + updateToDefaults(); + } + + void updateToDefaults(); + + Q_INVOKABLE void commit(); + + struct Entry + { + ~Entry() = default; + + std::string roomid; + mtx::events::state::PowerLevels pl; + bool apply = false; + }; + + std::string room_id; + QVector<Entry> spaces; + mtx::events::state::PowerLevels oldPowerLevels_, newPowerlevels_; + + bool applyToChildren_ = true, overwriteDiverged_ = false; +}; + class PowerlevelEditingModels : public QObject { Q_OBJECT Q_PROPERTY(PowerlevelsUserListModel *users READ users CONSTANT) Q_PROPERTY(PowerlevelsTypeListModel *types READ types CONSTANT) + Q_PROPERTY(PowerlevelsSpacesListModel *spaces READ spaces CONSTANT) Q_PROPERTY(qlonglong adminLevel READ adminLevel NOTIFY adminLevelChanged) Q_PROPERTY(qlonglong moderatorLevel READ moderatorLevel NOTIFY moderatorLevelChanged) Q_PROPERTY(qlonglong defaultUserLevel READ defaultUserLevel NOTIFY defaultUserLevelChanged) + Q_PROPERTY(bool isSpace READ isSpace CONSTANT) signals: void adminLevelChanged(); void moderatorLevelChanged(); void defaultUserLevelChanged(); +private: + mtx::events::state::PowerLevels calculateNewPowerlevel() const; + public: explicit PowerlevelEditingModels(QString room_id, QObject *parent = nullptr); PowerlevelsUserListModel *users() { return &users_; } PowerlevelsTypeListModel *types() { return &types_; } + PowerlevelsSpacesListModel *spaces() { return &spaces_; } qlonglong adminLevel() const { return powerLevels_.state_level(to_string(mtx::events::EventType::RoomPowerLevels)); } qlonglong moderatorLevel() const { return powerLevels_.redact; } qlonglong defaultUserLevel() const { return powerLevels_.users_default; } + bool isSpace() const; Q_INVOKABLE void commit(); + Q_INVOKABLE void updateSpacesModel(); Q_INVOKABLE void addRole(int pl); mtx::events::state::PowerLevels powerLevels_; PowerlevelsTypeListModel types_; PowerlevelsUserListModel users_; + PowerlevelsSpacesListModel spaces_; std::string room_id_; };