From ed8de4988d3f1c81bc4ca833c760dce1497e99d7 Mon Sep 17 00:00:00 2001 From: Sakarias Johansson Date: Mon, 20 Mar 2023 21:25:41 +0100 Subject: =?UTF-8?q?=E2=9C=A8=20Add=20simple=20way=20of=20handling=20inputs?= =?UTF-8?q?=20through=20CBs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- racer-tracer/src/key_inputs.rs | 57 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 racer-tracer/src/key_inputs.rs (limited to 'racer-tracer/src/key_inputs.rs') 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>>, + is_released_callbacks: HashMap>>, +} + +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) + } + }) + }); + } +} -- cgit v1.2.3