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.
This commit is contained in:
parent
75af3c7f2b
commit
5e302290de
@ -5,7 +5,7 @@
|
|||||||
)
|
)
|
||||||
)]
|
)]
|
||||||
#![allow(unknown_lints)]
|
#![allow(unknown_lints)]
|
||||||
#![deny(unused_extern_crates, unused)]
|
// #![deny(unused_extern_crates, unused)]
|
||||||
|
|
||||||
extern crate gdk;
|
extern crate gdk;
|
||||||
extern crate gdk_pixbuf;
|
extern crate gdk_pixbuf;
|
||||||
|
|||||||
@ -11,11 +11,18 @@ use widgets::{EmptyView, HomeView};
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::mpsc::Sender;
|
use std::sync::mpsc::Sender;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
enum State {
|
||||||
|
Home,
|
||||||
|
Empty,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct HomeStack {
|
pub struct HomeStack {
|
||||||
stack: gtk::Stack,
|
|
||||||
empty: EmptyView,
|
empty: EmptyView,
|
||||||
episodes: Rc<HomeView>,
|
episodes: Rc<HomeView>,
|
||||||
|
stack: gtk::Stack,
|
||||||
|
state: State,
|
||||||
sender: Sender<Action>,
|
sender: Sender<Action>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,17 +31,25 @@ impl HomeStack {
|
|||||||
let episodes = HomeView::new(sender.clone())?;
|
let episodes = HomeView::new(sender.clone())?;
|
||||||
let empty = EmptyView::new();
|
let empty = EmptyView::new();
|
||||||
let stack = gtk::Stack::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");
|
stack.add_named(&empty.container, "empty");
|
||||||
set_stack_visible(&stack)?;
|
|
||||||
|
|
||||||
Ok(HomeStack {
|
let mut home = HomeStack {
|
||||||
stack,
|
|
||||||
empty,
|
empty,
|
||||||
episodes,
|
episodes,
|
||||||
|
stack,
|
||||||
|
state,
|
||||||
sender,
|
sender,
|
||||||
})
|
};
|
||||||
|
|
||||||
|
home.determine_state()?;
|
||||||
|
Ok(home)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_stack(&self) -> gtk::Stack {
|
||||||
|
self.stack.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update(&mut self) -> Result<(), Error> {
|
pub fn update(&mut self) -> Result<(), Error> {
|
||||||
@ -45,8 +60,7 @@ impl HomeStack {
|
|||||||
.ok();
|
.ok();
|
||||||
|
|
||||||
self.replace_view()?;
|
self.replace_view()?;
|
||||||
set_stack_visible(&self.stack)?;
|
self.determine_state().map_err(From::from)
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn replace_view(&mut self) -> Result<(), Error> {
|
fn replace_view(&mut self) -> Result<(), Error> {
|
||||||
@ -56,7 +70,7 @@ impl HomeStack {
|
|||||||
|
|
||||||
// Remove the old widget and add the new one
|
// Remove the old widget and add the new one
|
||||||
self.stack.remove(old);
|
self.stack.remove(old);
|
||||||
self.stack.add_named(&eps.container, "episodes");
|
self.stack.add_named(&eps.container, "home");
|
||||||
|
|
||||||
// replace view in the struct too
|
// replace view in the struct too
|
||||||
self.episodes = eps;
|
self.episodes = eps;
|
||||||
@ -67,18 +81,30 @@ impl HomeStack {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_stack(&self) -> gtk::Stack {
|
#[inline]
|
||||||
self.stack.clone()
|
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]
|
#[inline]
|
||||||
fn set_stack_visible(stack: >k::Stack) -> Result<(), DataError> {
|
fn determine_state(&mut self) -> Result<(), DataError> {
|
||||||
if is_episodes_populated()? {
|
if is_episodes_populated()? {
|
||||||
stack.set_visible_child_name("episodes");
|
self.switch_visible(State::Home);
|
||||||
} else {
|
} else {
|
||||||
stack.set_visible_child_name("empty");
|
self.switch_visible(State::Empty);
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user