enum Event {
Fixed, Click(u16, u16), Quit, }
use self::Event::*;
struct State;
type LayerManager = layer_system::LayerManager<State, Event>;
use layer_system::{Change, Layer};
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::none()
}
}
enum ClickEvent {
Action,
Pause,
Exit,
Nothing,
}
const UI_ROW_HEIGHT: u16 = 0x10;
const BUTTON_WIDTH: u16 = 0x40;
fn click(x: u16, y: u16) -> ClickEvent {
use ClickEvent::*;
if UI_ROW_HEIGHT > 0x10 {
return Nothing;
}
if x < BUTTON_WIDTH {
Action
} else if x < BUTTON_WIDTH * 2 {
Pause
} else if x < BUTTON_WIDTH * 3 {
Exit
} else {
Nothing
}
}
struct Interface;
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 click(*x, *y) {
ClickEvent::Action => {
Change::none()
}
ClickEvent::Pause => Change::add_single(Box::new(Pause)),
ClickEvent::Exit => Change::close(),
ClickEvent::Nothing => Change::pass(),
},
Quit => Change::add_single(Box::new(Pause)),
Fixed => Change::pass(),
}
}
}
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::none(),
Click(_, _) => Change::remove(),
Quit => Change::close(),
}
}
}
fn main() {
let mut manager = LayerManager::new(vec![Box::new(World), Box::new(Interface)]);
let mut state = State;
while manager.is_active() {
manager.update(&mut state, Fixed);
manager.update(&mut state, Click(0, 0));
manager.update(&mut state, Quit);
}
}