use gtk; use gtk::prelude::*; use hammond_data::Podcast; use hammond_data::dbqueries; use views::shows::ShowsPopulated; use views::empty::EmptyView; use views::episodes::EpisodesView; use widgets::show::ShowWidget; use headerbar::Header; use std::rc::Rc; #[derive(Debug, Clone)] pub struct Content { pub stack: gtk::Stack, pub shows: Rc, episodes: Rc, } impl Content { pub fn new(header: Rc
) -> Rc { let stack = gtk::Stack::new(); let episodes = EpisodeStack::new(); let shows = ShowStack::new(header, episodes.clone()); stack.add_titled(&episodes.stack, "episodes", "Episodes"); stack.add_titled(&shows.stack, "shows", "Shows"); Rc::new(Content { stack, shows, episodes, }) } pub fn update(&self) { self.shows.update(); self.episodes.update(); } pub fn get_stack(&self) -> gtk::Stack { self.stack.clone() } } #[derive(Debug, Clone)] pub struct ShowStack { pub stack: gtk::Stack, header: Rc
, epstack: Rc, } impl ShowStack { fn new(header: Rc
, epstack: Rc) -> Rc { let stack = gtk::Stack::new(); let show = Rc::new(ShowStack { stack, header: header.clone(), epstack, }); let pop = ShowsPopulated::new(show.clone(), header); let widget = ShowWidget::default(); let empty = EmptyView::new(); show.stack.add_named(&pop.container, "podcasts"); show.stack.add_named(&widget.container, "widget"); show.stack.add_named(&empty.container, "empty"); if pop.is_empty() { show.stack.set_visible_child_name("empty") } else { show.stack.set_visible_child_name("podcasts") } show } // fn is_empty(&self) -> bool { // self.podcasts.is_empty() // } pub fn update(&self) { self.update_podcasts(); self.update_widget(); } 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 pop = ShowsPopulated::default(); pop.init(Rc::new(self.clone()), self.header.clone()); self.stack.remove(&old); self.stack.add_named(&pop.container, "podcasts"); if pop.is_empty() { self.stack.set_visible_child_name("empty"); } else if vis != "empty" { self.stack.set_visible_child_name(&vis); } else { self.stack.set_visible_child_name("podcasts"); } old.destroy(); } pub fn replace_widget(&self, pd: &Podcast) { let old = self.stack.get_child_by_name("widget").unwrap(); let new = ShowWidget::new( Rc::new(self.clone()), self.epstack.clone(), self.header.clone(), pd, ); self.stack.remove(&old); self.stack.add_named(&new.container, "widget"); } pub fn update_widget(&self) { 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" { return; } let pd = dbqueries::get_podcast_from_id(id.parse::().unwrap()); if let Ok(pd) = pd { self.replace_widget(&pd); self.stack.set_visible_child_name(&vis); old.destroy(); } } pub fn switch_podcasts_animated(&self) { self.stack .set_visible_child_full("podcasts", gtk::StackTransitionType::SlideRight); } pub fn switch_widget_animated(&self) { self.stack .set_visible_child_full("widget", gtk::StackTransitionType::SlideLeft) } } #[derive(Debug, Clone)] pub struct EpisodeStack { // populated: RecentEpisodes, // empty: EmptyView, stack: gtk::Stack, } impl EpisodeStack { fn new() -> Rc { let episodes = EpisodesView::new(); let empty = EmptyView::new(); let stack = gtk::Stack::new(); stack.add_named(&episodes.container, "episodes"); stack.add_named(&empty.container, "empty"); if episodes.is_empty() { stack.set_visible_child_name("empty"); } else { stack.set_visible_child_name("episodes"); } Rc::new(EpisodeStack { // empty, // populated: pop, stack, }) } pub fn update(&self) { let old = self.stack.get_child_by_name("episodes").unwrap(); let eps = EpisodesView::new(); self.stack.remove(&old); self.stack.add_named(&eps.container, "episodes"); if eps.is_empty() { self.stack.set_visible_child_name("empty"); } else { self.stack.set_visible_child_name("episodes"); } old.destroy(); } }