Skip to content

Commit 78fd707

Browse files
committed
input: Map PlayerEvent to InputEvent
This refactor adds InputEvent, which is a processed PlayerEvent: 1. it does not contain gamepad events, as they are already mapped, 2. it always contains click index, as it's inferred when processing input.
1 parent a6bb4e9 commit 78fd707

File tree

3 files changed

+128
-66
lines changed

3 files changed

+128
-66
lines changed

core/src/events.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::display_object::InteractiveObject;
1+
use crate::{display_object::InteractiveObject, input::InputEvent};
22
use std::str::FromStr;
33
use swf::ClipEventFlag;
44

@@ -766,17 +766,17 @@ impl ButtonKeyCode {
766766
})
767767
}
768768

769-
pub fn from_player_event(event: PlayerEvent) -> Option<Self> {
769+
pub fn from_input_event(event: InputEvent) -> Option<Self> {
770770
match event {
771771
// ASCII characters convert directly to keyPress button events.
772-
PlayerEvent::TextInput { codepoint }
772+
InputEvent::TextInput { codepoint }
773773
if codepoint as u32 >= 32 && codepoint as u32 <= 126 =>
774774
{
775775
Some(ButtonKeyCode::from_u8(codepoint as u8).unwrap())
776776
}
777777

778778
// Special keys have custom values for keyPress.
779-
PlayerEvent::KeyDown { key_code, .. } => Self::from_key_code(key_code),
779+
InputEvent::KeyDown { key_code, .. } => Self::from_key_code(key_code),
780780
_ => None,
781781
}
782782
}

core/src/input.rs

+88-27
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,49 @@
1-
use crate::events::{GamepadButton, KeyCode, MouseButton, PlayerEvent, TextControlCode};
1+
use crate::events::{
2+
GamepadButton, KeyCode, MouseButton, MouseWheelDelta, PlayerEvent, TextControlCode,
3+
};
24
use chrono::{DateTime, TimeDelta, Utc};
35
use std::collections::{HashMap, HashSet};
46

7+
/// An event describing input in general.
8+
///
9+
/// It's usually a processed [`PlayerEvent`].
10+
#[derive(Debug, Clone, Copy)]
11+
pub enum InputEvent {
12+
KeyDown {
13+
key_code: KeyCode,
14+
key_char: Option<char>,
15+
},
16+
KeyUp {
17+
key_code: KeyCode,
18+
key_char: Option<char>,
19+
},
20+
MouseMove {
21+
x: f64,
22+
y: f64,
23+
},
24+
MouseUp {
25+
x: f64,
26+
y: f64,
27+
button: MouseButton,
28+
},
29+
MouseDown {
30+
x: f64,
31+
y: f64,
32+
button: MouseButton,
33+
index: usize,
34+
},
35+
MouseLeave,
36+
MouseWheel {
37+
delta: MouseWheelDelta,
38+
},
39+
TextInput {
40+
codepoint: char,
41+
},
42+
TextControl {
43+
code: TextControlCode,
44+
},
45+
}
46+
547
struct ClickEventData {
648
x: f64,
749
y: f64,
@@ -67,72 +109,90 @@ impl InputManager {
67109
}
68110
}
69111

70-
pub fn process_input_event(&mut self, event: PlayerEvent) -> Option<PlayerEvent> {
71-
// Optionally transform gamepad button events into key events.
112+
pub fn process_event(&mut self, event: PlayerEvent) -> Option<InputEvent> {
72113
let event = match event {
114+
// Optionally transform gamepad button events into key events.
73115
PlayerEvent::GamepadButtonDown { button } => {
74116
if let Some(key_code) = self.gamepad_button_mapping.get(&button) {
75-
Some(PlayerEvent::KeyDown {
117+
InputEvent::KeyDown {
76118
key_code: *key_code,
77119
key_char: None,
78-
})
120+
}
79121
} else {
80122
// Just ignore this event.
81-
None
123+
return None;
82124
}
83125
}
84126
PlayerEvent::GamepadButtonUp { button } => {
85127
if let Some(key_code) = self.gamepad_button_mapping.get(&button) {
86-
Some(PlayerEvent::KeyUp {
128+
InputEvent::KeyUp {
87129
key_code: *key_code,
88130
key_char: None,
89-
})
131+
}
90132
} else {
91133
// Just ignore this event.
92-
None
134+
return None;
93135
}
94136
}
95-
_ => Some(event),
137+
138+
PlayerEvent::KeyDown { key_code, key_char } => {
139+
InputEvent::KeyDown { key_code, key_char }
140+
}
141+
PlayerEvent::KeyUp { key_code, key_char } => InputEvent::KeyUp { key_code, key_char },
142+
143+
PlayerEvent::MouseMove { x, y } => InputEvent::MouseMove { x, y },
144+
PlayerEvent::MouseUp { x, y, button } => InputEvent::MouseUp { x, y, button },
145+
PlayerEvent::MouseDown {
146+
x,
147+
y,
148+
button,
149+
index,
150+
} => InputEvent::MouseDown {
151+
x,
152+
y,
153+
button,
154+
index: self.update_last_click(x, y, index),
155+
},
156+
PlayerEvent::MouseLeave => InputEvent::MouseLeave,
157+
PlayerEvent::MouseWheel { delta } => InputEvent::MouseWheel { delta },
158+
159+
PlayerEvent::TextInput { codepoint } => InputEvent::TextInput { codepoint },
160+
PlayerEvent::TextControl { code } => InputEvent::TextControl { code },
161+
162+
// The following are not input events.
163+
PlayerEvent::FocusGained | PlayerEvent::FocusLost => return None,
96164
};
97165

98-
if let Some(event) = event {
99-
self.handle_event(&event);
100-
}
166+
self.handle_event(&event);
101167

102-
event
168+
Some(event)
103169
}
104170

105-
fn handle_event(&mut self, event: &PlayerEvent) {
171+
fn handle_event(&mut self, event: &InputEvent) {
106172
match *event {
107-
PlayerEvent::KeyDown { key_code, key_char } => {
173+
InputEvent::KeyDown { key_code, key_char } => {
108174
self.last_char = key_char;
109175
self.toggle_key(key_code);
110176
self.add_key(key_code);
111177
}
112-
PlayerEvent::KeyUp { key_code, key_char } => {
178+
InputEvent::KeyUp { key_code, key_char } => {
113179
self.last_char = key_char;
114180
self.remove_key(key_code);
115181
self.last_text_control = None;
116182
}
117-
PlayerEvent::TextControl { code } => {
183+
InputEvent::TextControl { code } => {
118184
self.last_text_control = Some(code);
119185
}
120-
PlayerEvent::MouseDown {
121-
x,
122-
y,
123-
button,
124-
index,
125-
} => {
186+
InputEvent::MouseDown { button, .. } => {
126187
self.toggle_key(button.into());
127188
self.add_key(button.into());
128-
self.update_last_click(x, y, index);
129189
}
130-
PlayerEvent::MouseUp { button, .. } => self.remove_key(button.into()),
190+
InputEvent::MouseUp { button, .. } => self.remove_key(button.into()),
131191
_ => {}
132192
}
133193
}
134194

135-
fn update_last_click(&mut self, x: f64, y: f64, index: Option<usize>) {
195+
fn update_last_click(&mut self, x: f64, y: f64, index: Option<usize>) -> usize {
136196
let time = Utc::now();
137197
let index = index.unwrap_or_else(|| {
138198
let Some(last_click) = self.last_click.as_ref() else {
@@ -149,6 +209,7 @@ impl InputManager {
149209
}
150210
});
151211
self.last_click = Some(ClickEventData { x, y, time, index });
212+
index
152213
}
153214

154215
pub fn is_key_down(&self, key: KeyCode) -> bool {

0 commit comments

Comments
 (0)