diff options
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r-- | src/QuickMedia.cpp | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 2607873..50b0608 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -3362,13 +3362,6 @@ namespace QuickMedia { const int MESSAGES_TAB_INDEX = 0; const int ROOMS_TAB_INDEX = 1; - /* - if(matrix->get_cached_sync(tabs[MESSAGES_TAB_INDEX].body->items) != PluginResult::OK) { - fprintf(stderr, "Failed to get matrix cached sync\n"); - } else { - fprintf(stderr, "Loaded matrix sync from cache, num items: %zu\n", tabs[MESSAGES_TAB_INDEX].body->items.size()); - } - */ // This is needed to get initial data, with joined rooms etc. TODO: Remove this once its cached // and allow asynchronous update of rooms bool synced = false; @@ -3398,7 +3391,15 @@ namespace QuickMedia { if(room_body_item_it == body_items_by_room_id.end()) continue; - if(only_show_mentions) { + // TODO: this wont always because we dont display all types of messages from server, such as "joined", "left", "kicked", "banned", "changed avatar", "changed display name", etc. + bool unread_messages_previous_session = false; + if(!messages.empty()) { + const UserInfo *me = matrix->get_me(room->id); + if(me->read_marker_event_id != messages.back()->event_id) + unread_messages_previous_session = true; + } + + if(only_show_mentions && !unread_messages_previous_session) { std::string room_desc; if(!messages.empty()) room_desc = matrix->message_get_author_displayname(room, messages.back().get()) + ": " + extract_first_line(messages.back()->body, 150); @@ -3419,7 +3420,6 @@ namespace QuickMedia { } }; - // TODO: the initial room to view should be the last viewed room when closing QuickMedia. // The room id should be saved in a file when changing viewed room. std::string current_room_id; RoomBodyData *current_room_body_data = nullptr; @@ -3586,7 +3586,8 @@ namespace QuickMedia { Body url_selection_body(this, font.get(), bold_font.get(), cjk_font.get()); sf::Clock read_marker_timer; - const sf::Int32 read_marker_timeout_ms = 3000; + const sf::Int32 read_marker_timeout_ms_default = 3000; + sf::Int32 read_marker_timeout_ms = 0; std::future<void> set_read_marker_future; bool setting_read_marker = false; @@ -3891,6 +3892,7 @@ namespace QuickMedia { room_avatar_thumbnail_data = std::make_shared<ThumbnailData>(); } + read_marker_timeout_ms = 0; redraw = true; } } @@ -4068,15 +4070,14 @@ namespace QuickMedia { tabs[MESSAGES_TAB_INDEX].body->select_last_item(); } + // Initial sync if(!synced) { tabs[ROOMS_TAB_INDEX].body->items = std::move(sync_result.rooms_body_items); for(auto body_item : tabs[ROOMS_TAB_INDEX].body->items) { - // TODO: Set |last_message_read| depending on read markers (either remote matrix read markers or locally saved ones) body_items_by_room_id[body_item->url] = { body_item, true, 0 }; } - // TODO: the initial room to view should be the last viewed room when closing QuickMedia. // The room id should be saved in a file when changing viewed room. if(!tabs[ROOMS_TAB_INDEX].body->items.empty()) current_room_id = tabs[ROOMS_TAB_INDEX].body->items[0]->url; @@ -4204,9 +4205,9 @@ namespace QuickMedia { tabs[MESSAGES_TAB_INDEX].body->draw_item(window, currently_operating_on_item.get(), body_item_pos, body_item_size); } - if(tabs[selected_tab].type == ChatTabType::MESSAGES) { + if(tabs[selected_tab].type == ChatTabType::MESSAGES && current_room_body_data) { if(tabs[selected_tab].body->is_last_item_fully_visible()) { - if(current_room_body_data && !current_room_body_data->last_message_read) { + if(!current_room_body_data->last_message_read) { std::string room_desc = current_room_body_data->body_item->get_description(); if(strncmp(room_desc.c_str(), "Unread: ", 8) == 0) room_desc = room_desc.substr(8); @@ -4217,7 +4218,7 @@ namespace QuickMedia { current_room_body_data->body_item->title_color = sf::Color::White; current_room_body_data->last_message_read = true; } - } else if(current_room_body_data && !current_room_body_data->last_message_read) { + } else if(!current_room_body_data->last_message_read) { window.draw(more_messages_below_rect); } } @@ -4233,7 +4234,9 @@ namespace QuickMedia { BodyItem *last_visible_item = tabs[selected_tab].body->get_last_fully_visible_item(); if(is_window_focused && chat_state != ChatState::URL_SELECTION && current_room_body_data && last_visible_item && !setting_read_marker && read_marker_timer.getElapsedTime().asMilliseconds() >= read_marker_timeout_ms) { Message *message = (Message*)last_visible_item->userdata; + // TODO: What if two messages have the same timestamp? if(message->timestamp > current_room_body_data->last_read_message_timestamp) { + read_marker_timeout_ms = read_marker_timeout_ms_default; current_room_body_data->last_read_message_timestamp = message->timestamp; // TODO: What if the message is no longer valid? setting_read_marker = true; |