1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use crate::{ButtonId, Guesture, ModifierFilterMask, State};
use std::any::Any;

pub struct KeyboardJoystick {
    axis: Vec<(ButtonId, ButtonId, ButtonId, ModifierFilterMask)>,
}

impl KeyboardJoystick {
    pub fn new() -> KeyboardJoystick {
        KeyboardJoystick { axis: Vec::new() }
    }

    pub fn add_axis(
        &mut self,
        button_pos: ButtonId,
        button_neg: ButtonId,
        axis_button: ButtonId,
        axis_modifiers: Option<ModifierFilterMask>,
    ) {
        let mask = axis_modifiers.unwrap_or_else(ModifierFilterMask::default);
        self.axis.push((button_pos, button_neg, axis_button, mask));
    }
}

impl Default for KeyboardJoystick {
    fn default() -> KeyboardJoystick {
        KeyboardJoystick::new()
    }
}

impl Guesture for KeyboardJoystick {
    fn as_any(&self) -> &Any {
        self
    }

    fn on_update(&mut self, _prev_state: &State, state: &mut State) {
        for (pos, neg, axis, axis_modifiers) in &self.axis {
            let is_pos = state.is_button(*pos);
            let is_neg = state.is_button(*neg);
            if is_pos == is_neg {
                state.remove_button(*axis);
            } else if is_pos {
                state.set_button(*axis, axis_modifiers.clone(), 1., false);
            } else {
                assert!(is_neg);
                state.set_button(*axis, axis_modifiers.clone(), -1., false);
            }
        }
    }
}