diff options
Diffstat (limited to 'src/ImageViewer.cpp')
-rw-r--r-- | src/ImageViewer.cpp | 123 |
1 files changed, 83 insertions, 40 deletions
diff --git a/src/ImageViewer.cpp b/src/ImageViewer.cpp index 1176046..064afa4 100644 --- a/src/ImageViewer.cpp +++ b/src/ImageViewer.cpp @@ -4,6 +4,7 @@ #include "../include/ResourceLoader.hpp" #include "../include/Scale.hpp" #include "../include/Config.hpp" +#include "../include/Theme.hpp" #include <mglpp/system/FloatRect.hpp> #include <malloc.h> #include <mglpp/window/Event.hpp> @@ -83,28 +84,49 @@ namespace QuickMedia { } bool ImageViewer::render_page(mgl::Window &window, int page, double offset_y) { - if(page < 0 || page >= (int)image_data.size()) - return false; - - std::shared_ptr<ImageData> &page_image_data = image_data[page]; const mgl::vec2d image_size = get_page_size(page); mgl::vec2d render_pos(floor(window_size.x * 0.5 - image_size.x * 0.5), scroll + offset_y); - if(render_pos.y + image_size.y <= 0.0 || render_pos.y >= window_size.y) { - if(page_image_data) - page_image_data->visible_on_screen = false; - return true; - } bool scrolling = (std::abs(scroll_speed) > 0.01f); if(!scrolling) render_pos.y = floor(render_pos.y); double top_dist = std::abs(0.0 - render_pos.y); - if(top_dist < min_page_top_dist) { + if(top_dist < min_page_top_dist && page != -1 && page != num_pages) { min_page_top_dist = top_dist; page_closest_to_top = page; } + if(render_pos.y + image_size.y <= 0.0 || render_pos.y >= window_size.y) { + if(page >= 0 && page < num_pages) { + std::shared_ptr<ImageData> &page_image_data = image_data[page]; + if(page_image_data) + page_image_data->visible_on_screen = false; + } + return true; + } + + if(page == -1 || page == num_pages) { + // TODO: Dont show if first/last chapter + mgl::Text text(page == -1 ? "Scroll up to go to the previous chapter" : "Scroll down to go to the next chapter", *FontLoader::get_font(FontLoader::FontType::LATIN, 30 * get_config().scale * get_config().font_scale)); + auto text_bounds = text.get_bounds(); + text.set_color(get_theme().text_color); + mgl::vec2d render_pos_text(floor(window_size.x * 0.5 - text_bounds.size.x * 0.5), image_size.y * 0.5 - text_bounds.size.y * 0.5 + scroll + offset_y); + + if(!scrolling) + render_pos_text.y = floor(render_pos_text.y); + + mgl::Rectangle background(mgl::vec2f(image_size.x, image_size.y)); + background.set_color(get_theme().selected_color); + background.set_position(mgl::vec2f(render_pos.x, render_pos.y)); + window.draw(background); + + text.set_position(mgl::vec2f(render_pos_text.x, render_pos_text.y)); + window.draw(text); + return true; + } + + std::shared_ptr<ImageData> &page_image_data = image_data[page]; if(page_image_data) { page_image_data->visible_on_screen = true; @@ -140,14 +162,14 @@ namespace QuickMedia { mgl::Text error_message(std::move(msg), *FontLoader::get_font(FontLoader::FontType::LATIN, 30 * get_config().scale * get_config().font_scale)); auto text_bounds = error_message.get_bounds(); - error_message.set_color(mgl::Color(0, 0, 0, 255)); + error_message.set_color(get_theme().text_color); mgl::vec2d render_pos_text(floor(window_size.x * 0.5 - text_bounds.size.x * 0.5), image_size.y * 0.5 - text_bounds.size.y * 0.5 + scroll + offset_y); if(!scrolling) render_pos_text.y = floor(render_pos_text.y); mgl::Rectangle background(mgl::vec2f(image_size.x, image_size.y)); - background.set_color(mgl::Color(255, 255, 255, 255)); + background.set_color(get_theme().selected_color); background.set_position(mgl::vec2f(render_pos.x, render_pos.y)); window.draw(background); @@ -159,14 +181,14 @@ namespace QuickMedia { mgl::Text error_message("Downloading page " + page_str, *FontLoader::get_font(FontLoader::FontType::LATIN, 30 * get_config().scale * get_config().font_scale)); auto text_bounds = error_message.get_bounds(); - error_message.set_color(mgl::Color(0, 0, 0, 255)); + error_message.set_color(get_theme().text_color); mgl::vec2d render_pos_text(floor(window_size.x * 0.5 - text_bounds.size.x * 0.5), image_size.y * 0.5 - text_bounds.size.y * 0.5 + scroll + offset_y); if(!scrolling) render_pos_text.y = floor(render_pos_text.y); mgl::Rectangle background(mgl::vec2f(image_size.x, image_size.y)); - background.set_color(mgl::Color(255, 255, 255, 255)); + background.set_color(get_theme().selected_color); background.set_position(mgl::vec2f(render_pos.x, render_pos.y)); window.draw(background); @@ -202,12 +224,30 @@ namespace QuickMedia { return (!key.control && key.code == mgl::Keyboard::Down) || (!key.alt && key.control && key.code == mgl::Keyboard::J); } - static bool is_key_previous_chapter(const mgl::Event::KeyEvent &key) { - return (key.control && key.code == mgl::Keyboard::Up) || (key.alt && key.control && key.code == mgl::Keyboard::K); - } + void ImageViewer::scroll_to_page(int page) { + scroll = 0.0; + scroll_speed = 0.0; - static bool is_key_next_chapter(const mgl::Event::KeyEvent &key) { - return (key.control && key.code == mgl::Keyboard::Down) || (key.alt && key.control && key.code == mgl::Keyboard::J); + for(int i = -1; i < num_pages + 1; ++i) { + const mgl::vec2d current_page_size = get_page_size(i); + double scroll_diff = 0.0; + if(i < 0) { + scroll_diff = current_page_size.y - prev_size_first_page.y; + prev_size_first_page = current_page_size; + } else if(i >= num_pages) { + scroll_diff = current_page_size.y - prev_size_last_page.y; + prev_size_last_page = current_page_size; + } else { + scroll_diff = current_page_size.y - page_size[i].prev_size.y; + page_size[i].prev_size = current_page_size; + } + + if(i < page) { + scroll -= scroll_diff; + if(scroll_diff < 0.001) + scroll -= current_page_size.y; + } + } } ImageViewerAction ImageViewer::draw() { @@ -222,15 +262,7 @@ namespace QuickMedia { window_size.x = window_size_i.x; window_size.y = window_size_i.y; window_size_set = true; - - for(int i = 0; i < num_pages; ++i) { - const mgl::vec2d current_page_size = get_page_size(i); - const double scroll_diff = current_page_size.y - page_size[i].prev_size.y; - page_size[i].prev_size = current_page_size; - - if(i < current_page) - scroll -= scroll_diff; - } + scroll_to_page(current_page); } // TODO: Only redraw when scrolling and when image has finished downloading @@ -250,18 +282,18 @@ namespace QuickMedia { if(is_key_scroll_down(event.key)) down_pressed = true; - if(is_key_previous_chapter(event.key)) - return ImageViewerAction::PREVIOUS_CHAPTER; - - if(is_key_next_chapter(event.key)) - return ImageViewerAction::NEXT_CHAPTER; - if(event.key.code == mgl::Keyboard::Escape) return ImageViewerAction::RETURN; if(event.key.code == mgl::Keyboard::I) return ImageViewerAction::SWITCH_TO_SINGLE_IMAGE_MODE; + if(event.key.code == mgl::Keyboard::Home) + scroll_to_page(0); + + if(event.key.code == mgl::Keyboard::End) + scroll_to_page(num_pages - 1); + if(event.key.code == mgl::Keyboard::F) *fit_image_to_window = !*fit_image_to_window; } else if(event.type == mgl::Event::KeyReleased) { @@ -347,10 +379,19 @@ namespace QuickMedia { } double page_offset = 0.0; - for(int i = 0; i < num_pages; ++i) { + for(int i = -1; i < num_pages + 1; ++i) { const mgl::vec2d current_page_size = get_page_size(i); - const double scroll_diff = current_page_size.y - page_size[i].prev_size.y; - page_size[i].prev_size = current_page_size; + double scroll_diff = 0.0; + if(i < 0) { + scroll_diff = current_page_size.y - prev_size_first_page.y; + prev_size_first_page = current_page_size; + } else if(i >= num_pages) { + scroll_diff = current_page_size.y - prev_size_last_page.y; + prev_size_last_page = current_page_size; + } else { + scroll_diff = current_page_size.y - page_size[i].prev_size.y; + page_size[i].prev_size = current_page_size; + } if(page_offset < -scroll) scroll -= scroll_diff; @@ -359,8 +400,8 @@ namespace QuickMedia { page_offset += current_page_size.y; } - const double first_image_height = get_page_size(0).y; - const double last_image_height = get_page_size((int)image_data.size() - 1).y; + const double first_image_height = get_page_size(-1).y; + const double last_image_height = get_page_size(image_data.size()).y; // TODO: Do not allow scrolling if all images height (page_offset) is smaller than window height @@ -368,8 +409,10 @@ namespace QuickMedia { const double bottom_scroll = std::min(window_size.y, window_size.y + last_image_height - window_size.y); if(scroll > top_scroll) { scroll = top_scroll; + return ImageViewerAction::PREVIOUS_CHAPTER; } else if(scroll + page_offset < bottom_scroll && page_offset > window_size.y) { scroll = -page_offset + bottom_scroll; + return ImageViewerAction::NEXT_CHAPTER; } if(page_closest_to_top != -1) @@ -410,7 +453,7 @@ namespace QuickMedia { } int ImageViewer::get_focused_page() const { - return 1 + focused_page; + return std::max(0, std::min(1 + focused_page, num_pages)); } mgl::vec2d ImageViewer::get_page_size(int page) { |