use device_query::{DeviceQuery, DeviceState};
use std::mem;
pub use device_query::Keycode;
pub struct Keybind {
device_state: DeviceState,
pressed_keys: Vec<Keycode>,
key_binds: Vec<Keycode>,
on_trigger: Box<Fn()>,
}
impl Keybind {
pub fn new(keys: &[Keycode]) -> Keybind {
Keybind {
device_state: DeviceState::new(),
pressed_keys: Vec::new(),
key_binds: keys.to_vec(),
on_trigger: Box::new(||{})
}
}
pub fn triggered(&mut self) -> bool {
let previous_pressed_keys = mem::replace(
&mut self.pressed_keys,
self.device_state.get_keys()
);
self.pressed_keys.len() == self.key_binds.len()
&& previous_pressed_keys != self.pressed_keys
&& self.pressed_keys == self.key_binds
}
pub fn on_trigger<C: Fn() + 'static>(&mut self, callback: C) {
self.on_trigger = Box::new(callback);
}
pub fn wait(&mut self) {
loop {
if self.triggered() {
(self.on_trigger)();
}
}
}
}