1
- use crate :: events:: { GamepadButton , KeyCode , MouseButton , PlayerEvent , TextControlCode } ;
1
+ use crate :: events:: {
2
+ GamepadButton , KeyCode , MouseButton , MouseWheelDelta , PlayerEvent , TextControlCode ,
3
+ } ;
2
4
use chrono:: { DateTime , TimeDelta , Utc } ;
3
5
use std:: collections:: { HashMap , HashSet } ;
4
6
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
+
5
47
struct ClickEventData {
6
48
x : f64 ,
7
49
y : f64 ,
@@ -67,72 +109,90 @@ impl InputManager {
67
109
}
68
110
}
69
111
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 > {
72
113
let event = match event {
114
+ // Optionally transform gamepad button events into key events.
73
115
PlayerEvent :: GamepadButtonDown { button } => {
74
116
if let Some ( key_code) = self . gamepad_button_mapping . get ( & button) {
75
- Some ( PlayerEvent :: KeyDown {
117
+ InputEvent :: KeyDown {
76
118
key_code : * key_code,
77
119
key_char : None ,
78
- } )
120
+ }
79
121
} else {
80
122
// Just ignore this event.
81
- None
123
+ return None ;
82
124
}
83
125
}
84
126
PlayerEvent :: GamepadButtonUp { button } => {
85
127
if let Some ( key_code) = self . gamepad_button_mapping . get ( & button) {
86
- Some ( PlayerEvent :: KeyUp {
128
+ InputEvent :: KeyUp {
87
129
key_code : * key_code,
88
130
key_char : None ,
89
- } )
131
+ }
90
132
} else {
91
133
// Just ignore this event.
92
- None
134
+ return None ;
93
135
}
94
136
}
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 ,
96
164
} ;
97
165
98
- if let Some ( event) = event {
99
- self . handle_event ( & event) ;
100
- }
166
+ self . handle_event ( & event) ;
101
167
102
- event
168
+ Some ( event)
103
169
}
104
170
105
- fn handle_event ( & mut self , event : & PlayerEvent ) {
171
+ fn handle_event ( & mut self , event : & InputEvent ) {
106
172
match * event {
107
- PlayerEvent :: KeyDown { key_code, key_char } => {
173
+ InputEvent :: KeyDown { key_code, key_char } => {
108
174
self . last_char = key_char;
109
175
self . toggle_key ( key_code) ;
110
176
self . add_key ( key_code) ;
111
177
}
112
- PlayerEvent :: KeyUp { key_code, key_char } => {
178
+ InputEvent :: KeyUp { key_code, key_char } => {
113
179
self . last_char = key_char;
114
180
self . remove_key ( key_code) ;
115
181
self . last_text_control = None ;
116
182
}
117
- PlayerEvent :: TextControl { code } => {
183
+ InputEvent :: TextControl { code } => {
118
184
self . last_text_control = Some ( code) ;
119
185
}
120
- PlayerEvent :: MouseDown {
121
- x,
122
- y,
123
- button,
124
- index,
125
- } => {
186
+ InputEvent :: MouseDown { button, .. } => {
126
187
self . toggle_key ( button. into ( ) ) ;
127
188
self . add_key ( button. into ( ) ) ;
128
- self . update_last_click ( x, y, index) ;
129
189
}
130
- PlayerEvent :: MouseUp { button, .. } => self . remove_key ( button. into ( ) ) ,
190
+ InputEvent :: MouseUp { button, .. } => self . remove_key ( button. into ( ) ) ,
131
191
_ => { }
132
192
}
133
193
}
134
194
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 {
136
196
let time = Utc :: now ( ) ;
137
197
let index = index. unwrap_or_else ( || {
138
198
let Some ( last_click) = self . last_click . as_ref ( ) else {
@@ -149,6 +209,7 @@ impl InputManager {
149
209
}
150
210
} ) ;
151
211
self . last_click = Some ( ClickEventData { x, y, time, index } ) ;
212
+ index
152
213
}
153
214
154
215
pub fn is_key_down ( & self , key : KeyCode ) -> bool {
0 commit comments