From 6c6d43691d98aa02513350b52fe736fff6d6071d Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 27 May 2022 16:31:54 +0200 Subject: Add basic powerlevel editor --- src/PowerlevelsEditModels.h | 140 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/PowerlevelsEditModels.h (limited to 'src/PowerlevelsEditModels.h') diff --git a/src/PowerlevelsEditModels.h b/src/PowerlevelsEditModels.h new file mode 100644 index 00000000..7bc797ea --- /dev/null +++ b/src/PowerlevelsEditModels.h @@ -0,0 +1,140 @@ +// SPDX-FileCopyrightText: 2022 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include + +#include + +#include "CacheStructs.h" + +class PowerlevelsTypeListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Roles + { + DisplayName, + Powerlevel, + IsType, + Moveable, + Removeable, + }; + + explicit PowerlevelsTypeListModel(const std::string &room_id_, + const mtx::events::state::PowerLevels &pl, + QObject *parent = nullptr); + + QHash roleNames() const override; + int rowCount(const QModelIndex &) const override { return static_cast(types.size()); } + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + Q_INVOKABLE bool remove(int row); + Q_INVOKABLE bool move(int from, int to); + Q_INVOKABLE void add(int index, QString type); + + bool moveRows(const QModelIndex &sourceParent, + int sourceRow, + int count, + const QModelIndex &destinationParent, + int destinationChild) override; + + std::map> 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(); + +private: + struct Entry + { + std::string type; + mtx::events::state::power_level_t pl; + }; + + std::string room_id; + QVector types; + mtx::events::state::PowerLevels powerLevels_; +}; + +class PowerlevelsUserListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Roles + { + Mxid, + DisplayName, + AvatarUrl, + Powerlevel, + IsUser, + Moveable, + Removeable, + }; + + explicit PowerlevelsUserListModel(const std::string &room_id_, + const mtx::events::state::PowerLevels &pl, + QObject *parent = nullptr); + + QHash roleNames() const override; + int rowCount(const QModelIndex &) const override { return static_cast(users.size()); } + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + Q_INVOKABLE bool remove(int row); + Q_INVOKABLE bool move(int from, int to); + Q_INVOKABLE void add(int index, QString user); + + bool moveRows(const QModelIndex &sourceParent, + int sourceRow, + int count, + const QModelIndex &destinationParent, + int destinationChild) override; + + std::map> toUsers(); + mtx::events::state::power_level_t usersDefault(); + +private: + struct Entry + { + std::string mxid; + mtx::events::state::power_level_t pl; + }; + + std::string room_id; + QVector users; + mtx::events::state::PowerLevels powerLevels_; +}; + +class PowerlevelEditingModels : public QObject +{ + Q_OBJECT + + Q_PROPERTY(PowerlevelsUserListModel *users READ users CONSTANT) + Q_PROPERTY(PowerlevelsTypeListModel *types READ types CONSTANT) + Q_PROPERTY(qlonglong adminLevel READ adminLevel CONSTANT) + Q_PROPERTY(qlonglong moderatorLevel READ moderatorLevel CONSTANT) + +public: + explicit PowerlevelEditingModels(QString room_id, QObject *parent = nullptr); + + PowerlevelsUserListModel *users() { return &users_; } + PowerlevelsTypeListModel *types() { return &types_; } + qlonglong adminLevel() const + { + return powerLevels_.state_level(to_string(mtx::events::EventType::RoomPowerLevels)); + } + qlonglong moderatorLevel() const { return powerLevels_.redact; } + + Q_INVOKABLE void commit(); + + mtx::events::state::PowerLevels powerLevels_; + PowerlevelsTypeListModel types_; + PowerlevelsUserListModel users_; + std::string room_id_; +}; -- cgit 1.5.1