aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2022-11-12 15:07:16 +0100
committerdec05eba <dec05eba@protonmail.com>2022-11-12 15:07:16 +0100
commit224a5f3b2ed2141a94940fe73fc8ccb4b2f8d962 (patch)
tree4a51b48205042279d7cdfa065ae55120a09cc9d9 /src/QuickMedia.cpp
parent4197fd3d7aaa84197eb17e700fb27093293f228b (diff)
Matrix: fix editing reply breaking body and formatted text, edits should always show latest edit, set read marker to proper latest message
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp52
1 files changed, 27 insertions, 25 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 57f54a4..e8c76d7 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -5630,16 +5630,18 @@ namespace QuickMedia {
} else {
// TODO: Properly check reply message objects for mention of user instead of message data, but only when synapse fixes that notifications
// are not triggered by reply to a message with our display name/user id.
- Message *edited_message_ref = static_cast<Message*>(body_item->userdata);
- std::string qm_formatted_text = message_to_qm_text(matrix, message.get());
-
- body_item->set_description(std::move(qm_formatted_text));
- if(message->user != me && message_contains_user_mention(matrix, message.get(), my_display_name, me->user_id))
- body_item->set_description_color(get_theme().attention_alert_text_color, true);
- else
- body_item->set_description_color(get_theme().text_color);
- message->replaces = edited_message_ref;
- edited_message_ref->replaced_by = message;
+ Message *edited_message_ref = get_latest_message_in_edit_chain(static_cast<Message*>(body_item->userdata));
+ if(message->timestamp > edited_message_ref->timestamp) {
+ std::string qm_formatted_text = message_to_qm_text(matrix, message.get());
+
+ body_item->set_description(std::move(qm_formatted_text));
+ if(message->user != me && message_contains_user_mention(matrix, message.get(), my_display_name, me->user_id))
+ body_item->set_description_color(get_theme().attention_alert_text_color, true);
+ else
+ body_item->set_description_color(get_theme().text_color);
+ message->replaces = edited_message_ref;
+ edited_message_ref->replaced_by = message;
+ }
}
it = unreferenced_events.erase(it);
} else {
@@ -5671,16 +5673,18 @@ namespace QuickMedia {
} else {
// TODO: Properly check reply message objects for mention of user instead of message data, but only when synapse fixes that notifications
// are not triggered by reply to a message with our display name/user id.
- Message *edited_message_ref = static_cast<Message*>(body_item->userdata);
- std::string qm_formatted_text = formatted_text_to_qm_text(matrix, message->body.c_str(), message->body.size(), true);
-
- body_item->set_description(std::move(qm_formatted_text));
- if(message->user != me && message_contains_user_mention(matrix, message.get(), my_display_name, me->user_id))
- body_item->set_description_color(get_theme().attention_alert_text_color, true);
- else
- body_item->set_description_color(get_theme().text_color);
- message->replaces = edited_message_ref;
- edited_message_ref->replaced_by = message;
+ Message *edited_message_ref = get_latest_message_in_edit_chain(static_cast<Message*>(body_item->userdata));
+ if(message->timestamp > edited_message_ref->timestamp) {
+ std::string qm_formatted_text = formatted_text_to_qm_text(matrix, message->body.c_str(), message->body.size(), true);
+
+ body_item->set_description(std::move(qm_formatted_text));
+ if(message->user != me && message_contains_user_mention(matrix, message.get(), my_display_name, me->user_id))
+ body_item->set_description_color(get_theme().attention_alert_text_color, true);
+ else
+ body_item->set_description_color(get_theme().text_color);
+ message->replaces = edited_message_ref;
+ edited_message_ref->replaced_by = message;
+ }
}
} else {
unreferenced_events.push_back(message);
@@ -7588,8 +7592,8 @@ namespace QuickMedia {
// TODO: Only set read marker once every second if the message is not the last message in the room
auto body_items = tabs[selected_tab].body->get_items();
int last_timeline_message = (int)body_items.size() - 1;
- for(int i = last_timeline_message - 1; i >= 0; --i) {
- BodyItem *item = body_items[i].get();
+ for(; last_timeline_message >= 0; --last_timeline_message) {
+ BodyItem *item = body_items[last_timeline_message].get();
Message *message = static_cast<Message*>(item->userdata);
if(item->visible && message && message_is_timeline(message))
break;
@@ -7604,9 +7608,7 @@ namespace QuickMedia {
// TODO: Maybe set this instead when the mention is visible on the screen?
current_room->unread_notification_count = 0;
- Message *read_message = static_cast<Message*>(body_items[last_timeline_message]->userdata);
- if(read_message->replaced_by)
- read_message = read_message->replaced_by.get();
+ Message *read_message = get_latest_message_in_edit_chain(static_cast<Message*>(body_items[last_timeline_message]->userdata));
// TODO: What if two messages have the same timestamp?
if(!read_message->event_id.empty() && read_message->timestamp > current_room->last_read_message_timestamp) {
matrix_chat_page->set_room_as_read(current_room);