diff --git a/src/PowerlevelsEditModels.cpp b/src/PowerlevelsEditModels.cpp
index 77262a20..cea35495 100644
--- a/src/PowerlevelsEditModels.cpp
+++ b/src/PowerlevelsEditModels.cpp
@@ -239,6 +239,7 @@ PowerlevelsTypeListModel::remove(int row)
return true;
}
+
void
PowerlevelsTypeListModel::add(int row, QString type)
{
@@ -261,6 +262,23 @@ PowerlevelsTypeListModel::add(int row, QString type)
endInsertRows();
}
+void
+PowerlevelsTypeListModel::addRole(int64_t role)
+{
+ for (int i = 0; i < types.size(); i++) {
+ if (types[i].pl < role) {
+ beginInsertRows(QModelIndex(), i, i);
+ types.insert(i, Entry{"", role});
+ endInsertRows();
+ return;
+ }
+ }
+
+ beginInsertRows(QModelIndex(), types.size(), types.size());
+ types.push_back(Entry{"", role});
+ endInsertRows();
+}
+
bool
PowerlevelsTypeListModel::move(int from, int to)
{
@@ -299,10 +317,19 @@ PowerlevelsTypeListModel::moveRows(const QModelIndex &,
auto pl = types.at(destinationChild > 0 ? destinationChild - 1 : 0).pl;
auto sourceItem = types.takeAt(sourceRow);
sourceItem.pl = pl;
+
+ auto movedType = sourceItem.type;
+
if (destinationChild < sourceRow)
types.insert(destinationChild, std::move(sourceItem));
else
types.insert(destinationChild - 1, std::move(sourceItem));
+
+ if (movedType == "m.room.power_levels")
+ emit adminLevelChanged();
+ else if (movedType == "redact")
+ emit moderatorLevelChanged();
+
return true;
}
@@ -454,6 +481,23 @@ PowerlevelsUserListModel::add(int row, QString user)
endInsertRows();
}
+void
+PowerlevelsUserListModel::addRole(int64_t role)
+{
+ for (int i = 0; i < users.size(); i++) {
+ if (users[i].pl < role) {
+ beginInsertRows(QModelIndex(), i, i);
+ users.insert(i, Entry{"", role});
+ endInsertRows();
+ return;
+ }
+ }
+
+ beginInsertRows(QModelIndex(), users.size(), users.size());
+ users.push_back(Entry{"", role});
+ endInsertRows();
+}
+
bool
PowerlevelsUserListModel::move(int from, int to)
{
@@ -492,10 +536,17 @@ PowerlevelsUserListModel::moveRows(const QModelIndex &,
auto pl = users.at(destinationChild > 0 ? destinationChild - 1 : 0).pl;
auto sourceItem = users.takeAt(sourceRow);
sourceItem.pl = pl;
+
+ auto movedType = sourceItem.mxid;
+
if (destinationChild < sourceRow)
users.insert(destinationChild, std::move(sourceItem));
else
users.insert(destinationChild - 1, std::move(sourceItem));
+
+ if (movedType == "default")
+ emit defaultUserLevelChanged();
+
return true;
}
@@ -508,7 +559,20 @@ PowerlevelEditingModels::PowerlevelEditingModels(QString room_id, QObject *paren
, types_(room_id.toStdString(), powerLevels_, this)
, users_(room_id.toStdString(), powerLevels_, this)
, room_id_(room_id.toStdString())
-{}
+{
+ connect(&types_,
+ &PowerlevelsTypeListModel::adminLevelChanged,
+ this,
+ &PowerlevelEditingModels::adminLevelChanged);
+ connect(&types_,
+ &PowerlevelsTypeListModel::moderatorLevelChanged,
+ this,
+ &PowerlevelEditingModels::moderatorLevelChanged);
+ connect(&users_,
+ &PowerlevelsUserListModel::defaultUserLevelChanged,
+ this,
+ &PowerlevelEditingModels::defaultUserLevelChanged);
+}
void
PowerlevelEditingModels::commit()
@@ -532,3 +596,14 @@ PowerlevelEditingModels::commit()
}
});
}
+
+void
+PowerlevelEditingModels::addRole(int pl)
+{
+ for (const auto &e : types_.types)
+ if (pl == int(e.pl))
+ return;
+
+ types_.addRole(pl);
+ users_.addRole(pl);
+}
diff --git a/src/PowerlevelsEditModels.h b/src/PowerlevelsEditModels.h
index 25ad6d5a..9aa955d2 100644
--- a/src/PowerlevelsEditModels.h
+++ b/src/PowerlevelsEditModels.h
@@ -15,6 +15,10 @@ class PowerlevelsTypeListModel : public QAbstractListModel
{
Q_OBJECT
+signals:
+ void adminLevelChanged();
+ void moderatorLevelChanged();
+
public:
enum Roles
{
@@ -36,6 +40,7 @@ public:
Q_INVOKABLE bool remove(int row);
Q_INVOKABLE bool move(int from, int to);
Q_INVOKABLE void add(int index, QString type);
+ void addRole(int64_t role);
bool moveRows(const QModelIndex &sourceParent,
int sourceRow,
@@ -50,7 +55,6 @@ public:
mtx::events::state::power_level_t eventsDefault();
mtx::events::state::power_level_t stateDefault();
-private:
struct Entry
{
~Entry() = default;
@@ -68,6 +72,9 @@ class PowerlevelsUserListModel : public QAbstractListModel
{
Q_OBJECT
+signals:
+ void defaultUserLevelChanged();
+
public:
enum Roles
{
@@ -91,6 +98,7 @@ public:
Q_INVOKABLE bool remove(int row);
Q_INVOKABLE bool move(int from, int to);
Q_INVOKABLE void add(int index, QString user);
+ void addRole(int64_t role);
bool moveRows(const QModelIndex &sourceParent,
int sourceRow,
@@ -101,7 +109,6 @@ public:
std::map<std::string, mtx::events::state::power_level_t, std::less<>> toUsers();
mtx::events::state::power_level_t usersDefault();
-private:
struct Entry
{
~Entry() = default;
@@ -121,8 +128,14 @@ class PowerlevelEditingModels : public QObject
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)
+ Q_PROPERTY(qlonglong adminLevel READ adminLevel NOTIFY adminLevelChanged)
+ Q_PROPERTY(qlonglong moderatorLevel READ moderatorLevel NOTIFY moderatorLevelChanged)
+ Q_PROPERTY(qlonglong defaultUserLevel READ defaultUserLevel NOTIFY defaultUserLevelChanged)
+
+signals:
+ void adminLevelChanged();
+ void moderatorLevelChanged();
+ void defaultUserLevelChanged();
public:
explicit PowerlevelEditingModels(QString room_id, QObject *parent = nullptr);
@@ -134,8 +147,10 @@ public:
return powerLevels_.state_level(to_string(mtx::events::EventType::RoomPowerLevels));
}
qlonglong moderatorLevel() const { return powerLevels_.redact; }
+ qlonglong defaultUserLevel() const { return powerLevels_.users_default; }
Q_INVOKABLE void commit();
+ Q_INVOKABLE void addRole(int pl);
mtx::events::state::PowerLevels powerLevels_;
PowerlevelsTypeListModel types_;
|