diff options
author | DeepBlueV7.X <nicolas.werner@hotmail.de> | 2023-08-10 08:19:32 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-10 08:19:32 +0000 |
commit | 70ede75aa595cef4277a00db01331ed7a4eec130 (patch) | |
tree | 185a2c4df9587ad5e1270f887562e4ffa5a23a22 | |
parent | Merge pull request #1523 from Nheko-Reborn/qmlFallbackAuth (diff) | |
parent | Swap PL indicator location (diff) | |
download | nheko-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.txt | 1 | ||||
-rw-r--r-- | resources/qml/MessageView.qml | 15 | ||||
-rw-r--r-- | resources/qml/components/PowerlevelIndicator.qml | 42 | ||||
-rw-r--r-- | resources/qml/dialogs/RoomMembers.qml | 37 | ||||
-rw-r--r-- | src/timeline/TimelineModel.cpp | 9 | ||||
-rw-r--r-- | src/timeline/TimelineModel.h | 1 |
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, |