use crate::*;
impl Input {
pub fn extract_key_code(event: &Event) -> String {
Reflect::get(event.as_ref(), &JsValue::from_str(INPUT_KEY_CODE_PROPERTY))
.ok()
.and_then(|value: JsValue| value.as_string())
.unwrap_or_default()
}
pub fn extract_mouse_button(event: &Event) -> MouseButton {
let button_value: i32 = Reflect::get(
event.as_ref(),
&JsValue::from_str(INPUT_MOUSE_BUTTON_PROPERTY),
)
.ok()
.and_then(|value: JsValue| value.as_f64())
.map(|float: f64| float as i32)
.unwrap_or(0);
match button_value {
0 => MouseButton::Left,
1 => MouseButton::Middle,
2 => MouseButton::Right,
3 => MouseButton::Button4,
4 => MouseButton::Button5,
_ => MouseButton::Left,
}
}
pub fn extract_mouse_position(event: &Event) -> Vector2D {
let client_x: f64 =
Reflect::get(event.as_ref(), &JsValue::from_str(INPUT_CLIENT_X_PROPERTY))
.ok()
.and_then(|value: JsValue| value.as_f64())
.unwrap_or(0.0);
let client_y: f64 =
Reflect::get(event.as_ref(), &JsValue::from_str(INPUT_CLIENT_Y_PROPERTY))
.ok()
.and_then(|value: JsValue| value.as_f64())
.unwrap_or(0.0);
Vector2D::new(client_x, client_y)
}
}
impl InputState {
pub fn press_key(&mut self, key_code: String) {
if !self.get_keys_held().contains(&key_code) {
self.get_mut_keys_pressed().insert(key_code.clone());
}
self.get_mut_keys_held().insert(key_code);
}
pub fn release_key(&mut self, key_code: String) {
self.get_mut_keys_held().remove(&key_code);
self.get_mut_keys_released().insert(key_code);
}
pub fn is_key_pressed(&self, key_code: &str) -> bool {
self.get_keys_pressed().contains(key_code)
}
pub fn is_key_held(&self, key_code: &str) -> bool {
self.get_keys_held().contains(key_code)
}
pub fn is_key_released(&self, key_code: &str) -> bool {
self.get_keys_released().contains(key_code)
}
pub fn press_mouse_button(&mut self, button: MouseButton, position: Vector2D) {
if !self.get_mouse_buttons_held().contains(&button) {
self.get_mut_mouse_buttons_pressed().insert(button);
}
self.get_mut_mouse_buttons_held().insert(button);
self.set_mouse_position(position);
}
pub fn release_mouse_button(&mut self, button: MouseButton) {
self.get_mut_mouse_buttons_held().remove(&button);
self.get_mut_mouse_buttons_released().insert(button);
}
pub fn update_mouse_position(&mut self, position: Vector2D) {
self.set_mouse_delta(position - self.get_mouse_position());
self.set_mouse_position(position);
self.set_mouse_moved(true);
}
pub fn is_mouse_button_pressed(&self, button: MouseButton) -> bool {
self.get_mouse_buttons_pressed().contains(&button)
}
pub fn is_mouse_button_held(&self, button: MouseButton) -> bool {
self.get_mouse_buttons_held().contains(&button)
}
pub fn update_touch(&mut self, identifier: i32, position: Vector2D) {
self.get_mut_touch_points().insert(identifier, position);
}
pub fn start_touch(&mut self, identifier: i32, position: Vector2D) {
self.get_mut_touch_points().insert(identifier, position);
self.get_mut_touch_started().insert(identifier);
}
pub fn end_touch(&mut self, identifier: i32) {
self.get_mut_touch_points().remove(&identifier);
self.get_mut_touch_ended().insert(identifier);
}
pub fn end_frame(&mut self) {
self.get_mut_keys_pressed().clear();
self.get_mut_keys_released().clear();
self.get_mut_mouse_buttons_pressed().clear();
self.get_mut_mouse_buttons_released().clear();
self.set_mouse_delta(Vector2D::zero());
self.set_mouse_moved(false);
self.get_mut_touch_started().clear();
self.get_mut_touch_ended().clear();
}
}
impl Default for InputState {
fn default() -> InputState {
InputState::new()
}
}