From a98911daeb80ab8028dfd425d07d19471e936448 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 13 Nov 2022 22:25:03 +0100 Subject: Matrix: allow pinning a message if no message has ever been pinned before in the room, fix get_previous_message spam when reaching top sometimes, fit card view cutting off bottom text (description) --- src/QuickMedia.cpp | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 74cd4a1..ea74c09 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -6214,6 +6214,7 @@ namespace QuickMedia { Messages messages; MessageDirection message_dir; bool reached_end = false; + bool success = true; }; AsyncTask fetch_messages_future; MessageDirection fetch_messages_dir = MessageDirection::BEFORE; @@ -6739,49 +6740,68 @@ namespace QuickMedia { move_room = true; }; - std::function on_top_reached = [this, &fetch_messages_future, &fetch_messages_dir, &ui_tabs, &MESSAGES_TAB_INDEX, &gradient_inc, current_room, &before_token, &after_token, &fetched_enough_messages_top] { + mgl::Clock fetch_previous_messages_retry_timer; + double fetch_previous_messages_timeout = 0.0; + + std::function on_top_reached = [&] { const int selected_tab = ui_tabs.get_selected(); if(fetched_enough_messages_top || fetch_messages_future.valid() || selected_tab != MESSAGES_TAB_INDEX) return; + if(fetch_previous_messages_retry_timer.get_elapsed_time_seconds() < fetch_previous_messages_timeout) + return; + + fetch_previous_messages_retry_timer.restart(); gradient_inc = 0; if(before_token.empty() && after_token.empty()) { fetch_messages_dir = MessageDirection::BEFORE; - fetch_messages_future = AsyncTask([this, current_room]() { + fetch_messages_future = AsyncTask([&]() { FetchMessagesResult messages; messages.message_dir = MessageDirection::BEFORE; messages.reached_end = false; - if(matrix->get_previous_room_messages(current_room, messages.messages, false, &messages.reached_end) != PluginResult::OK) + if(matrix->get_previous_room_messages(current_room, messages.messages, false, &messages.reached_end) != PluginResult::OK) { fprintf(stderr, "Failed to get previous matrix messages in room: %s\n", current_room->id.c_str()); + messages.success = false; + } else { + messages.success = true; + } return messages; }); } else if(!before_token.empty()) { fetch_messages_dir = MessageDirection::BEFORE; - fetch_messages_future = AsyncTask([this, current_room, &before_token]() { + fetch_messages_future = AsyncTask([&]() { std::string token = before_token; FetchMessagesResult messages; messages.message_dir = MessageDirection::BEFORE; messages.reached_end = false; - if(matrix->get_messages_in_direction(current_room, token, MessageDirection::BEFORE, messages.messages, before_token) != PluginResult::OK) + if(matrix->get_messages_in_direction(current_room, token, MessageDirection::BEFORE, messages.messages, before_token) != PluginResult::OK) { fprintf(stderr, "Failed to get previous matrix messages in room: %s\n", current_room->id.c_str()); + messages.success = false; + } else { + messages.success = true; + } messages.reached_end = before_token.empty(); return messages; }); } }; - std::function on_bottom_reached = [this, &fetch_messages_future, &fetch_messages_dir, &ui_tabs, &MESSAGES_TAB_INDEX, &gradient_inc, current_room, &after_token, &fetched_enough_messages_bottom] { + std::function on_bottom_reached = [&] { const int selected_tab = ui_tabs.get_selected(); if(!fetched_enough_messages_bottom && !after_token.empty() && !fetch_messages_future.valid() && selected_tab == MESSAGES_TAB_INDEX) { fetch_messages_dir = MessageDirection::AFTER; gradient_inc = 0; - fetch_messages_future = AsyncTask([this, current_room, &after_token]() { + fetch_messages_future = AsyncTask([&]() { std::string token = after_token; FetchMessagesResult messages; messages.message_dir = MessageDirection::AFTER; messages.reached_end = false; - if(matrix->get_messages_in_direction(current_room, token, MessageDirection::AFTER, messages.messages, after_token) != PluginResult::OK) + if(matrix->get_messages_in_direction(current_room, token, MessageDirection::AFTER, messages.messages, after_token) != PluginResult::OK) { fprintf(stderr, "Failed to get next matrix messages in room: %s\n", current_room->id.c_str()); + messages.success = false; + } else { + messages.success = true; + } messages.reached_end = after_token.empty(); return messages; }); @@ -7425,6 +7445,11 @@ namespace QuickMedia { FetchMessagesResult new_messages_result = fetch_messages_future.get(); all_messages.insert(all_messages.end(), new_messages_result.messages.begin(), new_messages_result.messages.end()); + if(new_messages_result.success) + fetch_previous_messages_timeout = 0.0; + else + fetch_previous_messages_timeout = 4.0; + if(new_messages_result.message_dir == MessageDirection::BEFORE) fetched_enough_messages_top = new_messages_result.reached_end; if(new_messages_result.message_dir == MessageDirection::AFTER) -- cgit v1.2.3