shine_input/guestures/
keyboardjoystick.rs

1use 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}