use std::collections::HashSet;
use lotus_proc_macros::Resource;
use winit::keyboard::{KeyCode, PhysicalKey};
use super::input::Input;
#[derive(Clone, Debug, Resource)]
pub struct KeyboardInput {
pub pressed: HashSet<PhysicalKey>,
pub previously_pressed: HashSet<PhysicalKey>
}
impl Input for KeyboardInput {
fn update_hashes(&mut self) {
self.previously_pressed = self.pressed.clone();
}
fn is_some_pressed(&self) -> bool {
return self.pressed.len() > 0;
}
fn is_some_released(&self) -> bool {
return self.previously_pressed.len() > 0;
}
}
impl Default for KeyboardInput {
fn default() -> Self {
return Self {
pressed: HashSet::new(),
previously_pressed: HashSet::new(),
};
}
}
impl KeyboardInput {
pub fn is_some_of_keys_pressed(&self, keys: Vec<KeyCode>) -> bool {
let mut is_some_of_keys_pressed: bool = false;
for key in keys {
is_some_of_keys_pressed = self.pressed.contains(&PhysicalKey::Code(key));
if is_some_of_keys_pressed {
return is_some_of_keys_pressed;
}
}
return is_some_of_keys_pressed;
}
pub fn is_key_pressed(&self, key: KeyCode) -> bool {
return self.pressed.contains(&PhysicalKey::Code(key));
}
pub fn is_some_of_keys_released(&self, keys: Vec<KeyCode>) -> bool {
let mut is_some_of_keys_released: bool = false;
for key in keys {
is_some_of_keys_released = self.previously_pressed.contains(&PhysicalKey::Code(key)) && !self.pressed.contains(&PhysicalKey::Code(key));
if is_some_of_keys_released {
return is_some_of_keys_released;
}
}
return is_some_of_keys_released;
}
pub fn is_key_released(&self, key: KeyCode) -> bool {
return self.previously_pressed.contains(&PhysicalKey::Code(key)) && !self.pressed.contains(&PhysicalKey::Code(key));
}
}