aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp33
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;