From db1bcd7b5aec3c3c814083b6d98020508f98ed13 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sat, 7 May 2022 02:30:16 +0200 Subject: [PATCH] Show powerlevels in memberlist --- resources/icons/ui/person.svg | 1 + resources/icons/ui/ribbon.svg | 1 + resources/icons/ui/ribbon_star.svg | 1 + resources/qml/dialogs/RoomMembers.qml | 35 +++++++++++++++++++++++++++ resources/res.qrc | 9 ++++--- src/MemberList.cpp | 1 + src/timeline/Permissions.cpp | 25 +++++++++++++++++++ src/timeline/Permissions.h | 4 +++ 8 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 resources/icons/ui/person.svg create mode 100644 resources/icons/ui/ribbon.svg create mode 100644 resources/icons/ui/ribbon_star.svg diff --git a/resources/icons/ui/person.svg b/resources/icons/ui/person.svg new file mode 100644 index 00000000..a9eb62ad --- /dev/null +++ b/resources/icons/ui/person.svg @@ -0,0 +1 @@ + diff --git a/resources/icons/ui/ribbon.svg b/resources/icons/ui/ribbon.svg new file mode 100644 index 00000000..5026f571 --- /dev/null +++ b/resources/icons/ui/ribbon.svg @@ -0,0 +1 @@ + diff --git a/resources/icons/ui/ribbon_star.svg b/resources/icons/ui/ribbon_star.svg new file mode 100644 index 00000000..3b6603bc --- /dev/null +++ b/resources/icons/ui/ribbon_star.svg @@ -0,0 +1 @@ + diff --git a/resources/qml/dialogs/RoomMembers.qml b/resources/qml/dialogs/RoomMembers.qml index 8a12e5bc..608a5acf 100644 --- a/resources/qml/dialogs/RoomMembers.qml +++ b/resources/qml/dialogs/RoomMembers.qml @@ -168,6 +168,41 @@ ApplicationWindow { Layout.fillWidth: true } + Image { + property bool isAdmin: room.permissions.changeLevel(MtxEvent.PowerLevels) <= model.powerlevel + property bool isModerator: room.permissions.redactLevel() <= model.powerlevel + //property bool isDefault: room.permissions.defaultLevel() <= model.powerlevel + + property string sourceUrl: { + if (isAdmin) + return "image://colorimage/:/icons/icons/ui/ribbon_star.svg?"; + else if (isModerator) + return "image://colorimage/:/icons/icons/ui/ribbon.svg?"; + else + return "image://colorimage/:/icons/icons/ui/person.svg?"; + } + + width: 16 + height: 16 + sourceSize.height: height * Screen.devicePixelRatio + sourceSize.width: width * Screen.devicePixelRatio + source: sourceUrl + (ma.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText) + ToolTip.visible: ma.hovered + ToolTip.text: { + if (isAdmin) + return qsTr("Administrator: %1").arg(model.powerlevel); + else if (isModerator) + return qsTr("Moderator: %1").arg(model.powerlevel); + else + return qsTr("User: %1").arg(model.powerlevel); + } + + HoverHandler { + id: ma + } + + } + EncryptionIndicator { id: encryptInd diff --git a/resources/res.qrc b/resources/res.qrc index 3ce63f42..35b06704 100644 --- a/resources/res.qrc +++ b/resources/res.qrc @@ -17,12 +17,15 @@ icons/ui/end-call.svg icons/ui/expanded.svg icons/ui/image-failed.svg + icons/ui/image.svg icons/ui/lowprio.svg icons/ui/microphone-mute.svg icons/ui/microphone-unmute.svg + icons/ui/music.svg icons/ui/options.svg icons/ui/pause-symbol.svg icons/ui/people.svg + icons/ui/person.svg icons/ui/picture-in-picture.svg icons/ui/pin-off.svg icons/ui/pin.svg @@ -31,6 +34,8 @@ icons/ui/power-off.svg icons/ui/refresh.svg icons/ui/reply.svg + icons/ui/ribbon.svg + icons/ui/ribbon_star.svg icons/ui/round-remove-button.svg icons/ui/screen-share.svg icons/ui/search.svg @@ -42,14 +47,12 @@ icons/ui/sticky-note-solid.svg icons/ui/tag.svg icons/ui/user-friends-solid.svg + icons/ui/video-file.svg icons/ui/video.svg icons/ui/volume-off-indicator.svg icons/ui/volume-up.svg icons/ui/world.svg - icons/ui/music.svg - icons/ui/image.svg icons/ui/zip.svg - icons/ui/video-file.svg icons/emoji-categories/activity.svg icons/emoji-categories/flags.svg icons/emoji-categories/foods.svg diff --git a/src/MemberList.cpp b/src/MemberList.cpp index fcd9d624..ff1b1a79 100644 --- a/src/MemberList.cpp +++ b/src/MemberList.cpp @@ -59,6 +59,7 @@ MemberListBackend::roleNames() const {DisplayName, "displayName"}, {AvatarUrl, "avatarUrl"}, {Trustlevel, "trustlevel"}, + {Powerlevel, "powerlevel"}, }; } diff --git a/src/timeline/Permissions.cpp b/src/timeline/Permissions.cpp index 917495a2..01d38599 100644 --- a/src/timeline/Permissions.cpp +++ b/src/timeline/Permissions.cpp @@ -63,6 +63,31 @@ Permissions::canSend(int eventType) qml_mtx_events::fromRoomEventType(static_cast(eventType)))); } +int +Permissions::defaultLevel() +{ + return pl.users_default; +} +int +Permissions::redactLevel() +{ + return pl.redact; +} +int +Permissions::changeLevel(int eventType) +{ + return + pl.state_level(to_string( + qml_mtx_events::fromRoomEventType(static_cast(eventType)))); +} +int +Permissions::sendLevel(int eventType) +{ + return + pl.event_level(to_string( + qml_mtx_events::fromRoomEventType(static_cast(eventType)))); +} + bool Permissions::canPingRoom() { diff --git a/src/timeline/Permissions.h b/src/timeline/Permissions.h index c0b47b37..1285f01d 100644 --- a/src/timeline/Permissions.h +++ b/src/timeline/Permissions.h @@ -25,6 +25,10 @@ public: Q_INVOKABLE bool canRedact(); Q_INVOKABLE bool canChange(int eventType); Q_INVOKABLE bool canSend(int eventType); + Q_INVOKABLE int defaultLevel(); + Q_INVOKABLE int redactLevel(); + Q_INVOKABLE int changeLevel(int eventType); + Q_INVOKABLE int sendLevel(int eventType); Q_INVOKABLE bool canPingRoom();