shine_input/guestures/
keyboardjoystick.rs1use crate::{ButtonId, Guesture, ModifierFilterMask, State};
2use std::any::Any;
3
4pub struct KeyboardJoystick {
5 axis: Vec<(ButtonId, ButtonId, ButtonId, ModifierFilterMask)>,
6}
7
8impl KeyboardJoystick {
9 pub fn new() -> KeyboardJoystick {
10 KeyboardJoystick { axis: Vec::new() }
11 }
12
13 pub fn add_axis(
14 &mut self,
15 button_pos: ButtonId,
16 button_neg: ButtonId,
17 axis_button: ButtonId,
18 axis_modifiers: Option<ModifierFilterMask>,
19 ) {
20 let mask = axis_modifiers.unwrap_or_else(ModifierFilterMask::default);
21 self.axis.push((button_pos, button_neg, axis_button, mask));
22 }
23}
24
25impl Default for KeyboardJoystick {
26 fn default() -> KeyboardJoystick {
27 KeyboardJoystick::new()
28 }
29}
30
31impl Guesture for KeyboardJoystick {
32 fn as_any(&self) -> &Any {
33 self
34 }
35
36 fn on_update(&mut self, _prev_state: &State, state: &mut State) {
37 for (pos, neg, axis, axis_modifiers) in &self.axis {
38 let is_pos = state.is_button(*pos);
39 let is_neg = state.is_button(*neg);
40 if is_pos == is_neg {
41 state.remove_button(*axis);
42 } else if is_pos {
43 state.set_button(*axis, axis_modifiers.clone(), 1., false);
44 } else {
45 assert!(is_neg);
46 state.set_button(*axis, axis_modifiers.clone(), -1., false);
47 }
48 }
49 }
50}