From 5e302290de75f7ac1c02324ba0ef2e98675563ea Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Tue, 24 Apr 2018 09:59:29 +0300 Subject: [PATCH] HomeStack: Minor refactor to wrap gtk::Stack actions. For now the methods are private and migth not be neccesarry, but it will be much easier to manipulate the stack from outside with this API if it's needed and the methods are made public. --- hammond-gtk/src/main.rs | 2 +- hammond-gtk/src/stacks/home.rs | 70 +++++++++++++++++++++++----------- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/hammond-gtk/src/main.rs b/hammond-gtk/src/main.rs index 1a75de1..56e41d9 100644 --- a/hammond-gtk/src/main.rs +++ b/hammond-gtk/src/main.rs @@ -5,7 +5,7 @@ ) )] #![allow(unknown_lints)] -#![deny(unused_extern_crates, unused)] +// #![deny(unused_extern_crates, unused)] extern crate gdk; extern crate gdk_pixbuf; diff --git a/hammond-gtk/src/stacks/home.rs b/hammond-gtk/src/stacks/home.rs index e0144a8..8081443 100644 --- a/hammond-gtk/src/stacks/home.rs +++ b/hammond-gtk/src/stacks/home.rs @@ -11,11 +11,18 @@ use widgets::{EmptyView, HomeView}; use std::rc::Rc; use std::sync::mpsc::Sender; +#[derive(Debug, Clone)] +enum State { + Home, + Empty, +} + #[derive(Debug, Clone)] pub struct HomeStack { - stack: gtk::Stack, empty: EmptyView, episodes: Rc, + stack: gtk::Stack, + state: State, sender: Sender, } @@ -24,17 +31,25 @@ impl HomeStack { let episodes = HomeView::new(sender.clone())?; let empty = EmptyView::new(); let stack = gtk::Stack::new(); + let state = State::Empty; - stack.add_named(&episodes.container, "episodes"); + stack.add_named(&episodes.container, "home"); stack.add_named(&empty.container, "empty"); - set_stack_visible(&stack)?; - Ok(HomeStack { - stack, + let mut home = HomeStack { empty, episodes, + stack, + state, sender, - }) + }; + + home.determine_state()?; + Ok(home) + } + + pub fn get_stack(&self) -> gtk::Stack { + self.stack.clone() } pub fn update(&mut self) -> Result<(), Error> { @@ -45,8 +60,7 @@ impl HomeStack { .ok(); self.replace_view()?; - set_stack_visible(&self.stack)?; - Ok(()) + self.determine_state().map_err(From::from) } fn replace_view(&mut self) -> Result<(), Error> { @@ -56,7 +70,7 @@ impl HomeStack { // Remove the old widget and add the new one self.stack.remove(old); - self.stack.add_named(&eps.container, "episodes"); + self.stack.add_named(&eps.container, "home"); // replace view in the struct too self.episodes = eps; @@ -67,18 +81,30 @@ impl HomeStack { Ok(()) } - pub fn get_stack(&self) -> gtk::Stack { - self.stack.clone() + #[inline] + fn switch_visible(&mut self, s: State) { + use self::State::*; + + match s { + Home => { + self.stack.set_visible_child_name("home"); + self.state = Home; + } + Empty => { + self.stack.set_visible_child_name("empty"); + self.state = Empty; + } + } + } + + #[inline] + fn determine_state(&mut self) -> Result<(), DataError> { + if is_episodes_populated()? { + self.switch_visible(State::Home); + } else { + self.switch_visible(State::Empty); + }; + + Ok(()) } } - -#[inline] -fn set_stack_visible(stack: >k::Stack) -> Result<(), DataError> { - if is_episodes_populated()? { - stack.set_visible_child_name("episodes"); - } else { - stack.set_visible_child_name("empty"); - }; - - Ok(()) -}