From 23979b8f221f8318ad6020fc409a640f88630fea Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Fri, 9 Feb 2018 09:13:41 +0200 Subject: [PATCH] EpisodeWidget: Move state machine implementations into a separate module. --- hammond-gtk/src/widgets/episode.rs | 84 +--------------------- hammond-gtk/src/widgets/episode_states.rs | 85 +++++++++++++++++++++++ hammond-gtk/src/widgets/mod.rs | 1 + 3 files changed, 87 insertions(+), 83 deletions(-) create mode 100644 hammond-gtk/src/widgets/episode_states.rs diff --git a/hammond-gtk/src/widgets/episode.rs b/hammond-gtk/src/widgets/episode.rs index d4c4a1f..bfd16c8 100644 --- a/hammond-gtk/src/widgets/episode.rs +++ b/hammond-gtk/src/widgets/episode.rs @@ -15,6 +15,7 @@ use hammond_data::utils::get_download_folder; use app::Action; use manager; +use widgets::episode_states::*; use std::path::Path; use std::sync::{Arc, Mutex}; @@ -40,89 +41,6 @@ lazy_static! { static ref NOW: DateTime = Utc::now(); } -#[derive(Debug, Clone)] -struct Normal; -#[derive(Debug, Clone)] -struct GreyedOut; - -#[derive(Debug, Clone)] -struct Title { - title: gtk::Label, - state: S, -} - -impl Title { - fn set_title(&self, s: &str) { - self.title.set_text(s); - } -} - -impl Title { - fn new(title: gtk::Label) -> Self { - Title { - title, - state: Normal {}, - } - } -} - -impl From> for Title { - fn from(machine: Title) -> Self { - machine - .title - .get_style_context() - .map(|c| c.add_class("dim-label")); - - Title { - title: machine.title, - state: GreyedOut {}, - } - } -} - -impl From> for Title { - fn from(machine: Title) -> Self { - machine - .title - .get_style_context() - .map(|c| c.remove_class("dim-label")); - - Title { - title: machine.title, - state: Normal {}, - } - } -} - -#[derive(Debug, Clone)] -enum TitleMachine { - Normal(Title), - GreyedOut(Title), -} - -impl TitleMachine { - fn new(label: gtk::Label, is_played: bool) -> Self { - let m = TitleMachine::Normal(Title::::new(label)); - m.determine_state(is_played) - } - - fn determine_state(self, is_played: bool) -> Self { - match (self, is_played) { - (title @ TitleMachine::Normal(_), false) => title, - (title @ TitleMachine::GreyedOut(_), true) => title, - (TitleMachine::Normal(val), true) => TitleMachine::GreyedOut(val.into()), - (TitleMachine::GreyedOut(val), false) => TitleMachine::Normal(val.into()), - } - } - - fn set_title(&self, s: &str) { - match *self { - TitleMachine::Normal(ref val) => val.set_title(s), - TitleMachine::GreyedOut(ref val) => val.set_title(s), - } - } -} - #[derive(Debug, Clone)] pub struct EpisodeWidget { pub container: gtk::Box, diff --git a/hammond-gtk/src/widgets/episode_states.rs b/hammond-gtk/src/widgets/episode_states.rs new file mode 100644 index 0000000..c4a85ee --- /dev/null +++ b/hammond-gtk/src/widgets/episode_states.rs @@ -0,0 +1,85 @@ +use gtk; +use gtk::prelude::*; + +#[derive(Debug, Clone)] +pub struct Normal; +#[derive(Debug, Clone)] +pub struct GreyedOut; + +#[derive(Debug, Clone)] +pub struct Title { + title: gtk::Label, + state: S, +} + +impl Title { + fn set_title(&self, s: &str) { + self.title.set_text(s); + } +} + +impl Title { + fn new(title: gtk::Label) -> Self { + Title { + title, + state: Normal {}, + } + } +} + +impl From> for Title { + fn from(machine: Title) -> Self { + machine + .title + .get_style_context() + .map(|c| c.add_class("dim-label")); + + Title { + title: machine.title, + state: GreyedOut {}, + } + } +} + +impl From> for Title { + fn from(machine: Title) -> Self { + machine + .title + .get_style_context() + .map(|c| c.remove_class("dim-label")); + + Title { + title: machine.title, + state: Normal {}, + } + } +} + +#[derive(Debug, Clone)] +pub enum TitleMachine { + Normal(Title), + GreyedOut(Title), +} + +impl TitleMachine { + pub fn new(label: gtk::Label, is_played: bool) -> Self { + let m = TitleMachine::Normal(Title::::new(label)); + m.determine_state(is_played) + } + + pub fn determine_state(self, is_played: bool) -> Self { + match (self, is_played) { + (title @ TitleMachine::Normal(_), false) => title, + (title @ TitleMachine::GreyedOut(_), true) => title, + (TitleMachine::Normal(val), true) => TitleMachine::GreyedOut(val.into()), + (TitleMachine::GreyedOut(val), false) => TitleMachine::Normal(val.into()), + } + } + + pub fn set_title(&self, s: &str) { + match *self { + TitleMachine::Normal(ref val) => val.set_title(s), + TitleMachine::GreyedOut(ref val) => val.set_title(s), + } + } +} diff --git a/hammond-gtk/src/widgets/mod.rs b/hammond-gtk/src/widgets/mod.rs index 3b348fa..476deef 100644 --- a/hammond-gtk/src/widgets/mod.rs +++ b/hammond-gtk/src/widgets/mod.rs @@ -1,5 +1,6 @@ mod show; mod episode; +mod episode_states; pub use self::episode::EpisodeWidget; pub use self::show::ShowWidget;