diff --git a/hammond-gtk/resources/gtk/show_widget.ui b/hammond-gtk/resources/gtk/show_widget.ui index 78b5e2d..f8e076b 100644 --- a/hammond-gtk/resources/gtk/show_widget.ui +++ b/hammond-gtk/resources/gtk/show_widget.ui @@ -7,7 +7,8 @@ False vertical - + + scrolled_window True True in diff --git a/hammond-gtk/src/content.rs b/hammond-gtk/src/content.rs index 3108ccb..f62bf21 100644 --- a/hammond-gtk/src/content.rs +++ b/hammond-gtk/src/content.rs @@ -1,4 +1,5 @@ use gtk; +use gtk::Cast; use gtk::prelude::*; use hammond_data::Podcast; @@ -129,8 +130,30 @@ impl ShowStack { } pub fn replace_widget(&self, pd: &Podcast) { - let old = self.stack.get_child_by_name("widget").unwrap(); + let old = self.stack + .get_child_by_name("widget") + // This is guaranted to exists, based on ShowStack::new(). + .unwrap() + .downcast::() + // This is guaranted to be a Box based on the ShowWidget 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 new = ShowWidget::new(Arc::new(self.clone()), pd, self.sender.clone()); + // Copy the vertical scrollbar adjustment from the old view into the new one. + scrolled_window + .get_vadjustment() + .map(|x| new.set_vadjustment(&x)); self.stack.remove(&old); self.stack.add_named(&new.container, "widget"); @@ -193,24 +216,27 @@ impl EpisodeStack { } pub fn update(&self) { - use gtk::Cast; - let old = self.stack .get_child_by_name("episodes") + // This is guaranted to exists, based on EpisodeStack::new(). .unwrap() .downcast::() + // This is guaranted to be a Box based on the EpisodesView impl. .unwrap(); - info!("Name: {:?}", WidgetExt::get_name(&old)); + debug!("Name: {:?}", WidgetExt::get_name(&old)); let scrolled_window = old.get_children() .first() + // This is guaranted to exist based on the episodes_view.ui file. .unwrap() .clone() .downcast::() + // This is guaranted based on the episodes_view.ui file. .unwrap(); - info!("Name: {:?}", WidgetExt::get_name(&scrolled_window)); + debug!("Name: {:?}", WidgetExt::get_name(&scrolled_window)); let eps = EpisodesView::new(self.sender.clone()); + // Copy the vertical scrollbar adjustment from the old view into the new one. scrolled_window .get_vadjustment() .map(|x| eps.set_vadjustment(&x)); diff --git a/hammond-gtk/src/views/episodes.rs b/hammond-gtk/src/views/episodes.rs index bf65497..c0b04a8 100644 --- a/hammond-gtk/src/views/episodes.rs +++ b/hammond-gtk/src/views/episodes.rs @@ -151,6 +151,7 @@ impl EpisodesView { true } + /// Set scrolled window vertical adjustment. pub fn set_vadjustment(&self, vadjustment: >k::Adjustment) { self.scrolled_window.set_vadjustment(vadjustment) } diff --git a/hammond-gtk/src/widgets/show.rs b/hammond-gtk/src/widgets/show.rs index 2c31c03..aef0b0d 100644 --- a/hammond-gtk/src/widgets/show.rs +++ b/hammond-gtk/src/widgets/show.rs @@ -21,6 +21,7 @@ use std::fs; #[derive(Debug, Clone)] pub struct ShowWidget { pub container: gtk::Box, + scrolled_window: gtk::ScrolledWindow, cover: gtk::Image, description: gtk::Label, link: gtk::Button, @@ -33,6 +34,7 @@ impl Default for ShowWidget { fn default() -> Self { let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/show_widget.ui"); let container: gtk::Box = builder.get_object("container").unwrap(); + let scrolled_window: gtk::ScrolledWindow = builder.get_object("scrolled_window").unwrap(); let episodes: gtk::Frame = builder.get_object("episodes").unwrap(); let cover: gtk::Image = builder.get_object("cover").unwrap(); @@ -43,6 +45,7 @@ impl Default for ShowWidget { ShowWidget { container, + scrolled_window, cover, description, unsub, @@ -104,6 +107,11 @@ impl ShowWidget { let desc = dissolve::strip_html_tags(text).join(" "); self.description.set_text(&replace_extra_spaces(&desc)); } + + /// Set scrolled window vertical adjustment. + pub fn set_vadjustment(&self, vadjustment: >k::Adjustment) { + self.scrolled_window.set_vadjustment(vadjustment) + } } fn on_unsub_button_clicked(