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