aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2021-04-18 17:18:31 +0200
committerdec05eba <dec05eba@protonmail.com>2021-04-18 17:18:31 +0200
commit7f0bdeddb79c308ab082a124441f1d69d665dbfc (patch)
tree66428f87349b6bfe6f4d50fec871c358a32717f9 /src/QuickMedia.cpp
parent033fbf3f1363c810d115ce9a531aea26ea9e1cf1 (diff)
Fix misc matrix bugs related to leaving a room when side panel is visible and changing room, misc visual changes to manga
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp29
1 files changed, 19 insertions, 10 deletions
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<VideoPage*>(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<MatrixRoomsPage*>(tabs[selected_tab].page.get());
while(window.isOpen()) {
- bool move_room = chat_page(static_cast<MatrixChatPage*>(new_tabs[0].page.get()), current_chat_room, tabs, selected_tab, tab_associated_data[selected_tab]);
+ auto matrix_chat_page = std::make_unique<MatrixChatPage>(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<Tab> &room_tabs, int room_selected_tab, TabAssociatedData &room_tab_associated_data) {
+ bool Program::chat_page(MatrixChatPage *matrix_chat_page, RoomData *current_room, std::vector<Tab> &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, &current_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, &current_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<Message*>(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);
}
}