diff --git a/data/gtk/image_page.ui b/data/gtk/image_page.ui index 560c5de..b1a10bc 100644 --- a/data/gtk/image_page.ui +++ b/data/gtk/image_page.ui @@ -43,10 +43,18 @@ crossfade - - center - center - True + + true + true + + + 24 + 24 + center + center + True + + @@ -88,7 +96,7 @@ Rotate Left win.rotate_ccw @@ -98,7 +106,7 @@ Rotate Right win.rotate_cw @@ -110,3 +118,4 @@ + diff --git a/src/widgets/image_page.rs b/src/widgets/image_page.rs index 1d432dc..a52f041 100644 --- a/src/widgets/image_page.rs +++ b/src/widgets/image_page.rs @@ -39,12 +39,14 @@ mod imp { #[template_child] pub(super) stack: TemplateChild, #[template_child] - pub(super) spinner: TemplateChild, + pub(super) spinner_page: TemplateChild, #[template_child] pub(super) error_page: TemplateChild, #[template_child] pub(super) image_stack_page: TemplateChild, #[template_child] + pub(super) spinner: TemplateChild, + #[template_child] pub(super) scrolled_window: TemplateChild, #[template_child] pub(super) image: TemplateChild, @@ -108,10 +110,20 @@ mod imp { gesture.set_state(gtk::EventSequenceState::Claimed); })); + self.stack + .connect_visible_child_notify(clone!(@weak obj => move |stack| { + let imp = obj.imp(); + let spinner_visible = + stack.visible_child().as_ref() == Some(imp.spinner_page.upcast_ref()); + // Hide spinner for crossfading into other content since it does not look great + imp.spinner.set_visible(spinner_visible); + })); + obj.image().connect_notify_local( Some("is-loaded"), clone!(@weak obj => move |_,_| { if obj.image().is_loaded() { + log::debug!("Showing image"); obj.imp() .stack .set_visible_child(&*obj.imp().image_stack_page); @@ -127,7 +139,6 @@ mod imp { } }), ); - // Do not waste CPU on spinner if it is not visible self.spinner.connect_map(|s| s.start()); self.spinner.connect_unmap(|s| s.stop());