diff options
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r-- | src/QuickMedia.cpp | 234 |
1 files changed, 90 insertions, 144 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index abfbc7c..6a7bc5f 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -598,6 +598,9 @@ namespace QuickMedia { show_room_side_panel = true; main_thread_id = std::this_thread::get_id(); + auto window_size_u = window.getSize(); + window_size.x = window_size_u.x; + window_size.y = window_size_u.y; } // Returns size_t(-1) if not found @@ -1077,19 +1080,7 @@ namespace QuickMedia { sf::FloatRect visible_area(0, 0, window_size.x, window_size.y); window.setView(sf::View(visible_area)); } else if(handle_keypress && event.type == sf::Event::KeyPressed) { - if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K)) { - body->select_previous_item(); - } else if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J)) { - body->select_next_item(); - } else if(event.key.code == sf::Keyboard::PageUp) { - body->select_previous_page(); - } else if(event.key.code == sf::Keyboard::PageDown) { - body->select_next_page(); - } else if(event.key.code == sf::Keyboard::Home) { - body->select_first_item(); - } else if(event.key.code == sf::Keyboard::End) { - body->select_last_item(); - } else if(event.key.code == sf::Keyboard::Escape) { + if(event.key.code == sf::Keyboard::Escape) { current_page = previous_page; } } else if(handle_searchbar) { @@ -1344,7 +1335,7 @@ namespace QuickMedia { } void Program::page_loop_render(sf::RenderWindow &window, std::vector<Tab> &tabs, int selected_tab, TabAssociatedData &tab_associated_data, const Json::Value *json_chapters, Tabs &ui_tabs) { - if(tabs[selected_tab].search_bar) tabs[selected_tab].search_bar->draw(window, false); + if(tabs[selected_tab].search_bar) tabs[selected_tab].search_bar->draw(window, window_size, true); float shade_extra_height = 0.0f; if(!tabs[selected_tab].search_bar) { @@ -1436,9 +1427,7 @@ namespace QuickMedia { window_size.x = window_size_u.x; window_size.y = window_size_u.y; - std::function<void(const std::string&)> submit_handler; - - submit_handler = [this, &submit_handler, &after_submit_handler, &tabs, &tab_associated_data, &ui_tabs, &loop_running, &redraw](const std::string &search_text) { + std::function<void(const std::string&)> submit_handler = [this, &submit_handler, &after_submit_handler, &tabs, &tab_associated_data, &ui_tabs, &loop_running, &redraw](const std::string &search_text) { const int selected_tab = ui_tabs.get_selected(); auto selected_item = tabs[selected_tab].body->get_selected_shared(); if(!selected_item && !tabs[selected_tab].page->allow_submit_no_selection()) @@ -1591,6 +1580,28 @@ namespace QuickMedia { hide_virtual_keyboard(); }; + std::function<void()> on_bottom_reached = [&ui_tabs, &tabs, &tab_associated_data, &gradient_inc] { + const int selected_tab = ui_tabs.get_selected(); + if(tab_associated_data[selected_tab].fetch_status == FetchStatus::NONE + && !tab_associated_data[selected_tab].fetching_next_page_running + && !tab_associated_data[selected_tab].fetching_next_page_failed + && tabs[selected_tab].page + && (!tabs[selected_tab].page->is_lazy_fetch_page() || tab_associated_data[selected_tab].lazy_fetch_finished)) + { + gradient_inc = 0.0; + tab_associated_data[selected_tab].fetching_next_page_running = true; + int next_page = tab_associated_data[selected_tab].fetched_page + 1; + Page *page = tabs[selected_tab].page.get(); + std::string update_search_text = tab_associated_data[selected_tab].update_search_text; + tab_associated_data[selected_tab].next_page_future = AsyncTask<BodyItems>([update_search_text, next_page, page]() { + BodyItems result_items; + if(page->get_page(update_search_text, next_page, result_items) != PluginResult::OK) + fprintf(stderr, "Failed to get next page (page %d)\n", next_page); + return result_items; + }); + } + }; + for(size_t i = 0; i < tabs.size(); ++i) { Tab &tab = tabs[i]; tab.body->body_item_select_callback = [&submit_handler](BodyItem *body_item) { @@ -1623,6 +1634,8 @@ namespace QuickMedia { return; submit_handler(search_text); }; + + tab.body->on_bottom_reached = on_bottom_reached; } sf::Event event; @@ -1655,51 +1668,7 @@ namespace QuickMedia { if(event.type == sf::Event::Resized || event.type == sf::Event::GainedFocus) redraw = true; else if(event.type == sf::Event::KeyPressed) { - if(event.key.code == sf::Keyboard::Down || event.key.code == sf::Keyboard::PageDown || event.key.code == sf::Keyboard::End || (event.key.control && event.key.code == sf::Keyboard::J)) { - bool hit_bottom = false; - switch(event.key.code) { - case sf::Keyboard::Down: - hit_bottom = !tabs[selected_tab].body->select_next_item(); - break; - case sf::Keyboard::J: - hit_bottom = !tabs[selected_tab].body->select_next_item(); - break; - case sf::Keyboard::PageDown: - hit_bottom = !tabs[selected_tab].body->select_next_page(); - break; - case sf::Keyboard::End: - tabs[selected_tab].body->select_last_item(); - hit_bottom = true; - break; - default: - hit_bottom = false; - break; - } - if(hit_bottom - && tab_associated_data[selected_tab].fetch_status == FetchStatus::NONE - && !tab_associated_data[selected_tab].fetching_next_page_running - && tabs[selected_tab].page - && (!tabs[selected_tab].page->is_lazy_fetch_page() || tab_associated_data[selected_tab].lazy_fetch_finished)) - { - gradient_inc = 0.0; - tab_associated_data[selected_tab].fetching_next_page_running = true; - int next_page = tab_associated_data[selected_tab].fetched_page + 1; - Page *page = tabs[selected_tab].page.get(); - std::string update_search_text = tab_associated_data[selected_tab].update_search_text; - tab_associated_data[selected_tab].next_page_future = AsyncTask<BodyItems>([update_search_text, next_page, page]() { - BodyItems result_items; - if(page->get_page(update_search_text, next_page, result_items) != PluginResult::OK) - fprintf(stderr, "Failed to get next page (page %d)\n", next_page); - return result_items; - }); - } - } else if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K)) { - tabs[selected_tab].body->select_previous_item(); - } else if(event.key.code == sf::Keyboard::PageUp) { - tabs[selected_tab].body->select_previous_page(); - } else if(event.key.code == sf::Keyboard::Home) { - tabs[selected_tab].body->select_first_item(); - } else if(event.key.code == sf::Keyboard::Escape) { + if(event.key.code == sf::Keyboard::Escape) { goto page_end; } else if(event.key.code == sf::Keyboard::Tab) { if(tabs[selected_tab].search_bar) tabs[selected_tab].search_bar->set_to_autocomplete(); @@ -1796,6 +1765,8 @@ namespace QuickMedia { if(num_new_messages > 0) { tabs[i].body->append_items(std::move(new_body_items)); associated_data.fetched_page++; + } else { + associated_data.fetching_next_page_failed = true; } associated_data.fetching_next_page_running = false; } @@ -3136,19 +3107,7 @@ namespace QuickMedia { if(event.type == sf::Event::Resized || event.type == sf::Event::GainedFocus) redraw = true; else if(navigation_stage == NavigationStage::VIEWING_COMMENTS && event.type == sf::Event::KeyPressed) { - if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K)) { - thread_body->select_previous_item(); - } else if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J)) { - thread_body->select_next_item(); - } else if(event.key.code == sf::Keyboard::PageUp) { - thread_body->select_previous_page(); - } else if(event.key.code == sf::Keyboard::PageDown) { - thread_body->select_next_page(); - } else if(event.key.code == sf::Keyboard::Home) { - thread_body->select_first_item(); - } else if(event.key.code == sf::Keyboard::End) { - thread_body->select_last_item(); - } else if(event.key.code == sf::Keyboard::Escape) { + if(event.key.code == sf::Keyboard::Escape) { current_page = pop_page_stack(); } else if(event.key.code == sf::Keyboard::P) { BodyItem *selected_item = thread_body->get_selected(); @@ -3513,35 +3472,43 @@ namespace QuickMedia { SearchBar password_input(nullptr, &rounded_rectangle_shader, "Password", true); SearchBar homeserver_input(nullptr, &rounded_rectangle_shader, "Homeserver"); - sf::Text status_text("", *FontLoader::get_font(FontLoader::FontType::LATIN), std::floor(18 * get_ui_scale())); - const int num_inputs = 3; SearchBar *inputs[num_inputs] = { &login_input, &password_input, &homeserver_input }; int focused_input = 0; - auto text_submit_callback = [this, inputs, &status_text](const sf::String&) { + RoundedRectangle background(sf::Vector2f(1.0f, 1.0f), 10.0f, sf::Color(33, 37, 44), &rounded_rectangle_shader); + + auto text_submit_callback = [this, inputs](const sf::String&) { for(int i = 0; i < num_inputs; ++i) { if(inputs[i]->get_text().empty()) { - status_text.setString("All fields need to be filled in"); + show_notification("QuickMedia", "All fields need to be filled in", Urgency::CRITICAL); return; } } - std::string err_msg; - // TODO: Make asynchronous - if(matrix->login(inputs[0]->get_text(), inputs[1]->get_text(), inputs[2]->get_text(), err_msg) == PluginResult::OK) { - current_page = PageType::CHAT; - } else { - status_text.setString("Failed to login, error: " + err_msg); - } - return; + run_task_with_loading_screen([this, inputs](){ + std::string err_msg; + if(matrix->login(inputs[0]->get_text(), inputs[1]->get_text(), inputs[2]->get_text(), err_msg) == PluginResult::OK) { + current_page = PageType::CHAT; + return true; + } else { + show_notification("QuickMedia", "Failed to login, error: " + err_msg, Urgency::CRITICAL); + return false; + } + }); }; for(int i = 0; i < num_inputs; ++i) { + inputs[i]->padding_top = 0.0f; + inputs[i]->padding_bottom = 0.0f; + inputs[i]->padding_x = 0.0f; inputs[i]->caret_visible = false; inputs[i]->onTextSubmitCallback = text_submit_callback; } inputs[focused_input]->caret_visible = true; + const float padding_x = std::floor(20.0f * get_ui_scale()); + const float padding_y = std::floor(20.0f * get_ui_scale()); + const float spacing_y = std::floor(20.0f * get_ui_scale()); sf::Vector2f body_pos; sf::Vector2f body_size; @@ -3581,19 +3548,25 @@ namespace QuickMedia { if(redraw) { redraw = false; get_body_dimensions(window_size, nullptr, body_pos, body_size); + background.set_size(sf::Vector2f( + std::min(window_size.x, std::max(640.0f, window_size.x * 0.5f)), + num_inputs * inputs[0]->getBottomWithoutShadow() + padding_y * 2.0f + spacing_y * std::max(0, num_inputs - 1))); + background.set_position(window_size * 0.5f - background.get_size() * 0.5f); + + sf::Vector2f pos = background.get_position() + sf::Vector2f(padding_x, padding_y); + for(int i = 0; i < num_inputs; ++i) { + inputs[i]->set_position(pos); + pos.y += inputs[i]->getBottomWithoutShadow() + spacing_y; + } } window.clear(back_color); body->draw(window, body_pos, body_size); - float y = 0.0f; + background.draw(window); for(int i = 0; i < num_inputs; ++i) { - inputs[i]->set_vertical_position(y); inputs[i]->update(); - inputs[i]->draw(window); - y += inputs[i]->getBottomWithoutShadow(); + inputs[i]->draw(window, background.get_size() - sf::Vector2f(padding_x * 2.0f, 0.0f), false); } - status_text.setPosition(0.0f, y + 10.0f); - window.draw(status_text); window.display(); } } @@ -4781,6 +4754,24 @@ namespace QuickMedia { move_room = true; }; + bool fetching_prev_failed = false; + std::function<void()> on_top_reached = [this, &previous_messages_future, &ui_tabs, &MESSAGES_TAB_INDEX, &gradient_inc, current_room, &fetching_prev_failed] { + const int selected_tab = ui_tabs.get_selected(); + if(!fetching_prev_failed && !previous_messages_future.valid() && selected_tab == MESSAGES_TAB_INDEX) { + gradient_inc = 0; + previous_messages_future = AsyncTask<Messages>([this, current_room]() { + Messages messages; + if(matrix->get_previous_room_messages(current_room, messages) != PluginResult::OK) + fprintf(stderr, "Failed to get previous matrix messages in room: %s\n", current_room->id.c_str()); + return messages; + }); + } + }; + + for(size_t i = 0; i < tabs.size(); ++i) { + tabs[i].body->on_top_reached = on_top_reached; + } + while (current_page == PageType::CHAT && window.isOpen() && !move_room) { sf::Int32 frame_time_ms = frame_timer.restart().asMilliseconds(); while (window.pollEvent(event)) { @@ -4803,7 +4794,7 @@ namespace QuickMedia { chat_input.process_event(event); if(draw_room_list) { - if(room_tabs[room_selected_tab].body->on_event(window, event)) + if(room_tabs[room_selected_tab].body->on_event(window, event, false)) idle_active_handler(); } @@ -4850,42 +4841,7 @@ namespace QuickMedia { } else if(event.type == sf::Event::GainedFocus) { redraw = true; } else if(event.type == sf::Event::KeyPressed && chat_state == ChatState::NAVIGATING) { - if(event.key.code == sf::Keyboard::Up || event.key.code == sf::Keyboard::PageUp || event.key.code == sf::Keyboard::Home || (event.key.control && event.key.code == sf::Keyboard::K)) { - bool hit_top = false; - switch(event.key.code) { - case sf::Keyboard::Up: - hit_top = !tabs[selected_tab].body.get()->select_previous_item(); - break; - case sf::Keyboard::K: - hit_top = !tabs[selected_tab].body.get()->select_previous_item(); - break; - case sf::Keyboard::PageUp: - hit_top = !tabs[selected_tab].body.get()->select_previous_page(); - break; - case sf::Keyboard::Home: - tabs[selected_tab].body.get()->select_first_item(); - hit_top = true; - break; - default: - hit_top = false; - break; - } - if(hit_top && !previous_messages_future.valid() && selected_tab == MESSAGES_TAB_INDEX && current_room) { - gradient_inc = 0; - previous_messages_future = AsyncTask<Messages>([this, ¤t_room]() { - Messages messages; - if(matrix->get_previous_room_messages(current_room, messages) != PluginResult::OK) - fprintf(stderr, "Failed to get previous matrix messages in room: %s\n", current_room->id.c_str()); - return messages; - }); - } - } else if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J)) { - tabs[selected_tab].body.get()->select_next_item(); - } else if(event.key.code == sf::Keyboard::PageDown) { - tabs[selected_tab].body.get()->select_next_page(); - } else if(event.key.code == sf::Keyboard::End) { - tabs[selected_tab].body.get()->select_last_item(); - } else if(event.key.code == sf::Keyboard::Escape) { + if(event.key.code == sf::Keyboard::Escape) { goto chat_page_end; } else if(event.key.code == sf::Keyboard::I && event.key.control) { BodyItem *selected_item = tabs[selected_tab].body->get_selected(); @@ -5028,19 +4984,7 @@ namespace QuickMedia { } } } else if(event.type == sf::Event::KeyPressed && chat_state == ChatState::URL_SELECTION) { - if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K)) { - url_selection_body.select_previous_item(); - } else if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J)) { - url_selection_body.select_next_item(); - } else if(event.key.code == sf::Keyboard::PageUp) { - url_selection_body.select_previous_page(); - } else if(event.key.code == sf::Keyboard::PageDown) { - url_selection_body.select_next_page(); - } else if(event.key.code == sf::Keyboard::Home) { - url_selection_body.select_first_item(); - } else if(event.key.code == sf::Keyboard::End) { - url_selection_body.select_last_item(); - } else if(event.key.code == sf::Keyboard::Escape) { + if(event.key.code == sf::Keyboard::Escape) { url_selection_body.clear_items(); chat_state = ChatState::NAVIGATING; } else if(event.key.code == sf::Keyboard::Enter) { @@ -5257,8 +5201,10 @@ namespace QuickMedia { if(previous_messages_future.ready()) { Messages new_messages = previous_messages_future.get(); all_messages.insert(all_messages.end(), new_messages.begin(), new_messages.end()); - if(new_messages.empty()) + if(new_messages.empty()) { fetched_enough_messages = true; + fetching_prev_failed = true; + } filter_sent_messages(new_messages); filter_existing_messages(new_messages); fprintf(stderr, "Finished fetching older messages, num new messages: %zu\n", new_messages.size()); |