1use winit::event::{ElementState, MouseButton, MouseScrollDelta, WindowEvent};
2use winit::event_loop::ActiveEventLoop;
3
4use engvis_core::{InputState, OrbitCamera};
5
6pub struct EventContext<'a> {
7 pub input: &'a mut InputState,
8 pub camera: &'a mut OrbitCamera,
9 pub window_width: u32,
10 pub window_height: u32,
11}
12
13pub enum EventResult {
14 Consumed,
15 NotConsumed,
16 Exit,
17}
18
19pub fn handle_window_event(
20 event_loop: &ActiveEventLoop,
21 event: &WindowEvent,
22 ctx: &mut EventContext,
23) -> EventResult {
24 match event {
25 WindowEvent::CloseRequested => {
26 event_loop.exit();
27 EventResult::Exit
28 }
29 WindowEvent::Resized(size) => {
30 ctx.window_width = size.width;
31 ctx.window_height = size.height;
32 EventResult::Consumed
33 }
34 WindowEvent::MouseWheel { delta, .. } => {
35 let scroll = match delta {
36 MouseScrollDelta::LineDelta(_, y) => *y,
37 MouseScrollDelta::PixelDelta(pos) => pos.y as f32 * 0.01,
38 };
39 ctx.input.scroll_delta += scroll;
40 EventResult::Consumed
41 }
42 WindowEvent::MouseInput { button, state, .. } => {
43 match (button, state) {
44 (MouseButton::Left, ElementState::Pressed) => ctx.input.left_mouse_down = true,
45 (MouseButton::Left, ElementState::Released) => ctx.input.left_mouse_down = false,
46 (MouseButton::Right, ElementState::Pressed) => ctx.input.right_mouse_down = true,
47 (MouseButton::Right, ElementState::Released) => ctx.input.right_mouse_down = false,
48 (MouseButton::Middle, ElementState::Pressed) => ctx.input.middle_mouse_down = true,
49 (MouseButton::Middle, ElementState::Released) => {
50 ctx.input.middle_mouse_down = false
51 }
52 _ => {}
53 }
54 EventResult::Consumed
55 }
56 WindowEvent::CursorMoved { position, .. } => {
57 ctx.input.cursor_x = position.x;
58 ctx.input.cursor_y = position.y;
59 EventResult::NotConsumed
60 }
61 _ => EventResult::NotConsumed,
62 }
63}