From 7f0bdeddb79c308ab082a124441f1d69d665dbfc Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 18 Apr 2021 17:18:31 +0200 Subject: Fix misc matrix bugs related to leaving a room when side panel is visible and changing room, misc visual changes to manga --- src/QuickMedia.cpp | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index f85f2da..0e8e197 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -1422,12 +1422,14 @@ namespace QuickMedia { int selected_index = tabs[selected_tab].body->get_selected_item(); video_content_page(tabs[selected_tab].page.get(), static_cast(new_tabs[0].page.get()), selected_item->get_title(), false, tabs[selected_tab].body->items, selected_index, &tab_associated_data[selected_tab].fetched_page, tab_associated_data[selected_tab].update_search_text); } else if(new_tabs.size() == 1 && new_tabs[0].page->get_type() == PageTypez::CHAT) { - body_set_selected_item(tabs[selected_tab].body.get(), selected_item.get()); + //body_set_selected_item(tabs[selected_tab].body.get(), selected_item.get()); current_page = PageType::CHAT; current_chat_room = matrix->get_room_by_id(selected_item->url); + MatrixRoomsPage *rooms_page = static_cast(tabs[selected_tab].page.get()); while(window.isOpen()) { - bool move_room = chat_page(static_cast(new_tabs[0].page.get()), current_chat_room, tabs, selected_tab, tab_associated_data[selected_tab]); + auto matrix_chat_page = std::make_unique(this, current_chat_room->id, rooms_page); + bool move_room = chat_page(matrix_chat_page.get(), current_chat_room, tabs, selected_tab); if(!move_room) break; @@ -3550,7 +3552,7 @@ namespace QuickMedia { user_update_display_info(body_item->embedded_item.get(), room, (Message*)body_item->embedded_item->userdata); } - bool Program::chat_page(MatrixChatPage *matrix_chat_page, RoomData *current_room, std::vector &room_tabs, int room_selected_tab, TabAssociatedData &room_tab_associated_data) { + bool Program::chat_page(MatrixChatPage *matrix_chat_page, RoomData *current_room, std::vector &room_tabs, int room_selected_tab) { assert(current_room); assert(strcmp(plugin_name, "matrix") == 0); if(!current_room) { @@ -3595,6 +3597,9 @@ namespace QuickMedia { const int MESSAGES_TAB_INDEX = 1; //const int USERS_TAB_INDEX = 2; + matrix_chat_page->chat_body = tabs[MESSAGES_TAB_INDEX].body.get(); + matrix_chat_page->messages_tab_visible = true; + int selected_tab = MESSAGES_TAB_INDEX; bool is_window_focused = window.hasFocus(); @@ -4193,18 +4198,20 @@ namespace QuickMedia { }); }; + bool remove_unread_marker = false; // TODO: How about instead fetching all messages we have, not only the visible ones? also fetch with multiple threads. - tabs[MESSAGES_TAB_INDEX].body->body_item_render_callback = [this, ¤t_room, &me, &fetch_message_future, &tabs, &is_window_focused, &chat_state, &setting_read_marker, &read_marker_timer, &read_marker_timeout_ms, &set_read_marker_future, &fetch_body_item, &fetch_message_tab](BodyItem *body_item) { + tabs[MESSAGES_TAB_INDEX].body->body_item_render_callback = [this, ¤t_room, &me, &remove_unread_marker, &fetch_message_future, &tabs, &is_window_focused, &chat_state, &setting_read_marker, &read_marker_timer, &read_marker_timeout_ms, &set_read_marker_future, &fetch_body_item, &fetch_message_tab](BodyItem *body_item) { Message *message = static_cast(body_item->userdata); if(!message) return; - if(matrix->is_initial_sync_finished() && message_is_timeline(message) && is_window_focused && chat_state != ChatState::URL_SELECTION && !setting_read_marker && read_marker_timer.getElapsedTime().asMilliseconds() >= read_marker_timeout_ms) { + if(matrix->is_initial_sync_finished() && tabs[MESSAGES_TAB_INDEX].body->is_last_item_fully_visible() && message_is_timeline(message) && is_window_focused && chat_state != ChatState::URL_SELECTION && !setting_read_marker && read_marker_timer.getElapsedTime().asMilliseconds() >= read_marker_timeout_ms) { Message *read_message = message; if(message->replaced_by) read_message = message->replaced_by.get(); // TODO: What if two messages have the same timestamp? if(!read_message->event_id.empty() && read_message->timestamp > current_room->last_read_message_timestamp) { + remove_unread_marker = true; //read_marker_timeout_ms = read_marker_timeout_ms_default; current_room->last_read_message_timestamp = read_message->timestamp; // TODO: What if the message is no longer valid? @@ -4623,9 +4630,6 @@ namespace QuickMedia { } else if(event.key.code == sf::Keyboard::Escape) { move_room = false; goto chat_page_end; - } else if(event.key.code == sf::Keyboard::Enter) { - move_room = true; - goto chat_page_end; } continue; } @@ -4679,6 +4683,8 @@ namespace QuickMedia { } else if((event.key.code == sf::Keyboard::Left || (event.key.control && event.key.code == sf::Keyboard::H)) && selected_tab > 0) { tabs[selected_tab].body->clear_cache(); --selected_tab; + if(selected_tab == MESSAGES_TAB_INDEX) + matrix_chat_page->messages_tab_visible = true; read_marker_timer.restart(); redraw = true; if(typing && current_room) { @@ -4689,6 +4695,8 @@ namespace QuickMedia { } else if((event.key.code == sf::Keyboard::Right || (event.key.control && event.key.code == sf::Keyboard::L)) && selected_tab < (int)tabs.size() - 1) { tabs[selected_tab].body->clear_cache(); ++selected_tab; + if(selected_tab == MESSAGES_TAB_INDEX) + matrix_chat_page->messages_tab_visible = true; read_marker_timer.restart(); redraw = true; if(typing && current_room) { @@ -5212,7 +5220,7 @@ namespace QuickMedia { } if(selected_tab == MESSAGES_TAB_INDEX && current_room && current_room->body_item && !current_room->last_message_read) { - if(tabs[selected_tab].body->is_last_item_fully_visible()) { + if(remove_unread_marker && tabs[selected_tab].body->is_last_item_fully_visible()) { std::string room_desc = current_room->body_item->get_description(); if(strncmp(room_desc.c_str(), "Unread: ", 8) == 0) room_desc = room_desc.substr(8); @@ -5230,7 +5238,8 @@ namespace QuickMedia { current_room->last_message_read = true; // TODO: Maybe set this instead when the mention is visible on the screen? current_room->unread_notification_count = 0; - } else { + remove_unread_marker = false; + } else if(!tabs[selected_tab].body->is_last_item_fully_visible()) { window.draw(more_messages_below_rect); } } -- cgit v1.2.3