diff --git a/hammond-gtk/src/app.rs b/hammond-gtk/src/app.rs index 262293b..53ca4e2 100644 --- a/hammond-gtk/src/app.rs +++ b/hammond-gtk/src/app.rs @@ -20,7 +20,10 @@ pub enum Action { RefreshAllViews, RefreshEpisodesView, RefreshEpisodesViewBGR, + RefreshShowsView, RefreshWidget, + RefreshWidgetIfVis, + RefreshWidgetIfSame(i32), HeaderBarShowTile(String), HeaderBarNormal, HeaderBarHideUpdateIndicator, @@ -137,7 +140,10 @@ impl App { } } Ok(Action::RefreshAllViews) => content.update(), + Ok(Action::RefreshShowsView) => content.update_shows_view(), Ok(Action::RefreshWidget) => content.update_widget(), + Ok(Action::RefreshWidgetIfVis) => content.update_widget_if_visible(), + Ok(Action::RefreshWidgetIfSame(id)) => content.update_widget_if_same(id), Ok(Action::RefreshEpisodesView) => content.update_episode_view(), Ok(Action::RefreshEpisodesViewBGR) => content.update_episode_view_if_baground(), Ok(Action::HeaderBarShowTile(title)) => headerbar.switch_to_back(&title), diff --git a/hammond-gtk/src/content.rs b/hammond-gtk/src/content.rs index 57a8018..5d03ed3 100644 --- a/hammond-gtk/src/content.rs +++ b/hammond-gtk/src/content.rs @@ -64,6 +64,18 @@ impl Content { self.shows.update_widget(); } + pub fn update_widget_if_same(&self, pid: i32) { + self.shows.update_widget_if_same(pid); + } + + pub fn update_widget_if_visible(&self) { + if self.stack.get_visible_child_name() == Some("shows".to_string()) + && self.shows.get_stack().get_visible_child_name() == Some("widget".to_string()) + { + self.shows.update_widget(); + } + } + pub fn get_stack(&self) -> gtk::Stack { self.stack.clone() } @@ -186,12 +198,12 @@ impl ShowStack { let vis = self.stack.get_visible_child_name().unwrap(); let old = self.stack.get_child_by_name("widget").unwrap(); - let id = WidgetExt::get_name(&old).unwrap(); - if id == "GtkBox" { + let id = WidgetExt::get_name(&old); + if id == Some("GtkBox".to_string()) || id.is_none() { return; } - let pd = dbqueries::get_podcast_from_id(id.parse::().unwrap()); + let pd = dbqueries::get_podcast_from_id(id.unwrap().parse::().unwrap()); if let Ok(pd) = pd { self.replace_widget(&pd); self.stack.set_visible_child_name(&vis); @@ -199,6 +211,17 @@ impl ShowStack { } } + // Only update widget if it's podcast_id is equal to pid. + pub fn update_widget_if_same(&self, pid: i32) { + let old = self.stack.get_child_by_name("widget").unwrap(); + + let id = WidgetExt::get_name(&old); + if id != Some(pid.to_string()) || id.is_none() { + return; + } + self.update_widget(); + } + pub fn switch_podcasts_animated(&self) { self.stack .set_visible_child_full("podcasts", gtk::StackTransitionType::SlideRight); diff --git a/hammond-gtk/src/manager.rs b/hammond-gtk/src/manager.rs index 1cec780..6f6d7e7 100644 --- a/hammond-gtk/src/manager.rs +++ b/hammond-gtk/src/manager.rs @@ -81,6 +81,7 @@ pub fn add(id: i32, directory: &str, sender: Sender) { let dir = directory.to_owned(); thread::spawn(move || { if let Ok(episode) = dbqueries::get_episode_from_rowid(id) { + let id = episode.podcast_id(); get_episode(&mut episode.into(), dir.as_str(), Some(prog)) .err() .map(|err| { @@ -93,7 +94,7 @@ pub fn add(id: i32, directory: &str, sender: Sender) { } sender.send(Action::RefreshEpisodesView).unwrap(); - sender.send(Action::RefreshWidget).unwrap(); + sender.send(Action::RefreshWidgetIfSame(id)).unwrap(); } }); } diff --git a/hammond-gtk/src/widgets/episode.rs b/hammond-gtk/src/widgets/episode.rs index 651d4c2..56ea735 100644 --- a/hammond-gtk/src/widgets/episode.rs +++ b/hammond-gtk/src/widgets/episode.rs @@ -251,7 +251,7 @@ fn on_download_clicked(ep: &EpisodeWidgetQuery, sender: Sender) { // Update Views sender.send(Action::RefreshEpisodesView).unwrap(); - sender.send(Action::RefreshWidget).unwrap(); + sender.send(Action::RefreshWidgetIfVis).unwrap(); } fn on_play_bttn_clicked(episode_id: i32) { diff --git a/hammond-gtk/src/widgets/show.rs b/hammond-gtk/src/widgets/show.rs index eb7fc24..74d69a3 100644 --- a/hammond-gtk/src/widgets/show.rs +++ b/hammond-gtk/src/widgets/show.rs @@ -71,7 +71,6 @@ impl ShowWidget { self.unsub .connect_clicked(clone!(shows, pd, sender => move |bttn| { on_unsub_button_clicked(shows.clone(), &pd, bttn, sender.clone()); - sender.send(Action::HeaderBarNormal).unwrap(); })); self.setup_listbox(pd, sender.clone()); @@ -137,8 +136,10 @@ fn on_unsub_button_clicked( }); })); shows.switch_podcasts_animated(); + sender.send(Action::HeaderBarNormal).unwrap(); // Queue a refresh after the switch to avoid blocking the db. - sender.send(Action::RefreshAllViews).unwrap(); + sender.send(Action::RefreshShowsView).unwrap(); + sender.send(Action::RefreshEpisodesView).unwrap(); } #[allow(dead_code)]