diff --git a/imports/NeoChat/Component/Timeline/TextDelegate.qml b/imports/NeoChat/Component/Timeline/TextDelegate.qml
index 95931c1ac..5564877b6 100644
--- a/imports/NeoChat/Component/Timeline/TextDelegate.qml
+++ b/imports/NeoChat/Component/Timeline/TextDelegate.qml
@@ -15,7 +15,8 @@ TextEdit {
property bool isEmote: false
- text: "" + (isEmote ? "* " + author.displayName + " " : "") + display
+ text: "" + (isEmote ? "* " + author.displayName + " " : "") + display + (isEdited ? (" " + i18n("(edited)") + "") : "")
+
color: Kirigami.Theme.textColor
font.pointSize: isEmoji.test(display) ? Kirigami.Theme.defaultFont.pointSize * 4 : Kirigami.Theme.defaultFont.pointSize
diff --git a/imports/NeoChat/Page/RoomPage.qml b/imports/NeoChat/Page/RoomPage.qml
index 0238f39df..fd0db8ef6 100644
--- a/imports/NeoChat/Page/RoomPage.qml
+++ b/imports/NeoChat/Page/RoomPage.qml
@@ -220,12 +220,14 @@ Kirigami.ScrollablePage {
filterRowCallback: Config.showLeaveJoinEvent ? dontFilterLeaveJoin : filterLeaveJoin
function dontFilterLeaveJoin(row, parent) {
- return messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.MessageRole) !== 0x10
+ return messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.SpecialMarksRole) !== EventStatus.Hidden
+ && messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.MessageRole) !== 0x10
&& messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.EventTypeRole) !== "other";
}
function filterLeaveJoin(row, parent) {
- return messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.MessageRole) !== 0x10
+ return messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.SpecialMarksRole) !== EventStatus.Hidden
+ && messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.MessageRole) !== 0x10
&& messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.EventTypeRole) !== "other"
&& messageEventModel.data(messageEventModel.index(row, 0), MessageEventModel.EventTypeRole) !== "state";
}
diff --git a/src/messageeventmodel.cpp b/src/messageeventmodel.cpp
index 14d354cd6..91dffd7bd 100644
--- a/src/messageeventmodel.cpp
+++ b/src/messageeventmodel.cpp
@@ -44,6 +44,7 @@ QHash MessageEventModel::roleNames() const
roles[ShowAuthorRole] = "showAuthor";
roles[ShowSectionRole] = "showSection";
roles[ReactionRole] = "reaction";
+ roles[IsEditedRole] = "isEdited";
return roles;
}
@@ -416,6 +417,11 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
}
}
+ // isReplacement?
+ if (auto e = eventCast(&evt))
+ if (!e->replacedEvent().isEmpty())
+ return EventStatus::Hidden;
+
if (is(evt) || is(evt)) {
return EventStatus::Hidden;
}
@@ -440,6 +446,13 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
return EventStatus::Normal;
}
+ if (role == IsEditedRole) {
+ if (auto e = eventCast(&evt)) {
+ return !e->unsignedJson().isEmpty() && e->unsignedJson().contains("m.relations") && e->unsignedJson()["m.relations"].toObject().contains("m.replace");
+ }
+ return false;
+ }
+
if (role == EventIdRole) {
return !evt.id().isEmpty() ? evt.id() : evt.transactionId();
}
diff --git a/src/messageeventmodel.h b/src/messageeventmodel.h
index 5c6d8c767..4b25d03c7 100644
--- a/src/messageeventmodel.h
+++ b/src/messageeventmodel.h
@@ -39,6 +39,7 @@ public:
ShowSectionRole,
ReactionRole,
+ IsEditedRole,
// For debugging
EventResolvedTypeRole,