From 3609429b3d8fccd99994dde015b6516376e6835b Mon Sep 17 00:00:00 2001 From: dec05eba Date: Thu, 20 May 2021 05:20:49 +0200 Subject: Move chat page room list logic to matrix delegate --- src/QuickMedia.cpp | 118 ++++++----------------------------------------------- 1 file changed, 12 insertions(+), 106 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 5bbcfd7..a9956d3 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -3952,11 +3952,13 @@ namespace QuickMedia { Tabs ui_tabs(&rounded_rectangle_shader, sf::Color::Transparent); const int PINNED_TAB_INDEX = ui_tabs.add_tab("Pinned messages (0)"); const int MESSAGES_TAB_INDEX = ui_tabs.add_tab("Messages"); - const int USERS_TAB_INDEX = ui_tabs.add_tab("Users"); + const int USERS_TAB_INDEX = ui_tabs.add_tab("Users (0)"); ui_tabs.set_selected(MESSAGES_TAB_INDEX); matrix_chat_page->chat_body = tabs[MESSAGES_TAB_INDEX].body.get(); matrix_chat_page->messages_tab_visible = true; + matrix_chat_page->set_current_room(current_room, tabs[USERS_TAB_INDEX].body.get()); + size_t prev_num_users_in_room = 0; bool redraw = true; @@ -4994,91 +4996,6 @@ namespace QuickMedia { //tabs.clear(); }; - auto on_add_user_event = [&ui_tabs, &tabs, USERS_TAB_INDEX](MatrixAddUserEvent *event) { - // Ignore if the user already exists in the room - // TODO: Remove the need for this - for(auto &body_item : tabs[USERS_TAB_INDEX].body->items) { - if(body_item->url == event->user_info.user_id) - return; - } - - std::string display_name = event->user_info.display_name.value_or(event->user_info.user_id); - size_t insert_position = get_body_item_sorted_insert_position_by_author(tabs[USERS_TAB_INDEX].body->items, display_name, 0); - - auto body_item = BodyItem::create(""); - body_item->url = event->user_info.user_id; - body_item->set_author(std::move(display_name)); - body_item->set_author_color(user_id_to_color(event->user_info.user_id)); - body_item->set_description(event->user_info.user_id); - body_item->set_description_color(sf::Color(179, 179, 179)); - if(event->user_info.avatar_url) - body_item->thumbnail_url = event->user_info.avatar_url.value(); - body_item->thumbnail_mask_type = ThumbnailMaskType::CIRCLE; - body_item->thumbnail_size = AVATAR_THUMBNAIL_SIZE; - tabs[USERS_TAB_INDEX].body->items.insert(tabs[USERS_TAB_INDEX].body->items.begin() + insert_position, std::move(body_item)); - tabs[USERS_TAB_INDEX].body->items_set_dirty(); - - ui_tabs.set_text(USERS_TAB_INDEX, "Users (" + std::to_string(tabs[USERS_TAB_INDEX].body->items.size()) + ")"); - }; - - // TODO: Actually trigger this when a user leaves the room. Also remove the user from the room in the matrix plugin - auto on_remove_user_event = [&ui_tabs, &tabs, USERS_TAB_INDEX](MatrixRemoveUserEvent *event) { - for(auto it = tabs[USERS_TAB_INDEX].body->items.begin(), end = tabs[USERS_TAB_INDEX].body->items.end(); it != end; ++it) { - if((*it)->url == event->user_info.user_id) { - tabs[USERS_TAB_INDEX].body->items.erase(it); - ui_tabs.set_text(USERS_TAB_INDEX, "Users (" + std::to_string(tabs[USERS_TAB_INDEX].body->items.size()) + ")"); - return; - } - } - }; - - auto on_user_info_event = [&tabs, USERS_TAB_INDEX](MatrixUserInfoEvent *event) { - for(auto it = tabs[USERS_TAB_INDEX].body->items.begin(), end = tabs[USERS_TAB_INDEX].body->items.end(); it != end; ++it) { - if((*it)->url == event->user_info.user_id) { - if(event->user_info.avatar_url) - (*it)->thumbnail_url = event->user_info.avatar_url.value(); - - if(event->user_info.display_name) { - std::string display_name; - if(event->user_info.display_name.value().empty()) - display_name = event->user_info.user_id; - else - display_name = event->user_info.display_name.value(); - - (*it)->set_author(std::move(display_name)); - - auto user_body_item = *it; - tabs[USERS_TAB_INDEX].body->items.erase(it); - - // TODO: extract_first_line_remove_newline_elipses(room->get_user_display_name(message->user), AUTHOR_MAX_LENGTH), - // But that should be done in Text because we need author to be 100% the same as in the input to reorder users - size_t insert_position = get_body_item_sorted_insert_position_by_author(tabs[USERS_TAB_INDEX].body->items, user_body_item->get_author(), 0); - tabs[USERS_TAB_INDEX].body->items.insert(tabs[USERS_TAB_INDEX].body->items.begin() + insert_position, std::move(user_body_item)); - tabs[USERS_TAB_INDEX].body->items_set_dirty(); - } - - return; - } - } - }; - - matrix->enable_event_queue(current_room); - { - auto users_in_room = current_room->get_users(); - for(auto &user : users_in_room) { - std::string display_name = current_room->get_user_display_name(user); - std::string avatar_url = current_room->get_user_avatar_url(user); - - MatrixEventUserInfo user_info; - user_info.user_id = user->user_id; - user_info.display_name = std::move(display_name); - user_info.avatar_url = std::move(avatar_url); - - MatrixAddUserEvent add_user_event(std::move(user_info)); - on_add_user_event(&add_user_event); - } - } - // TODO: Remove this once synapse bug has been resolved where /sync does not include user info for new messages when using message filter that limits number of messages for initial sync, // and then only call this when viewing the users tab for the first time. // Note that this is not needed when new users join the room, as those will be included in the sync timeline (with membership events) @@ -5390,22 +5307,11 @@ namespace QuickMedia { matrix->update(); mention.update(); - - std::unique_ptr matrix_event; - while((matrix_event = matrix->pop_event()) != nullptr) { - if(matrix_event) { - switch(matrix_event->type) { - case MatrixEvent::Type::ADD_USER: - on_add_user_event(static_cast(matrix_event.get())); - break; - case MatrixEvent::Type::REMOVE_USER: - on_remove_user_event(static_cast(matrix_event.get())); - break; - case MatrixEvent::Type::USER_INFO: - on_user_info_event(static_cast(matrix_event.get())); - break; - } - } + + const size_t num_users_in_room = matrix_chat_page->get_num_users_in_current_room(); + if(num_users_in_room != prev_num_users_in_room) { + prev_num_users_in_room = num_users_in_room; + ui_tabs.set_text(USERS_TAB_INDEX, "Users (" + std::to_string(num_users_in_room) + ")"); } while((provisional_message = provisional_message_queue.pop_if_available()) != std::nullopt) { @@ -5451,7 +5357,7 @@ namespace QuickMedia { break; } case PageType::CHAT_LOGIN: { - matrix->disable_event_queue(); + matrix_chat_page->set_current_room(nullptr, nullptr); previous_messages_future.cancel(); cleanup_tasks(); tabs.clear(); @@ -5818,7 +5724,7 @@ namespace QuickMedia { if(matrix && !matrix->is_initial_sync_finished()) { std::string err_msg; if(matrix->did_initial_sync_fail(err_msg)) { - matrix->disable_event_queue(); + matrix_chat_page->set_current_room(nullptr, nullptr); previous_messages_future.cancel(); cleanup_tasks(); tabs.clear(); @@ -5848,7 +5754,7 @@ namespace QuickMedia { while(!matrix->is_initial_sync_finished()) { std::this_thread::sleep_for(std::chrono::milliseconds(10)); if(matrix->did_initial_sync_fail(err_msg)) { - matrix->disable_event_queue(); + matrix_chat_page->set_current_room(nullptr, nullptr); previous_messages_future.cancel(); cleanup_tasks(); tabs.clear(); @@ -5899,7 +5805,7 @@ namespace QuickMedia { } chat_page_end: - matrix->disable_event_queue(); + matrix_chat_page->set_current_room(nullptr, nullptr); previous_messages_future.cancel(); cleanup_tasks(); window.setTitle("QuickMedia - matrix"); -- cgit v1.2.3