From 224a5f3b2ed2141a94940fe73fc8ccb4b2f8d962 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 12 Nov 2022 15:07:16 +0100 Subject: Matrix: fix editing reply breaking body and formatted text, edits should always show latest edit, set read marker to proper latest message --- src/QuickMedia.cpp | 52 +++++++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 25 deletions(-) (limited to 'src/QuickMedia.cpp') 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(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(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(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(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(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(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(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); -- cgit v1.2.3