summaryrefslogtreecommitdiff
path: root/racer-tracer/src/key_inputs.rs
diff options
context:
space:
mode:
authorSakarias Johansson <sakarias.johansson@goodbyekansas.com>2023-03-20 21:25:41 +0100
committerSakarias Johansson <sakariasjohansson@hotmail.com>2023-03-20 21:33:38 +0100
commited8de4988d3f1c81bc4ca833c760dce1497e99d7 (patch)
tree9c96da4d3f2b5216f6e7f455f77ab5cd931d7c8f /racer-tracer/src/key_inputs.rs
parent60139fe0629a2680160549b525c7cb18bb43be13 (diff)
downloadracer-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.rs57
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)
+ }
+ })
+ });
+ }
+}