enum Event {
Fixed, Click(u16, u16), Quit, }
use self::Event::*;
struct State;
type LayerManager<'m> = layer_system::LayerManager<'m, State, Event>;
use layer_system::{Layer, Change};
struct World;
impl Layer<State, Event> for World {
fn passive_update(&mut self, state: &mut State, event: &Event) {
match event {
Fixed => { }
_ => (),
}
}
fn update(&mut self, state: &mut State, event: &Event) -> Change<State, Event> {
match event {
Fixed => { }
_ => ()
}
Change::Stay
}
}
struct Interface;
enum ClickEvent {
Action,
Pause,
Exit,
Nothing,
}
impl Interface {
fn click(&self, x: u16, y: u16) -> ClickEvent {
use self::ClickEvent::*;
if y < 16 {
if x < 64 {
Action
} else if x < 128 {
Pause
} else if x < 192 {
Exit
} else {
Nothing
}
} else {
Nothing
}
}
}
impl Layer<State, Event> for Interface {
fn passive_update(&mut self, state: &mut State, event: &Event) {
match event {
Fixed => { }
_ => (),
}
}
fn update(&mut self, state: &mut State, event: &Event) -> Change<State, Event> {
match event {
Click(x, y) => match self.click(*x, *y) {
ClickEvent::Action => {
Change::Stay
},
ClickEvent::Pause => Change::Add(Box::new(Pause)),
ClickEvent::Exit => Change::Close,
ClickEvent::Nothing => Change::Defer,
}
Quit => Change::Add(Box::new(Pause)),
_ => Change::Defer,
}
}
}
struct Pause;
impl Layer<State, Event> for Pause {
fn passive_update(&mut self, state: &mut State, event: &Event) {
match event {
Fixed => { }
_ => (),
}
}
fn update(&mut self, state: &mut State, event: &Event) -> Change<State, Event> {
match event {
Fixed => Change::Stay,
Click(_, _) => Change::Remove,
Quit => Change::Close,
}
}
}
fn main() {
let mut manager = LayerManager::new();
manager.add(World); manager.add(Interface);
let mut state = State;
while manager.is_active() {
manager.update(&mut state, Fixed);
}
}