diff --git a/src/cache.rs b/src/cache.rs index a3b068b..2bdadd1 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -136,16 +136,18 @@ impl PageCache { let page_left = self.get_page_or_cache(page_left_number)?; if let Ok(page_right) = self.get_page_or_cache(page_left_number + 1) { Ok(Some(CacheResponse::TwoPagesRetrieved { + page_number_left: page_left_number, page_left, + page_number_right: page_left_number + 1, page_right, })) } else { - Ok(Some(CacheResponse::SinglePageRetrieved { page: page_left })) + Ok(Some(CacheResponse::SinglePageRetrieved { page_number: page_left_number, page: page_left })) } } RetrievePagesCommand::GetCurrentPage { page_number } => { let page = self.get_page_or_cache(page_number)?; - Ok(Some(CacheResponse::SinglePageRetrieved { page })) + Ok(Some(CacheResponse::SinglePageRetrieved { page_number, page })) } }, } @@ -175,10 +177,13 @@ pub enum RetrievePagesCommand { pub enum CacheResponse { SinglePageRetrieved { + page_number: PageNumber, page: Rc, }, TwoPagesRetrieved { + page_number_left: PageNumber, page_left: Rc, + page_number_right : PageNumber, page_right: Rc, }, PageResolutionUpgraded { diff --git a/src/ui.rs b/src/ui.rs index 4ac6bfc..b726da8 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -14,7 +14,7 @@ use gtk::{ use log::debug; use crate::{ - cache::{self, PageNumber, SyncCacheCommandSender}, + cache::{self, CacheResponse, PageNumber, SyncCacheCommandSender}, color_mode::{self, ColorMode}, }; use glib::clone; @@ -445,38 +445,7 @@ pub fn load_document(file: impl AsRef, ui: Rc>, initial_page_n let sender = cache::spawn_sync_cache( document, color_mode, - clone!(@weak ui => move |cache_response| match cache_response { - cache::CacheResponse::SinglePageRetrieved { page } => { - ui.borrow_mut().image_left.set_paintable(Some(page.as_ref())); - if ui.borrow().document_canvas.as_ref().map(|canvas| canvas.num_pages.unwrap_or(0)).unwrap_or(0) > 1 { - // Make image invisible but keep free space in layout - ui.borrow_mut().image_right.set_opacity(0.0); - } else { - // Make image invisible and center left page in layout - ui.borrow_mut().image_right.set_visible(false); - } - let area_height = ui.borrow().image_container.height(); - ui.borrow().document_canvas.as_ref().unwrap().cache_surrounding_pages(area_height); - } - cache::CacheResponse::TwoPagesRetrieved { - page_left, - page_right, - } => { - ui.borrow_mut().image_left.set_paintable(Some(page_left.as_ref())); - ui.borrow_mut().image_right.set_paintable(Some(page_right.as_ref())); - ui.borrow_mut().image_right.set_visible(true); - ui.borrow_mut().image_right.set_opacity(1.0); - let area_height = ui.borrow().image_container.height(); - ui.borrow().document_canvas.as_ref().unwrap().cache_surrounding_pages(area_height); - }, - cache::CacheResponse::PageResolutionUpgraded { page_number, page } => { - if ui.borrow().document_canvas.as_ref().unwrap().is_left_page(page_number){ - ui.borrow_mut().image_left.set_paintable(Some(page.as_ref())); - } else if ui.borrow().document_canvas.as_ref().unwrap().is_right_page(page_number){ - ui.borrow_mut().image_right.set_paintable(Some(page.as_ref())); - } - } - }), + clone!(@weak ui => move |cache_response| handle_cache_response(ui, cache_response)), ); let mut document_canvas = DocumentCanvas::new(path, sender); @@ -489,3 +458,56 @@ pub fn load_document(file: impl AsRef, ui: Rc>, initial_page_n update_page_status(&ui.borrow()); debug!("finished loading document"); } + +fn handle_cache_response(ui: Rc>, cache_response: CacheResponse) { + if let Some(canvas) = ui.borrow().document_canvas.as_ref() { + let image_left = &ui.borrow().image_left; + let image_right = &ui.borrow().image_right; + let area_height = ui.borrow().image_container.height(); + + match cache_response { + cache::CacheResponse::SinglePageRetrieved { page_number, page } => { + if !canvas.is_left_page(page_number) { + debug!("Retrieved page with non up-to-date page_number from cache, ignoring."); + return; + } + + image_left.set_paintable(Some(page.as_ref())); + if canvas.num_pages.unwrap_or(0) > 1 { + // Make image invisible but keep free space in layout + image_right.set_opacity(0.0); + } else { + // Make image invisible and center left page in layout + image_right.set_visible(false); + } + canvas.cache_surrounding_pages(area_height); + } + cache::CacheResponse::TwoPagesRetrieved { + page_number_left, + page_left, + page_number_right, + page_right, + } => { + if !canvas.is_left_page(page_number_left) + || !canvas.is_right_page(page_number_right) + { + debug!("Retrieved pages with non up-to-date page_number from cache, ignoring."); + return; + } + + image_left.set_paintable(Some(page_left.as_ref())); + image_right.set_paintable(Some(page_right.as_ref())); + image_right.set_visible(true); + image_right.set_opacity(1.0); + canvas.cache_surrounding_pages(area_height); + } + cache::CacheResponse::PageResolutionUpgraded { page_number, page } => { + if canvas.is_left_page(page_number) { + image_left.set_paintable(Some(page.as_ref())); + } else if canvas.is_right_page(page_number) { + image_right.set_paintable(Some(page.as_ref())); + } + } + } + } +}