From ddb04f1e20ee189787b5da1fb4f3a388f51a2dcb Mon Sep 17 00:00:00 2001 From: Julian Mutter Date: Sat, 21 Oct 2023 15:41:58 +0200 Subject: [PATCH] Speed up by loading pages from document only when necessary --- src/ui.rs | 68 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/src/ui.rs b/src/ui.rs index 04f0814..9c1efde 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -5,6 +5,7 @@ use gtk4::{ prelude::*, Application, ApplicationWindow, Box, Button, DrawingArea, FileChooserAction, FileChooserDialog, HeaderBar, Label, Orientation, ResponseType, }; +use poppler::Page; pub struct Ui { bottom_bar: gtk4::Box, @@ -19,17 +20,43 @@ pub struct DocumentCanvas { document: poppler::Document, current_page_number: i32, num_pages: i32, + page_left: Option, + page_right: Option, } impl DocumentCanvas { pub fn new(document: poppler::Document) -> Self { let num_pages = document.n_pages(); + let page_left = document.page(0); + let page_right = document.page(1); DocumentCanvas { document, num_pages, current_page_number: 1, + page_left, + page_right, } } + + pub fn increase_page_number(&mut self) { + if self.current_page_number >= self.num_pages - 1 { + return; + } + + self.current_page_number += 1; + self.page_left = self.page_right.take(); + self.page_right = self.document.page(self.current_page_number); + } + + pub fn decrease_page_number(&mut self) { + if self.current_page_number <= 1 { + return; + } + + self.current_page_number -= 1; + self.page_right = self.page_left.take(); + self.page_left = self.document.page(self.current_page_number - 1); + } } pub fn toggle_fullscreen(ui: &Ui) { @@ -70,10 +97,7 @@ fn process_right_click(ui: &mut Ui, x: f64, y: f64) { return; } - let doc = ui.document_canvas.as_mut().unwrap(); - if doc.current_page_number > 1 { - doc.current_page_number -= 1; - } + ui.document_canvas.as_mut().unwrap().decrease_page_number(); update_page_status(ui); } @@ -82,15 +106,13 @@ fn process_left_click(ui: &mut Ui, x: f64, y: f64) { return; } - let doc = ui.document_canvas.as_mut().unwrap(); let center = ui.drawing_area.width() / 2; if y < (ui.drawing_area.height() / 5) as f64 { toggle_fullscreen(ui); - } else if x > center as f64 && doc.current_page_number < doc.num_pages - 1 { - // Do not load last page since showing two pages would result in error - doc.current_page_number += 1; - } else if x < center as f64 && doc.current_page_number > 1 { - doc.current_page_number -= 1; + } else if x > center as f64 { + ui.document_canvas.as_mut().unwrap().increase_page_number(); + } else if x < center as f64 { + ui.document_canvas.as_mut().unwrap().decrease_page_number(); } update_page_status(ui); } @@ -187,20 +209,18 @@ fn draw_two_pages(ui: &Ui, area: &DrawingArea, context: &Context) { } let document_canvas = ui.document_canvas.as_ref().unwrap(); + if document_canvas.page_left.is_none() || document_canvas.page_right.is_none() { + return; + } + + let page_left = document_canvas.page_left.as_ref().unwrap(); + let page_right = document_canvas.page_right.as_ref().unwrap(); + // Add white background // context.set_source_rgba(1.0, 1.0, 1.0, 1.0); // context.fill().unwrap(); // context.paint().unwrap(); - let page_left = document_canvas - .document - .page(document_canvas.current_page_number - 1) - .unwrap(); - let page_right = document_canvas - .document - .page(document_canvas.current_page_number) - .unwrap(); - let (w_left, h_left) = page_left.size(); let (w_right, h_right) = page_right.size(); @@ -256,16 +276,18 @@ fn draw_single_page(ui: &Ui, area: &DrawingArea, context: &Context) { } let document_canvas = ui.document_canvas.as_ref().unwrap(); + if document_canvas.page_left.is_none() { + return; + } + + let page = document_canvas.page_left.as_ref().unwrap(); + // Draw background // context.set_source_rgba(1.0, 1.0, 1.0, 1.0); // context.paint().unwrap(); // context.fill().expect("uh oh"); // context.paint().unwrap(); - let page = document_canvas - .document - .page(document_canvas.current_page_number - 1) - .unwrap(); let (w, h) = page.size(); let width_diff = area.width() as f64 / w;