aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp59
1 files changed, 33 insertions, 26 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 71ba8d2..f66d419 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -3364,7 +3364,8 @@ namespace QuickMedia {
std::string event_id;
};
- std::vector<ProvisionalMessage> unresolved_provisional_messages; // |event_id| is always empty in this. Use |message->event_id| instead
+ // This is needed to keep the message shared ptr alive. TODO: Remove this shit, maybe even use raw pointers.
+ std::unordered_map<std::string, ProvisionalMessage> sent_messages; // |event_id| is always empty in this. Use |message->event_id| instead
std::optional<ProvisionalMessage> provisional_message;
MessageQueue<ProvisionalMessage> provisional_message_queue;
MessageQueue<std::function<ProvisionalMessage()>> post_task_queue;
@@ -3378,22 +3379,21 @@ namespace QuickMedia {
};
std::thread post_thread(post_thread_handler);
- auto resolve_provisional_messages = [&unresolved_provisional_messages](Messages &messages) {
- if(messages.empty() || unresolved_provisional_messages.empty())
- return;
+ auto filter_my_messages = [&me](Messages &messages) {
+ for(auto it = messages.begin(); it != messages.end();) {
+ if((*it)->user == me)
+ it = messages.erase(it);
+ else
+ ++it;
+ }
+ };
- for(auto it = unresolved_provisional_messages.begin(); it != unresolved_provisional_messages.end();) {
- auto find_it = std::find_if(messages.cbegin(), messages.cend(), [&it](const std::shared_ptr<Message> &message) {
- return message->event_id == it->message->event_id;
- });
- if(find_it != messages.end()) {
- it->body_item->set_description_color(sf::Color::White);
- it->body_item->userdata = find_it->get(); // This is ok because the message is added to |all_messages|
- it = unresolved_provisional_messages.erase(it);
- messages.erase(find_it);
- } else {
+ auto filter_sent_messages = [&sent_messages](Messages &messages) {
+ for(auto it = messages.begin(); it != messages.end();) {
+ if(sent_messages.find((*it)->event_id) != sent_messages.end())
+ it = messages.erase(it);
+ else
++it;
- }
}
};
@@ -3414,7 +3414,7 @@ namespace QuickMedia {
tabs[MESSAGES_TAB_INDEX].body->select_last_item();
}
};
-
+
chat_input.on_submit_callback = [this, &tabs, &me, &chat_input, &selected_tab, &current_room, &new_page, &chat_state, &currently_operating_on_item, &post_task_queue, &unreferenced_events, &find_body_item_by_event_id](std::string text) mutable {
if(!current_room)
return false;
@@ -3509,14 +3509,17 @@ namespace QuickMedia {
void *related_to_message = currently_operating_on_item->userdata;
message->related_event_type = RelatedEventType::EDIT;
message->related_event_id = static_cast<Message*>(related_to_message)->event_id;
- auto body_item = find_body_item_by_event_id(tabs[MESSAGES_TAB_INDEX].body->items.data(), tabs[MESSAGES_TAB_INDEX].body->items.size(), message->related_event_id);
+ size_t body_item_index = 0;
+ auto body_item = find_body_item_by_event_id(tabs[MESSAGES_TAB_INDEX].body->items.data(), tabs[MESSAGES_TAB_INDEX].body->items.size(), message->related_event_id, &body_item_index);
if(body_item) {
- body_item->set_description(text);
- body_item->set_description_color(provisional_message_color);
- unreferenced_events.push_back(message);
- post_task_queue.push([this, &current_room, text, related_to_message, message]() {
+ auto body_item_shared_ptr = tabs[MESSAGES_TAB_INDEX].body->items[body_item_index];
+ body_item_shared_ptr->set_description(text);
+ body_item_shared_ptr->set_description_color(provisional_message_color);
+ //unreferenced_events.push_back(message);
+ post_task_queue.push([this, &current_room, text, related_to_message, message, body_item_shared_ptr]() {
ProvisionalMessage provisional_message;
provisional_message.message = message;
+ provisional_message.body_item = body_item_shared_ptr;
if(matrix->post_edit(current_room, text, related_to_message, provisional_message.event_id) != PluginResult::OK)
fprintf(stderr, "Failed to post matrix edit\n");
return provisional_message;
@@ -3900,7 +3903,7 @@ namespace QuickMedia {
}
};
- auto cleanup_tasks = [&set_read_marker_future, &fetch_message_future, &typing_state_queue, &typing_state_thread, &post_task_queue, &provisional_message_queue, &post_thread, &tabs]() {
+ auto cleanup_tasks = [&set_read_marker_future, &fetch_message_future, &typing_state_queue, &typing_state_thread, &post_task_queue, &provisional_message_queue, &fetched_messages_set, &sent_messages, &post_thread, &tabs]() {
set_read_marker_future.cancel();
fetch_message_future.cancel();
typing_state_queue.close();
@@ -3914,6 +3917,8 @@ namespace QuickMedia {
post_thread.join();
}
provisional_message_queue.clear();
+ fetched_messages_set.clear();
+ sent_messages.clear();
//unreferenced_event_by_room.clear();
@@ -4327,7 +4332,8 @@ namespace QuickMedia {
if(!provisional_message->event_id.empty()) {
provisional_message->message->event_id = std::move(provisional_message->event_id);
- unresolved_provisional_messages.push_back(provisional_message.value());
+ provisional_message->body_item->set_description_color(sf::Color::White);
+ sent_messages[provisional_message->message->event_id] = std::move(provisional_message.value());
} else if(provisional_message->body_item) {
provisional_message->body_item->set_description("Failed to send: " + provisional_message->body_item->get_description());
provisional_message->body_item->set_description_color(sf::Color::Red);
@@ -4340,7 +4346,7 @@ namespace QuickMedia {
matrix->get_room_sync_data(current_room, sync_data);
if(!sync_data.messages.empty()) {
all_messages.insert(all_messages.end(), sync_data.messages.begin(), sync_data.messages.end());
- resolve_provisional_messages(sync_data.messages);
+ filter_my_messages(sync_data.messages);
filter_existing_messages(sync_data.messages);
}
add_new_messages_to_current_room(sync_data.messages);
@@ -4358,6 +4364,7 @@ namespace QuickMedia {
all_messages.insert(all_messages.end(), new_messages.begin(), new_messages.end());
if(new_messages.empty())
fetched_enough_messages = true;
+ filter_sent_messages(new_messages);
filter_existing_messages(new_messages);
fprintf(stderr, "Finished fetching older messages, num new messages: %zu\n", new_messages.size());
bool move_to_bottom = false;
@@ -4603,8 +4610,8 @@ namespace QuickMedia {
fetched_messages_set.insert(message->event_id);
}
all_messages.insert(all_messages.end(), all_messages_new.begin(), all_messages_new.end());
- auto me = matrix->get_me(current_room);
- resolve_provisional_messages(all_messages_new);
+ me = matrix->get_me(current_room);
+ filter_sent_messages(all_messages_new);
add_new_messages_to_current_room(all_messages_new);
modify_related_messages_in_current_room(all_messages_new);