diff options
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r-- | src/QuickMedia.cpp | 63 |
1 files changed, 59 insertions, 4 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 1bb7a04..d9b1041 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -3076,7 +3076,7 @@ namespace QuickMedia { body_item->url = message->url; body_item->set_author_color(message->user->display_name_color); body_item->userdata = (void*)message; // Note: message has to be valid as long as body_item is used! - if(message->related_event_type == RelatedEventType::REDACTION || message->related_event_type == RelatedEventType::EDIT) + if(message->related_event_type == RelatedEventType::REDACTION || message->related_event_type == RelatedEventType::EDIT || message->related_event_type == RelatedEventType::REACTION) body_item->visible = false; if(message_contains_user_mention(message->body, my_display_name) || message_contains_user_mention(message->body, my_user_id)) body_item->set_description_color(sf::Color(255, 100, 100)); @@ -3218,8 +3218,8 @@ namespace QuickMedia { body_item->embedded_item = nullptr; body_item->embedded_item_status = FetchStatus::NONE; message->type = MessageType::REDACTION; - message->related_event_id.clear(); - message->related_event_type = RelatedEventType::NONE; + //message->related_event_id.clear(); + //message->related_event_type = RelatedEventType::NONE; body_item->thumbnail_url = current_room->get_user_avatar_url(message->user); body_item->thumbnail_mask_type = ThumbnailMaskType::CIRCLE; body_item->set_description("Message deleted"); @@ -3253,7 +3253,7 @@ namespace QuickMedia { } }; - // TODO: Optimize with hash map? + // TODO: Optimize find_body_item_by_event_id hash map? auto modify_related_messages_in_current_room = [&set_body_as_deleted, &unreferenced_events, &find_body_item_by_event_id, &tabs](Messages &messages) { if(messages.empty()) return; @@ -3279,6 +3279,53 @@ namespace QuickMedia { } }; + std::vector<std::shared_ptr<Message>> unresolved_reactions; + // TODO: Optimize find_body_item_by_event_id hash map? + auto process_reactions = [&tabs, &find_body_item_by_event_id, &unresolved_reactions, ¤t_room](Messages &messages) { + if(messages.empty()) + return; + + auto &body_items = tabs[MESSAGES_TAB_INDEX].body->items; + + // TODO: Check in |messages| instead + for(auto it = unresolved_reactions.begin(); it != unresolved_reactions.end();) { + auto body_item = find_body_item_by_event_id(body_items.data(), body_items.size(), (*it)->related_event_id); + if(body_item) { + body_item->add_reaction(current_room->get_user_display_name((*it)->user) + ": " + (*it)->body, (*it).get()); + it = unresolved_reactions.erase(it); + } else { + ++it; + } + } + + for(auto &message : messages) { + if(message->type == MessageType::REACTION) { + auto body_item = find_body_item_by_event_id(body_items.data(), body_items.size(), message->related_event_id); + if(body_item) + body_item->add_reaction(current_room->get_user_display_name(message->user) + ": " + message->body, message.get()); + else + unresolved_reactions.push_back(message); + } else if(message->type == MessageType::REDACTION) { + auto body_item = find_body_item_by_event_id(body_items.data(), body_items.size(), message->related_event_id); + if(body_item && static_cast<Message*>(body_item->userdata)) { + Message *reaction_message = static_cast<Message*>(body_item->userdata); + if(reaction_message->type == MessageType::REACTION) { + auto body_item = find_body_item_by_event_id(body_items.data(), body_items.size(), reaction_message->related_event_id); + if(body_item) + body_item->remove_reaction_by_userdata(reaction_message); + } + } else { + for(auto it = unresolved_reactions.begin(); it != unresolved_reactions.end(); ++it) { + if(message->related_event_id == (*it)->event_id) { + unresolved_reactions.erase(it); + break; + } + } + } + } + } + }; + auto pinned_body_items_contains_event = [&tabs](const std::string &event_id) { for(auto &body_item : tabs[PINNED_TAB_INDEX].body->items) { if(static_cast<PinnedEventData*>(body_item->userdata)->event_id == event_id) @@ -3345,6 +3392,7 @@ namespace QuickMedia { auto me = matrix->get_me(current_room); tabs[MESSAGES_TAB_INDEX].body->insert_items_by_timestamps(messages_to_body_items(current_room, all_messages, current_room->get_user_display_name(me), me->user_id)); modify_related_messages_in_current_room(all_messages); + process_reactions(all_messages); tabs[MESSAGES_TAB_INDEX].body->select_last_item(); std::vector<std::string> pinned_events; @@ -4059,6 +4107,8 @@ namespace QuickMedia { if((selected_tab == MESSAGES_TAB_INDEX || selected_tab == PINNED_TAB_INDEX) && event.key.code == sf::Keyboard::Enter) { BodyItem *selected = tabs[selected_tab].body->get_selected(); if(selected) { + Message *mess = static_cast<Message*>(selected->userdata); + fprintf(stderr, "Mess type: %d\n", mess->type); if(!display_url_or_image(selected)) display_url_or_image(selected->embedded_item.get()); } @@ -4268,6 +4318,7 @@ namespace QuickMedia { cleanup_tasks(); tabs.clear(); unreferenced_events.clear(); + unresolved_reactions.clear(); all_messages.clear(); new_page = PageType::CHAT; matrix->stop_sync(); @@ -4388,6 +4439,7 @@ namespace QuickMedia { } add_new_messages_to_current_room(sync_data.messages); modify_related_messages_in_current_room(sync_data.messages); + process_reactions(sync_data.messages); process_pinned_events(sync_data.pinned_events); if(set_read_marker_future.ready()) { @@ -4418,6 +4470,7 @@ namespace QuickMedia { tabs[MESSAGES_TAB_INDEX].body->set_selected_item(selected_item_index); } modify_related_messages_in_current_room(new_messages); + process_reactions(new_messages); // TODO: Do not loop all items, only loop the new items resolve_unreferenced_events_with_body_items(tabs[MESSAGES_TAB_INDEX].body->items.data(), tabs[MESSAGES_TAB_INDEX].body->items.size()); } @@ -4653,6 +4706,8 @@ namespace QuickMedia { filter_sent_messages(all_messages_new); add_new_messages_to_current_room(all_messages_new); modify_related_messages_in_current_room(all_messages_new); + unresolved_reactions.clear(); + process_reactions(all_messages_new); std::vector<std::string> pinned_events; matrix->get_all_pinned_events(current_room, pinned_events); |