ShowWidget: Retain vertical scrolling adjustment upon view refresh.

This commit is contained in:
Jordan Petridis 2018-01-04 23:43:31 +02:00
parent 112b61d39e
commit 8ad5bf6f09
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
4 changed files with 42 additions and 6 deletions

View File

@ -7,7 +7,8 @@
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkScrolledWindow"> <object class="GtkScrolledWindow" id="scrolled_window">
<property name="name">scrolled_window</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">True</property>
<property name="shadow_type">in</property> <property name="shadow_type">in</property>

View File

@ -1,4 +1,5 @@
use gtk; use gtk;
use gtk::Cast;
use gtk::prelude::*; use gtk::prelude::*;
use hammond_data::Podcast; use hammond_data::Podcast;
@ -129,8 +130,30 @@ impl ShowStack {
} }
pub fn replace_widget(&self, pd: &Podcast) { 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::<gtk::Box>()
// 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::<gtk::ScrolledWindow>()
// 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()); 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.remove(&old);
self.stack.add_named(&new.container, "widget"); self.stack.add_named(&new.container, "widget");
@ -193,24 +216,27 @@ impl EpisodeStack {
} }
pub fn update(&self) { pub fn update(&self) {
use gtk::Cast;
let old = self.stack let old = self.stack
.get_child_by_name("episodes") .get_child_by_name("episodes")
// This is guaranted to exists, based on EpisodeStack::new().
.unwrap() .unwrap()
.downcast::<gtk::Box>() .downcast::<gtk::Box>()
// This is guaranted to be a Box based on the EpisodesView impl.
.unwrap(); .unwrap();
info!("Name: {:?}", WidgetExt::get_name(&old)); debug!("Name: {:?}", WidgetExt::get_name(&old));
let scrolled_window = old.get_children() let scrolled_window = old.get_children()
.first() .first()
// This is guaranted to exist based on the episodes_view.ui file.
.unwrap() .unwrap()
.clone() .clone()
.downcast::<gtk::ScrolledWindow>() .downcast::<gtk::ScrolledWindow>()
// This is guaranted based on the episodes_view.ui file.
.unwrap(); .unwrap();
info!("Name: {:?}", WidgetExt::get_name(&scrolled_window)); debug!("Name: {:?}", WidgetExt::get_name(&scrolled_window));
let eps = EpisodesView::new(self.sender.clone()); let eps = EpisodesView::new(self.sender.clone());
// Copy the vertical scrollbar adjustment from the old view into the new one.
scrolled_window scrolled_window
.get_vadjustment() .get_vadjustment()
.map(|x| eps.set_vadjustment(&x)); .map(|x| eps.set_vadjustment(&x));

View File

@ -151,6 +151,7 @@ impl EpisodesView {
true true
} }
/// Set scrolled window vertical adjustment.
pub fn set_vadjustment(&self, vadjustment: &gtk::Adjustment) { pub fn set_vadjustment(&self, vadjustment: &gtk::Adjustment) {
self.scrolled_window.set_vadjustment(vadjustment) self.scrolled_window.set_vadjustment(vadjustment)
} }

View File

@ -21,6 +21,7 @@ use std::fs;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct ShowWidget { pub struct ShowWidget {
pub container: gtk::Box, pub container: gtk::Box,
scrolled_window: gtk::ScrolledWindow,
cover: gtk::Image, cover: gtk::Image,
description: gtk::Label, description: gtk::Label,
link: gtk::Button, link: gtk::Button,
@ -33,6 +34,7 @@ impl Default for ShowWidget {
fn default() -> Self { fn default() -> Self {
let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/show_widget.ui"); let builder = gtk::Builder::new_from_resource("/org/gnome/hammond/gtk/show_widget.ui");
let container: gtk::Box = builder.get_object("container").unwrap(); 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 episodes: gtk::Frame = builder.get_object("episodes").unwrap();
let cover: gtk::Image = builder.get_object("cover").unwrap(); let cover: gtk::Image = builder.get_object("cover").unwrap();
@ -43,6 +45,7 @@ impl Default for ShowWidget {
ShowWidget { ShowWidget {
container, container,
scrolled_window,
cover, cover,
description, description,
unsub, unsub,
@ -104,6 +107,11 @@ impl ShowWidget {
let desc = dissolve::strip_html_tags(text).join(" "); let desc = dissolve::strip_html_tags(text).join(" ");
self.description.set_text(&replace_extra_spaces(&desc)); self.description.set_text(&replace_extra_spaces(&desc));
} }
/// Set scrolled window vertical adjustment.
pub fn set_vadjustment(&self, vadjustment: &gtk::Adjustment) {
self.scrolled_window.set_vadjustment(vadjustment)
}
} }
fn on_unsub_button_clicked( fn on_unsub_button_clicked(