From 6b983332af83a06a38780cdaa0d99c4592eab089 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Tue, 12 Jan 2021 21:55:23 +0100 Subject: [PATCH] Fix edited message appearing two times in the timeline --- imports/NeoChat/Component/Timeline/TextDelegate.qml | 3 ++- imports/NeoChat/Page/RoomPage.qml | 6 ++++-- src/messageeventmodel.cpp | 13 +++++++++++++ src/messageeventmodel.h | 1 + 4 files changed, 20 insertions(+), 3 deletions(-) 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,