Update userlistmodel permission roles

Change the userlist model so that permission names are based upon the following power level convention:
- 0: member
- 50: moderator
- 100: admin
- other: custom

This is inline with the new permission room page. Follow on from network/neochat!712
This commit is contained in:
James Graham
2023-01-12 19:13:20 +00:00
parent 5f2cd92da7
commit 28b5631d06
4 changed files with 33 additions and 92 deletions

View File

@@ -291,7 +291,8 @@ Kirigami.OverlayDrawer {
room: roomDrawer.room
}
sortRole: "perm"
sortRole: "powerLevel"
sortOrder: Qt.DescendingOrder
filterRole: "name"
filterCaseSensitivity: Qt.CaseInsensitive
}
@@ -325,22 +326,9 @@ Kirigami.OverlayDrawer {
}
trailing: QQC2.Label {
visible: perm != UserType.Member
visible: powerLevel > 0
text: {
switch (perm) {
case UserType.Owner:
return i18n("Owner");
case UserType.Admin:
return i18n("Admin");
case UserType.Moderator:
return i18n("Mod");
case UserType.Muted:
return i18n("Muted");
default:
return "";
}
}
text: powerLevelString
color: Kirigami.Theme.disabledTextColor
textFormat: Text.PlainText
wrapMode: Text.NoWrap

View File

@@ -44,10 +44,11 @@ Kirigami.ScrollablePage {
Repeater {
model: KSortFilterProxyModel {
sourceModel: userListModel
sortRole: "perm"
sortRole: "powerLevel"
sortOrder: Qt.DescendingOrder
filterRowCallback: function(source_row, source_parent) {
let permRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), Qt.UserRole + 5)
return permRole != UserType.Muted && permRole != UserType.Member;
let powerLevelRole = sourceModel.data(sourceModel.index(source_row, 0, source_parent), Qt.UserRole + 5)
return powerLevelRole > 0;
}
}
delegate: MobileForm.FormTextDelegate {
@@ -57,22 +58,7 @@ Kirigami.ScrollablePage {
spacing: Kirigami.Units.largeSpacing
QQC2.Label {
visible: !room.canSendState("m.room.power_levels")
text: {
switch (perm) {
case UserType.Owner:
return i18n("Owner");
case UserType.Admin:
return i18n("Admin");
case UserType.Moderator:
return i18n("Mod");
case UserType.Muted:
return i18n("Muted");
case UserType.Member:
return i18n("Member");
default:
return ""
}
}
text: powerLevelString
color: Kirigami.Theme.disabledTextColor
}
QQC2.ComboBox {
@@ -191,22 +177,9 @@ Kirigami.ScrollablePage {
}
trailing: QQC2.Label {
visible: perm != UserType.Member
visible: powerLevel > 0
text: {
switch (perm) {
case UserType.Owner:
return i18n("Owner");
case UserType.Admin:
return i18n("Admin");
case UserType.Moderator:
return i18n("Mod");
case UserType.Muted:
return i18n("Muted");
default:
return "";
}
}
text: powerLevelString
color: Kirigami.Theme.disabledTextColor
textFormat: Text.PlainText
wrapMode: Text.NoWrap

View File

@@ -95,48 +95,29 @@ QVariant UserListModel::data(const QModelIndex &index, int role) const
if (role == ObjectRole) {
return QVariant::fromValue(user);
}
if (role == PermRole) {
auto pl = m_currentRoom->getCurrentState<RoomPowerLevelsEvent>();
auto userPl = pl->powerLevelForUser(user->id());
if (userPl == pl->content().usersDefault) { // Shortcut
return UserType::Member;
}
if (userPl < pl->powerLevelForEvent("m.room.message")) {
return UserType::Muted;
}
auto userPls = pl->users();
int highestPl = pl->usersDefault();
QHash<QString, int>::const_iterator i = userPls.constBegin();
while (i != userPls.constEnd()) {
if (i.value() > highestPl) {
highestPl = i.value();
}
++i;
}
if (userPl == highestPl) {
return UserType::Owner;
}
if (userPl >= pl->powerLevelForState("m.room.power_levels")) {
return UserType::Admin;
}
if (userPl >= pl->ban() || userPl >= pl->kick() || userPl >= pl->redact()) {
return UserType::Moderator;
}
return UserType::Member;
}
if (role == PowerLevelRole) {
auto pl = m_currentRoom->getCurrentState<RoomPowerLevelsEvent>();
return pl->powerLevelForUser(user->id());
}
if (role == PowerLevelStringRole) {
#ifdef QUOTIENT_07
auto pl = m_currentRoom->currentState().get<RoomPowerLevelsEvent>();
#else
auto pl = m_currentRoom->getCurrentState<RoomPowerLevelsEvent>();
#endif
auto userPl = pl->powerLevelForUser(user->id());
switch (userPl) {
case 0:
return QStringLiteral("Member");
case 50:
return QStringLiteral("Moderator");
case 100:
return QStringLiteral("Admin");
default:
return QStringLiteral("Custom");
}
}
return {};
}
@@ -241,8 +222,8 @@ QHash<int, QByteArray> UserListModel::roleNames() const
roles[UserIdRole] = "userId";
roles[AvatarRole] = "avatar";
roles[ObjectRole] = "user";
roles[PermRole] = "perm";
roles[PowerLevelRole] = "powerLevel";
roles[PowerLevelStringRole] = "powerLevelString";
return roles;
}

View File

@@ -27,6 +27,7 @@ public:
Moderator,
Member,
Muted,
Custom,
};
Q_ENUM(Types)
};
@@ -41,8 +42,8 @@ public:
UserIdRole,
AvatarRole,
ObjectRole,
PermRole,
PowerLevelRole,
PowerLevelStringRole,
};
UserListModel(QObject *parent = nullptr);
@@ -57,8 +58,6 @@ public:
[[nodiscard]] QHash<int, QByteArray> roleNames() const override;
// Q_INVOKABLE
Q_SIGNALS:
void roomChanged();
void usersRefreshed();