Fix showmachine updating.

This commit is contained in:
Jordan Petridis 2017-12-11 16:14:43 +02:00
parent ddb195db3c
commit 211b36dfa3
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
3 changed files with 58 additions and 87 deletions

View File

@ -1,13 +1,14 @@
use gtk; use gtk;
use gtk::prelude::*; use gtk::prelude::*;
use hammond_data::Podcast; // use hammond_data::Podcast;
use hammond_data::dbqueries; use hammond_data::dbqueries;
use widgets::podcast::PodcastWidget; use widgets::podcast::PodcastWidget;
use views::podcasts::PopulatedView; use views::podcasts::PopulatedView;
use views::empty::EmptyView; use views::empty::EmptyView;
#[derive(Debug, Clone)]
pub struct Content { pub struct Content {
pub stack: gtk::Stack, pub stack: gtk::Stack,
shows: ShowStateWrapper, shows: ShowStateWrapper,
@ -34,50 +35,12 @@ impl Content {
} }
pub fn update(&mut self) { pub fn update(&mut self) {
self.shows.update(); self.shows = self.shows.clone().update();
// FIXME: like above
self.episodes.update(); self.episodes.update();
} }
} }
fn replace_widget(stack: &gtk::Stack, pdw: &PodcastWidget) {
let old = stack.get_child_by_name("widget").unwrap();
stack.remove(&old);
stack.add_titled(&pdw.container, "widget", "Episode");
old.destroy();
}
fn replace_podcasts(stack: &gtk::Stack, pop: &PopulatedView) {
let old = stack.get_child_by_name("podcasts").unwrap();
stack.remove(&old);
stack.add_titled(&pop.container, "podcasts", "Shows");
old.destroy();
}
pub fn update_podcasts(stack: &gtk::Stack) {
let pods = PopulatedView::new_initialized();
replace_podcasts(stack, &pods);
}
pub fn update_widget(stack: &gtk::Stack, pd: &Podcast) {
let pdw = PodcastWidget::new_initialized(stack, pd);
replace_widget(stack, &pdw);
}
pub fn update_podcasts_preserve_vis(stack: &gtk::Stack) {
let vis = stack.get_visible_child_name().unwrap();
update_podcasts(stack);
if vis != "empty" {
stack.set_visible_child_name(&vis)
}
}
pub fn update_widget_preserve_vis(stack: &gtk::Stack, pd: &Podcast) {
let vis = stack.get_visible_child_name().unwrap();
update_widget(stack, pd);
stack.set_visible_child_name(&vis)
}
// pub fn on_podcasts_child_activate(stack: &gtk::Stack, pd: &Podcast) { // pub fn on_podcasts_child_activate(stack: &gtk::Stack, pd: &Podcast) {
// update_widget(stack, pd); // update_widget(stack, pd);
// stack.set_visible_child_full("widget", gtk::StackTransitionType::SlideLeft); // stack.set_visible_child_full("widget", gtk::StackTransitionType::SlideLeft);
@ -89,7 +52,9 @@ type ShowsEmpty = EmptyView;
type EpisodesPopulated = PodcastWidget; type EpisodesPopulated = PodcastWidget;
type EpisodesEmpty = EmptyView; type EpisodesEmpty = EmptyView;
#[derive(Debug, Clone)]
struct Populated; struct Populated;
#[derive(Debug, Clone)]
struct Empty; struct Empty;
// struct Shows; // struct Shows;
// struct Episodes; // struct Episodes;
@ -111,6 +76,21 @@ struct ShowsMachine<S> {
} }
impl<S> ShowsMachine<S> { impl<S> ShowsMachine<S> {
fn new(state: S) -> ShowsMachine<S> {
let stack = gtk::Stack::new();
let pop = ShowsPopulated::new_initialized();
let empty = EmptyView::new();
stack.add_named(&pop.container, "populated");
stack.add_named(&empty.container, "empty");
ShowsMachine {
empty,
populated: pop,
stack,
state,
}
}
fn update(&mut self) { fn update(&mut self) {
let vis = self.stack.get_visible_child_name().unwrap(); let vis = self.stack.get_visible_child_name().unwrap();
let old = self.stack.get_child_by_name("populated").unwrap(); let old = self.stack.get_child_by_name("populated").unwrap();
@ -123,7 +103,7 @@ impl<S> ShowsMachine<S> {
} }
} }
#[derive(Debug)] #[derive(Debug, Clone)]
struct EpisodesMachine<S> { struct EpisodesMachine<S> {
populated: EpisodesPopulated, populated: EpisodesPopulated,
empty: EpisodesEmpty, empty: EpisodesEmpty,
@ -235,11 +215,13 @@ impl Into<EpisodesMachine<Empty>> for EpisodesMachine<Populated> {
// Episodes(StackStateMachine<S, Episodes>), // Episodes(StackStateMachine<S, Episodes>),
// } // }
#[derive(Debug, Clone)]
enum ShowStateWrapper { enum ShowStateWrapper {
Populated(ShowsMachine<Populated>), Populated(ShowsMachine<Populated>),
Empty(ShowsMachine<Empty>), Empty(ShowsMachine<Empty>),
} }
#[derive(Debug, Clone)]
enum EpisodeStateWrapper { enum EpisodeStateWrapper {
Populated(EpisodesMachine<Populated>), Populated(EpisodesMachine<Populated>),
Empty(EpisodesMachine<Empty>), Empty(EpisodesMachine<Empty>),
@ -256,44 +238,34 @@ enum EpisodeStateWrapper {
impl ShowStateWrapper { impl ShowStateWrapper {
fn new() -> Self { fn new() -> Self {
let stack = gtk::Stack::new(); let machine = ShowsMachine::new(Populated {});
let pop = ShowsPopulated::new_initialized();
let empty = EmptyView::new();
stack.add_named(&pop.container, "populated");
stack.add_named(&empty.container, "empty");
if pop.flowbox.get_children().is_empty() { if machine.populated.flowbox.get_children().is_empty() {
stack.set_visible_child_name("empty"); machine.stack.set_visible_child_name("empty");
ShowStateWrapper::Empty(ShowsMachine { ShowStateWrapper::Empty(machine.into())
empty,
populated: pop,
stack,
state: Empty {},
})
} else { } else {
stack.set_visible_child_name("populated"); machine.stack.set_visible_child_name("populated");
ShowStateWrapper::Populated(machine)
ShowStateWrapper::Populated(ShowsMachine {
empty,
populated: pop,
stack,
state: Populated {},
})
} }
} }
fn switch(self) -> Self { fn update(mut self) -> Self {
match self { match self {
ShowStateWrapper::Populated(val) => ShowStateWrapper::Empty(val.into()),
ShowStateWrapper::Empty(val) => ShowStateWrapper::Populated(val.into()),
}
}
fn update(&mut self) {
match *self {
ShowStateWrapper::Populated(ref mut val) => val.update(), ShowStateWrapper::Populated(ref mut val) => val.update(),
ShowStateWrapper::Empty(ref mut val) => val.update(), ShowStateWrapper::Empty(ref mut val) => val.update(),
} }
if self.is_empty() {
match self {
ShowStateWrapper::Populated(val) => ShowStateWrapper::Empty(val.into()),
_ => self,
}
} else {
match self {
ShowStateWrapper::Empty(val) => ShowStateWrapper::Populated(val.into()),
_ => self,
}
}
} }
fn get_stack(&self) -> gtk::Stack { fn get_stack(&self) -> gtk::Stack {
@ -302,6 +274,13 @@ impl ShowStateWrapper {
ShowStateWrapper::Empty(ref val) => val.stack.clone(), ShowStateWrapper::Empty(ref val) => val.stack.clone(),
} }
} }
fn is_empty(&self) -> bool {
match *self {
ShowStateWrapper::Populated(ref val) => val.populated.flowbox.get_children().is_empty(),
ShowStateWrapper::Empty(ref val) => val.populated.flowbox.get_children().is_empty(),
}
}
} }
impl EpisodeStateWrapper { impl EpisodeStateWrapper {
@ -330,13 +309,6 @@ impl EpisodeStateWrapper {
} }
} }
fn switch(self) -> Self {
match self {
EpisodeStateWrapper::Populated(val) => EpisodeStateWrapper::Empty(val.into()),
EpisodeStateWrapper::Empty(val) => EpisodeStateWrapper::Populated(val.into()),
}
}
fn get_stack(&self) -> gtk::Stack { fn get_stack(&self) -> gtk::Stack {
match *self { match *self {
EpisodeStateWrapper::Populated(ref val) => val.stack.clone(), EpisodeStateWrapper::Populated(ref val) => val.stack.clone(),

View File

@ -58,9 +58,8 @@ impl Header {
println!("{:?}", url.get_text()); println!("{:?}", url.get_text());
}); });
let cont = content.clone(); add_button.connect_clicked(clone!(content, add_popover, new_url => move |_| {
add_button.connect_clicked(clone!(cont, add_popover, new_url => move |_| { on_add_bttn_clicked(content.clone(), &new_url);
on_add_bttn_clicked(cont.clone(), &new_url);
// TODO: lock the button instead of hiding and add notification of feed added. // TODO: lock the button instead of hiding and add notification of feed added.
// TODO: map the spinner // TODO: map the spinner
@ -70,9 +69,9 @@ impl Header {
// FIXME: There appears to be a memmory leak here. // FIXME: There appears to be a memmory leak here.
let cont = content.clone(); let cont = content.clone();
self.refresh.connect_clicked(clone!(cont => move |_| { self.refresh.connect_clicked(move |_| {
utils::refresh_feed(cont.clone(), None, None); utils::refresh_feed(cont.clone(), None, None);
})); });
} }
} }

View File

@ -10,9 +10,9 @@ use hammond_downloader::downloader;
use widgets::episode::episodes_listbox; use widgets::episode::episodes_listbox;
use utils::get_pixbuf_from_path; use utils::get_pixbuf_from_path;
use content; // use content;
#[derive(Debug)] #[derive(Debug, Clone)]
pub struct PodcastWidget { pub struct PodcastWidget {
pub container: gtk::Box, pub container: gtk::Box,
cover: gtk::Image, cover: gtk::Image,
@ -111,11 +111,11 @@ fn on_unsub_button_clicked(stack: &gtk::Stack, pd: &Podcast, unsub_button: &gtk:
} }
}; };
} }
content::update_podcasts(stack); // content::update_podcasts(stack);
} }
fn on_played_button_clicked(stack: &gtk::Stack, pd: &Podcast) { fn on_played_button_clicked(stack: &gtk::Stack, pd: &Podcast) {
let _ = dbqueries::update_none_to_played_now(pd); let _ = dbqueries::update_none_to_played_now(pd);
content::update_widget_preserve_vis(stack, pd); // content::update_widget_preserve_vis(stack, pd);
} }