summary refs log tree commit diff
diff options
context:
space:
mode:
authorDeepBlueV7.X <nicolas.werner@hotmail.de>2023-08-10 08:19:32 +0000
committerGitHub <noreply@github.com>2023-08-10 08:19:32 +0000
commit70ede75aa595cef4277a00db01331ed7a4eec130 (patch)
tree185a2c4df9587ad5e1270f887562e4ffa5a23a22
parentMerge pull request #1523 from Nheko-Reborn/qmlFallbackAuth (diff)
parentSwap PL indicator location (diff)
downloadnheko-70ede75aa595cef4277a00db01331ed7a4eec130.tar.xz
Merge pull request #1535 from Nheko-Reborn/powerlevelsInTimeline
Show an indicator in the timeline for mods and admins
-rw-r--r--CMakeLists.txt1
-rw-r--r--resources/qml/MessageView.qml15
-rw-r--r--resources/qml/components/PowerlevelIndicator.qml42
-rw-r--r--resources/qml/dialogs/RoomMembers.qml37
-rw-r--r--src/timeline/TimelineModel.cpp9
-rw-r--r--src/timeline/TimelineModel.h1
6 files changed, 71 insertions, 34 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 119c5a54..6334565d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -729,6 +729,7 @@ set(QML_SOURCES
         resources/qml/components/MainWindowDialog.qml
         resources/qml/components/NhekoTabButton.qml
         resources/qml/components/NotificationBubble.qml
+        resources/qml/components/PowerlevelIndicator.qml
         resources/qml/components/ReorderableListview.qml
         resources/qml/components/SpaceMenuLevel.qml
         resources/qml/components/TextButton.qml
diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index af3a3371..a0ff0ff1 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -100,6 +100,7 @@ Item {
             required property string url
             required property string userId
             required property string userName
+            required property int userPowerlevel
 
             ListView.delayRemove: true
             anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined
@@ -119,6 +120,7 @@ Item {
                 property date timestamp: wrapper.timestamp
                 property string userId: wrapper.userId
                 property string userName: wrapper.userName
+                property int userPowerlevel: wrapper.userPowerlevel
 
                 active: previousMessageUserId !== userId || previousMessageDay !== day || previousMessageIsStateEvent !== isStateEvent
                 //asynchronous: true
@@ -562,14 +564,25 @@ Item {
 
                         target: room
                     }
+
                     AbstractButton {
                         id: userNameButton
 
+                        PowerlevelIndicator {
+                            id: powerlevelIndicator
+                            anchors.left: parent.left
+                            //anchors.horizontalCenter: parent.horizontalCenter
+
+                            powerlevel: userPowerlevel
+                            permissions: room ? room.permissions : null
+                            visible: isAdmin || isModerator
+                        }
+
                         ToolTip.delay: Nheko.tooltipDelay
                         ToolTip.text: userId
                         ToolTip.visible: hovered
+                        leftPadding: powerlevelIndicator.visible ? 16 : 0
                         leftInset: 0
-                        leftPadding: 0
                         rightInset: 0
                         rightPadding: 0
 
diff --git a/resources/qml/components/PowerlevelIndicator.qml b/resources/qml/components/PowerlevelIndicator.qml
new file mode 100644
index 00000000..4b826284
--- /dev/null
+++ b/resources/qml/components/PowerlevelIndicator.qml
@@ -0,0 +1,42 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import QtQuick
+import QtQuick.Controls
+import im.nheko
+
+Image {
+    required property int powerlevel
+    required property var permissions
+
+    readonly property bool isAdmin: permissions ? permissions.changeLevel(MtxEvent.PowerLevels) <= powerlevel : false
+    readonly property bool isModerator: permissions ? permissions.redactLevel() <= powerlevel : false
+    readonly property bool isDefault: permissions ? permissions.defaultLevel() <= powerlevel : false
+
+    readonly 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?";
+    }
+
+    sourceSize.width: 16
+    sourceSize.height: 16
+    source: sourceUrl + (ma.hovered ? palette.highlight : palette.buttonText)
+    ToolTip.visible: ma.hovered
+    ToolTip.text: {
+        if (isAdmin)
+            return qsTr("Administrator: %1").arg(powerlevel);
+        else if (isModerator)
+            return qsTr("Moderator: %1").arg(powerlevel);
+        else
+            return qsTr("User: %1").arg(powerlevel);
+    }
+
+    HoverHandler {
+        id: ma
+    }
+}
diff --git a/resources/qml/dialogs/RoomMembers.qml b/resources/qml/dialogs/RoomMembers.qml
index bbf1605d..64f21381 100644
--- a/resources/qml/dialogs/RoomMembers.qml
+++ b/resources/qml/dialogs/RoomMembers.qml
@@ -4,6 +4,7 @@
 
 import ".."
 import "../ui"
+import "../components"
 import QtQuick 2.12
 import QtQuick.Controls 2.12
 import QtQuick.Layouts 1.12
@@ -159,39 +160,9 @@ ApplicationWindow {
 
                         }
 
-                        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?";
-                            }
-
-                            Layout.preferredWidth: 16
-                            Layout.preferredHeight: 16
-                            sourceSize.width: width
-                            sourceSize.height: height
-                            source: sourceUrl + (ma.hovered ? palette.highlight : palette.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
-                            }
-
+                        PowerlevelIndicator {
+                            powerlevel: model.powerlevel
+                            permissions: room.permissions
                         }
 
                         EncryptionIndicator {
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index fddd5700..b2a036c5 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -535,6 +535,7 @@ TimelineModel::roleNames() const
       {IsSender, "isSender"},
       {UserId, "userId"},
       {UserName, "userName"},
+      {UserPowerlevel, "userPowerlevel"},
       {Day, "day"},
       {Timestamp, "timestamp"},
       {Url, "url"},
@@ -597,6 +598,14 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
         return QVariant(QString::fromStdString(acc::sender(event)));
     case UserName:
         return QVariant(displayName(QString::fromStdString(acc::sender(event))));
+    case UserPowerlevel: {
+        return static_cast<qlonglong>(mtx::events::state::PowerLevels{
+          cache::client()
+            ->getStateEvent<mtx::events::state::PowerLevels>(room_id_.toStdString())
+            .value_or(mtx::events::StateEvent<mtx::events::state::PowerLevels>{})
+            .content}
+                                        .user_level(acc::sender(event)));
+    }
 
     case Day: {
         QDateTime prevDate = origin_server_ts(event);
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 64941920..fccc99eb 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -241,6 +241,7 @@ public:
         IsSender,
         UserId,
         UserName,
+        UserPowerlevel,
         Day,
         Timestamp,
         Url,