Show an indicator in the timeline for mods and admins

This commit is contained in:
Loren Burkholder 2023-07-23 18:04:28 -04:00
parent 6926db6af4
commit 1c867dbbc2
6 changed files with 66 additions and 33 deletions

View file

@ -731,6 +731,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

View file

@ -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
@ -625,6 +627,13 @@ Item {
target: Presence
}
}
PowerlevelIndicator {
Layout.alignment: Qt.AlignVCenter
powerlevel: userPowerlevel
permissions: room ? room.permissions : null
visible: isAdmin || isModerator
}
}
}
}

View file

@ -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
}
}

View file

@ -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 {

View file

@ -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);

View file

@ -241,6 +241,7 @@ public:
IsSender,
UserId,
UserName,
UserPowerlevel,
Day,
Timestamp,
Url,