use event;
use input;
use std;
pub struct Global {
pub start: input::State,
pub current: input::State,
events: Vec<event::Event>,
pub last_click: Option<(std::time::Instant, event::Click)>,
}
#[derive(Clone)]
pub struct Events<'a> {
iter: std::slice::Iter<'a, event::Event>,
}
#[derive(Clone)]
pub struct UiEvents<'a> {
events: Events<'a>,
}
impl Global {
pub fn new() -> Global {
Global{
events: Vec::new(),
start: input::State::new(),
current: input::State::new(),
last_click: None,
}
}
pub fn events(&self) -> Events {
Events { iter: self.events.iter() }
}
pub fn push_event(&mut self, event: event::Event) {
self.events.push(event);
}
pub fn clear_events_and_update_start_state(&mut self) {
self.events.clear();
self.start = self.current.clone();
}
}
impl<'a> Events<'a> {
pub fn ui(self) -> UiEvents<'a> {
UiEvents { events: self }
}
}
impl<'a> Iterator for Events<'a> {
type Item = &'a event::Event;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
}
impl<'a> Iterator for UiEvents<'a> {
type Item = &'a event::Ui;
fn next(&mut self) -> Option<Self::Item> {
while let Some(event) = self.events.next() {
if let event::Event::Ui(ref ui_event) = *event {
return Some(ui_event);
}
}
None
}
}