diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index f94fc4a9..8e6ad8d2 100644
--- a/resources/qml/MessageView.qml
+++ b/resources/qml/MessageView.qml
@@ -415,6 +415,7 @@ Item {
required property string callType
required property var reactions
required property int trustlevel
+ required property int notificationlevel
required property int encryptionError
required property var timestamp
required property int status
@@ -482,6 +483,7 @@ Item {
callType: wrapper.callType
reactions: wrapper.reactions
trustlevel: wrapper.trustlevel
+ notificationlevel: wrapper.notificationlevel
encryptionError: wrapper.encryptionError
timestamp: wrapper.timestamp
status: wrapper.status
diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index 181b64ff..01e58cdf 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -41,6 +41,7 @@ AbstractButton {
required property string callType
required property var reactions
required property int trustlevel
+ required property int notificationlevel
required property int encryptionError
required property int duration
required property var timestamp
@@ -117,6 +118,8 @@ AbstractButton {
property color bgColor: Nheko.colors.base
color: (Settings.bubbles && !isStateEvent) ? Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.2)) : "#00000000"
radius: 4
+ border.width: r.notificationlevel == MtxEvent.Highlight ? 2 : 0
+ border.color: Nheko.theme.red
GridLayout {
anchors {
diff --git a/src/ChatPage.h b/src/ChatPage.h
index 1bb25dc2..6e1095b9 100644
--- a/src/ChatPage.h
+++ b/src/ChatPage.h
@@ -78,6 +78,11 @@ public:
//! Check if the given room is currently open.
bool isRoomActive(const QString &room_id);
+ const std::unique_ptr<mtx::pushrules::PushRuleEvaluator> &pushruleEvaluator() const
+ {
+ return pushrules;
+ }
+
public slots:
bool handleMatrixUri(QString uri);
bool handleMatrixUri(const QUrl &uri);
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 6cf361aa..b20e36bc 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -526,6 +526,7 @@ TimelineModel::roleNames() const
{IsEncrypted, "isEncrypted"},
{IsStateEvent, "isStateEvent"},
{Trustlevel, "trustlevel"},
+ {Notificationlevel, "notificationlevel"},
{EncryptionError, "encryptionError"},
{ReplyTo, "replyTo"},
{ThreadId, "threadId"},
@@ -737,6 +738,26 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
return crypto::Trust::Unverified;
}
+ case Notificationlevel: {
+ const auto &push = ChatPage::instance()->pushruleEvaluator();
+ if (push) {
+ auto actions = push->evaluate({event}, pushrulesRoomContext());
+ if (std::find(actions.begin(),
+ actions.end(),
+ mtx::pushrules::actions::Action{
+ mtx::pushrules::actions::set_tweak_highlight{}}) != actions.end()) {
+ return qml_mtx_events::NotificationLevel::Highlight;
+ }
+ if (std::find(actions.begin(),
+ actions.end(),
+ mtx::pushrules::actions::Action{mtx::pushrules::actions::notify{}}) !=
+ actions.end()) {
+ return qml_mtx_events::NotificationLevel::Notify;
+ }
+ }
+ return qml_mtx_events::NotificationLevel::Nothing;
+ }
+
case EncryptionError:
return events.decryptionError(event_id(event));
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 8bf18f19..9cd60e5d 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -151,6 +151,14 @@ enum EventState
Empty,
};
Q_ENUM_NS(EventState)
+
+enum NotificationLevel
+{
+ Nothing,
+ Notify,
+ Highlight,
+};
+Q_ENUM_NS(NotificationLevel)
}
class StateKeeper
@@ -242,6 +250,7 @@ public:
IsEncrypted,
IsStateEvent,
Trustlevel,
+ Notificationlevel,
EncryptionError,
ReplyTo,
ThreadId,
|