From 299d2e8db13a15849cdf434c3b05627220f635ab Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Fri, 5 Jan 2018 00:09:09 +0200 Subject: [PATCH] ShowsView: Retain vertical scrolling adjustment upon view refresh. --- hammond-gtk/resources/gtk/shows_view.ui | 6 +++-- hammond-gtk/src/content.rs | 32 +++++++++++++++++++++---- hammond-gtk/src/views/shows.rs | 11 ++++++--- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/hammond-gtk/resources/gtk/shows_view.ui b/hammond-gtk/resources/gtk/shows_view.ui index 5050ca0..4fa9396 100644 --- a/hammond-gtk/resources/gtk/shows_view.ui +++ b/hammond-gtk/resources/gtk/shows_view.ui @@ -3,16 +3,18 @@ + fb_parent True False vertical - + + scrolled_window True True in - + True False diff --git a/hammond-gtk/src/content.rs b/hammond-gtk/src/content.rs index f62bf21..0480512 100644 --- a/hammond-gtk/src/content.rs +++ b/hammond-gtk/src/content.rs @@ -111,9 +111,31 @@ impl ShowStack { pub fn update_podcasts(&self) { let vis = self.stack.get_visible_child_name().unwrap(); - let old = self.stack.get_child_by_name("podcasts").unwrap(); + + let old = self.stack + .get_child_by_name("podcasts") + // This is guaranted to exists, based on `ShowStack::new()`. + .unwrap() + .downcast::() + // This is guaranted to be a Box based on the `ShowsPopulated` impl. + .unwrap(); + debug!("Name: {:?}", WidgetExt::get_name(&old)); + + let scrolled_window = old.get_children() + .first() + // This is guaranted to exist based on the show_widget.ui file. + .unwrap() + .clone() + .downcast::() + // This is guaranted based on the show_widget.ui file. + .unwrap(); + debug!("Name: {:?}", WidgetExt::get_name(&scrolled_window)); let pop = ShowsPopulated::new(Arc::new(self.clone()), self.sender.clone()); + // Copy the vertical scrollbar adjustment from the old view into the new one. + scrolled_window + .get_vadjustment() + .map(|x| pop.set_vadjustment(&x)); self.stack.remove(&old); self.stack.add_named(&pop.container, "podcasts"); @@ -132,10 +154,10 @@ impl ShowStack { pub fn replace_widget(&self, pd: &Podcast) { let old = self.stack .get_child_by_name("widget") - // This is guaranted to exists, based on ShowStack::new(). + // This is guaranted to exists, based on `ShowStack::new()`. .unwrap() .downcast::() - // This is guaranted to be a Box based on the ShowWidget impl. + // This is guaranted to be a Box based on the `ShowWidget` impl. .unwrap(); debug!("Name: {:?}", WidgetExt::get_name(&old)); @@ -218,10 +240,10 @@ impl EpisodeStack { pub fn update(&self) { let old = self.stack .get_child_by_name("episodes") - // This is guaranted to exists, based on EpisodeStack::new(). + // This is guaranted to exists, based on `EpisodeStack::new()`. .unwrap() .downcast::() - // This is guaranted to be a Box based on the EpisodesView impl. + // This is guaranted to be a Box based on the `EpisodesView` impl. .unwrap(); debug!("Name: {:?}", WidgetExt::get_name(&old)); diff --git a/hammond-gtk/src/views/shows.rs b/hammond-gtk/src/views/shows.rs index 01ab9e7..df8dc57 100644 --- a/hammond-gtk/src/views/shows.rs +++ b/hammond-gtk/src/views/shows.rs @@ -15,21 +15,21 @@ use std::sync::Arc; #[derive(Debug, Clone)] pub struct ShowsPopulated { pub container: gtk::Box, + scrolled_window: gtk::ScrolledWindow, flowbox: gtk::FlowBox, - viewport: gtk::Viewport, } impl Default for ShowsPopulated { fn default() -> Self { let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/shows_view.ui"); let container: gtk::Box = builder.get_object("fb_parent").unwrap(); + let scrolled_window: gtk::ScrolledWindow = builder.get_object("scrolled_window").unwrap(); let flowbox: gtk::FlowBox = builder.get_object("flowbox").unwrap(); - let viewport: gtk::Viewport = builder.get_object("viewport").unwrap(); ShowsPopulated { container, + scrolled_window, flowbox, - viewport, } } } @@ -74,6 +74,11 @@ impl ShowsPopulated { pub fn is_empty(&self) -> bool { self.flowbox.get_children().is_empty() } + + /// Set scrolled window vertical adjustment. + pub fn set_vadjustment(&self, vadjustment: >k::Adjustment) { + self.scrolled_window.set_vadjustment(vadjustment) + } } #[derive(Debug)]