From 7b48ab891023d76de6b13b56a8d5e205f62bc37d Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 28 May 2021 15:48:43 +0200 Subject: Improve body navigation --- src/QuickMedia.cpp | 61 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 29 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 0c2e872..7dbccae 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -648,8 +648,8 @@ namespace QuickMedia { window.setVerticalSyncEnabled(true); monitor_hz = get_monitor_max_hz(disp); - window.setFramerateLimit(FPS_IDLE); - idle = true; + window.setFramerateLimit(monitor_hz); + idle = false; vsync_set = false; /* if(enable_vsync(disp, window.getSystemHandle())) { @@ -1537,9 +1537,8 @@ namespace QuickMedia { return; } - window.setFramerateLimit(FPS_IDLE); malloc_trim(0); - idle = true; + idle_active_handler(); bool loop_running = true; bool redraw = true; @@ -1615,6 +1614,8 @@ namespace QuickMedia { return; } + idle_active_handler(); + if(tabs[selected_tab].page->clear_search_after_submit() && tabs[selected_tab].search_bar) { if(!tabs[selected_tab].search_bar->get_text().empty()) { tabs[selected_tab].search_bar->clear(); @@ -1660,7 +1661,7 @@ namespace QuickMedia { select_episode(selected_item.get(), false); Body *chapters_body = tabs[selected_tab].body.get(); tabs[selected_tab].search_bar->clear(); - chapters_body->filter_search_fuzzy("", false); // Needed (or not really) to go to the next chapter when reaching the last page of a chapter + chapters_body->filter_search_fuzzy(""); // Needed (or not really) to go to the next chapter when reaching the last page of a chapter MangaImagesPage *manga_images_page = static_cast(new_tabs[0].page.get()); window.setKeyRepeatEnabled(false); downloading_chapter_url.clear(); @@ -1983,9 +1984,12 @@ namespace QuickMedia { if(body_was_empty) { tabs[i].body->select_last_item(); } else { + // TODO: Use select_next_item in a loop instead for |num_new_messages|? tabs[i].body->set_selected_item(prev_selected_item + num_new_messages, true); } } + + idle_active_handler(); } if(associated_data.search_text_updated && associated_data.fetch_status == FetchStatus::NONE && !associated_data.fetching_next_page_running) { @@ -2020,6 +2024,7 @@ namespace QuickMedia { associated_data.search_result_text.setString("No results found"); else associated_data.search_result_text.setString(""); + idle_active_handler(); } else { associated_data.fetch_future.get(); } @@ -2031,6 +2036,9 @@ namespace QuickMedia { FetchResult fetch_result = associated_data.fetch_future.get(); tabs[i].body->items = std::move(fetch_result.body_items); if(tabs[i].search_bar) tabs[i].body->filter_search_fuzzy(tabs[i].search_bar->get_text()); + if(tabs[i].body->attach_side == AttachSide::TOP) { + tabs[i].body->select_first_item(); + } if(tabs[i].body->attach_side == AttachSide::BOTTOM) { std::reverse(tabs[i].body->items.begin(), tabs[i].body->items.end()); tabs[i].body->select_last_item(); @@ -2043,6 +2051,7 @@ namespace QuickMedia { else associated_data.search_result_text.setString(""); associated_data.fetch_status = FetchStatus::NONE; + idle_active_handler(); } } @@ -2071,9 +2080,9 @@ namespace QuickMedia { window.display(); if(!tabs[selected_tab].body->items.empty()) { - if(tabs[selected_tab].body->attach_side == AttachSide::TOP && tabs[selected_tab].body->is_last_item_fully_visible()) + if(tabs[selected_tab].body->attach_side == AttachSide::TOP && !tabs[selected_tab].body->is_bottom_cut_off()) on_reached_end(); - else if(tabs[selected_tab].body->attach_side == AttachSide::BOTTOM && tabs[selected_tab].body->is_first_item_fully_visible()) + else if(tabs[selected_tab].body->attach_side == AttachSide::BOTTOM && !tabs[selected_tab].body->is_top_cut_off()) on_reached_end(); } @@ -2222,6 +2231,8 @@ namespace QuickMedia { TaskResult Program::run_task_with_loading_screen(std::function callback) { assert(std::this_thread::get_id() == main_thread_id); + idle_active_handler(); + AsyncTask task = callback; window_size.x = window.getSize().x; @@ -4456,8 +4467,8 @@ namespace QuickMedia { } }; - auto upload_file = [this, &tabs, ¤t_room, MESSAGES_TAB_INDEX](const std::string &filepath) { - TaskResult post_file_result = run_task_with_loading_screen([this, ¤t_room, filepath]() { + auto upload_file = [this, ¤t_room](const std::string &filepath) { + run_task_with_loading_screen([this, ¤t_room, filepath]() { std::string event_id_response; std::string err_msg; if(matrix->post_file(current_room, filepath, event_id_response, err_msg) == PluginResult::OK) { @@ -4467,11 +4478,6 @@ namespace QuickMedia { return false; } }); - - if(post_file_result == TaskResult::TRUE) { - if(tabs[MESSAGES_TAB_INDEX].body->is_last_item_fully_visible()) - tabs[MESSAGES_TAB_INDEX].body->select_last_item(); - } }; struct Mention { @@ -4490,6 +4496,7 @@ namespace QuickMedia { filter_updated = false; filter.clear(); users_tab_body->filter_search_fuzzy(""); + users_tab_body->select_first_item(); users_tab_body->clear_cache(); } @@ -4505,9 +4512,9 @@ namespace QuickMedia { } } else if(event.type == sf::Event::KeyPressed) { if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K)) { - users_tab_body->select_previous_item(); + users_tab_body->select_previous_item(true); } else if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J)) { - users_tab_body->select_next_item(); + users_tab_body->select_next_item(true); } else if(event.key.code == sf::Keyboard::Enter && event.key.shift) { hide(); } else if(event.key.code == sf::Keyboard::Backspace) { @@ -4531,6 +4538,7 @@ namespace QuickMedia { // TODO: Use std::string instead of sf::String auto u8 = filter.toUtf8(); users_tab_body->filter_search_fuzzy(*(std::string*)&u8); + users_tab_body->select_first_item(); } } }; @@ -4954,17 +4962,11 @@ namespace QuickMedia { scroll_to_end = true; } - BodyItem *selected_item = tabs[MESSAGES_TAB_INDEX].body->get_selected(); auto new_body_items = messages_to_body_items(current_room, messages, current_room->get_user_display_name(me), me->user_id); messages_load_cached_related_embedded_item(new_body_items, tabs[MESSAGES_TAB_INDEX].body->items, me, current_room); tabs[MESSAGES_TAB_INDEX].body->insert_items_by_timestamps(std::move(new_body_items)); - if(selected_item && !scroll_to_end) { - int selected_item_index = tabs[MESSAGES_TAB_INDEX].body->get_index_by_body_item(selected_item); - if(selected_item_index != -1) - tabs[MESSAGES_TAB_INDEX].body->set_selected_item(selected_item_index); - } else if(scroll_to_end) { + if(scroll_to_end) tabs[MESSAGES_TAB_INDEX].body->select_last_item(); - } }; auto display_url_or_image = [this, matrix_chat_page, &ui_tabs, &redraw, &video_page, &launch_url, &chat_state, &url_selection_body, &avatar_applied, PINNED_TAB_INDEX, MESSAGES_TAB_INDEX](BodyItem *selected) { @@ -5201,11 +5203,11 @@ namespace QuickMedia { if(event.type == sf::Event::KeyPressed && event.key.control && event.key.alt && (chat_state == ChatState::NAVIGATING || chat_state == ChatState::URL_SELECTION)) { if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K)) { - matrix_chat_page->rooms_page->body->select_previous_item(); + matrix_chat_page->rooms_page->body->select_previous_item(true); move_room = true; goto chat_page_end; } else if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J)) { - matrix_chat_page->rooms_page->body->select_next_item(); + matrix_chat_page->rooms_page->body->select_next_item(true); move_room = true; goto chat_page_end; } else if(event.key.code == sf::Keyboard::PageUp) { @@ -5487,6 +5489,7 @@ namespace QuickMedia { upload_file(selected_files[0]); } redraw = true; + avatar_applied = false; break; } case PageType::CHAT_LOGIN: { @@ -5808,7 +5811,7 @@ namespace QuickMedia { } if(selected_tab == MESSAGES_TAB_INDEX && current_room && current_room->body_item && !current_room->last_message_read && matrix->is_initial_sync_finished()) { - if(last_visible_timeline_message && tabs[selected_tab].body->is_last_item_fully_visible() && is_window_focused && chat_state != ChatState::URL_SELECTION && !setting_read_marker && read_marker_timer.getElapsedTime().asMilliseconds() >= read_marker_timeout_ms) { + if(last_visible_timeline_message && !tabs[selected_tab].body->is_bottom_cut_off() && is_window_focused && chat_state != ChatState::URL_SELECTION && !setting_read_marker && read_marker_timer.getElapsedTime().asMilliseconds() >= read_marker_timeout_ms) { 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); @@ -5847,7 +5850,7 @@ namespace QuickMedia { } }); } - } else if(!tabs[selected_tab].body->is_last_item_fully_visible()) { + } else if(tabs[selected_tab].body->is_bottom_cut_off()) { window.draw(more_messages_below_rect); } } @@ -5926,8 +5929,7 @@ namespace QuickMedia { process_reactions(all_messages_new); if(current_room->initial_prev_messages_fetch) { current_room->initial_prev_messages_fetch = false; - if(selected_tab == MESSAGES_TAB_INDEX) - tabs[MESSAGES_TAB_INDEX].body->select_last_item(); + tabs[MESSAGES_TAB_INDEX].body->select_last_item(); } std::vector pinned_events; @@ -6583,6 +6585,7 @@ namespace QuickMedia { } ui_tabs.set_text(tab_path_index, file_manager_page->get_current_directory().string()); + idle_active_handler(); }; const float bottom_panel_padding = 10.0f; -- cgit v1.2.3