From c42fe235c642441d6968ce67cd210883e78b0b97 Mon Sep 17 00:00:00 2001 From: Sophie Herold Date: Wed, 26 Apr 2023 18:15:36 +0200 Subject: [PATCH] imagePage: Make crossfade from spinner work It did not work before because the spinner page did not take up the complete stack. Also hiding the spinner when animating out of it since it can be pretty dominant. Especially, since it's usually not really shown before but the animation starts emediately instead. Closes #153 Part-of: --- data/gtk/image_page.ui | 21 +++++++++++++++------ src/widgets/image_page.rs | 15 +++++++++++++-- 2 files changed, 28 insertions(+), 8 deletions(-) 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());