diff options
| author | Sakarias Johansson <sakarias.johansson@goodbyekansas.com> | 2023-03-20 21:25:41 +0100 |
|---|---|---|
| committer | Sakarias Johansson <sakariasjohansson@hotmail.com> | 2023-03-20 21:33:38 +0100 |
| commit | ed8de4988d3f1c81bc4ca833c760dce1497e99d7 (patch) | |
| tree | 9c96da4d3f2b5216f6e7f455f77ab5cd931d7c8f /racer-tracer/src/key_inputs.rs | |
| parent | 60139fe0629a2680160549b525c7cb18bb43be13 (diff) | |
| download | racer-tracer-ed8de4988d3f1c81bc4ca833c760dce1497e99d7.tar.gz racer-tracer-ed8de4988d3f1c81bc4ca833c760dce1497e99d7.tar.xz racer-tracer-ed8de4988d3f1c81bc4ca833c760dce1497e99d7.zip | |
✨ Add simple way of handling inputs through CBs
Diffstat (limited to 'racer-tracer/src/key_inputs.rs')
| -rw-r--r-- | racer-tracer/src/key_inputs.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/racer-tracer/src/key_inputs.rs b/racer-tracer/src/key_inputs.rs new file mode 100644 index 0000000..06e0f99 --- /dev/null +++ b/racer-tracer/src/key_inputs.rs @@ -0,0 +1,57 @@ +use std::collections::HashMap; + +use minifb::{Key, Window}; + +use crate::error::TracerError; + +pub type KeyClosure<'a> = &'a (dyn Fn(f64) -> Result<(), TracerError> + Send + Sync); + +pub struct KeyInputs<'a> { + is_down_callbacks: HashMap<Key, Vec<KeyClosure<'a>>>, + is_released_callbacks: HashMap<Key, Vec<KeyClosure<'a>>>, +} + +impl<'a> KeyInputs<'a> { + pub fn new() -> Self { + KeyInputs { + is_down_callbacks: HashMap::new(), + is_released_callbacks: HashMap::new(), + } + } + + pub fn release(&mut self, key: Key, closure: KeyClosure<'a>) { + let callbacks = self + .is_released_callbacks + .entry(key) + .or_insert_with(Vec::new); + callbacks.push(closure); + } + + pub fn down(&mut self, key: Key, closure: KeyClosure<'a>) { + let callbacks = self.is_down_callbacks.entry(key).or_insert_with(Vec::new); + callbacks.push(closure); + } + + pub fn update(&mut self, window: &Window, dt: f64) { + self.is_down_callbacks + .iter_mut() + .filter(|(key, _callbacks)| window.is_key_down(**key)) + .for_each(|(_key, callbacks)| { + callbacks.iter_mut().for_each(|callback| { + if let Err(e) = callback(dt) { + println!("Key callback error: {}", e) + } + }) + }); + self.is_released_callbacks + .iter_mut() + .filter(|(key, _callbacks)| window.is_key_released(**key)) + .for_each(|(_key, callbacks)| { + callbacks.iter_mut().for_each(|callback| { + if let Err(e) = callback(dt) { + println!("Key callback error: {}", e) + } + }) + }); + } +} |
