aboutsummaryrefslogtreecommitdiff
path: root/src/ImageViewer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ImageViewer.cpp')
-rw-r--r--src/ImageViewer.cpp123
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) {