From ba15dc77aed7f2a616e9308fe45a4ecc94eafb54 Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Mon, 10 Feb 2025 23:08:35 -0500 Subject: [PATCH] When the UI consumes an input, don't send it to the game --- src/app.rs | 59 ++++++++++++++++++++++++--------------------- src/window.rs | 6 +++-- src/window/input.rs | 29 +++++++++++++--------- 3 files changed, 53 insertions(+), 41 deletions(-) diff --git a/src/app.rs b/src/app.rs index 10a7d1d..4c1b57d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -130,19 +130,23 @@ impl ApplicationHandler for Application { return; }; let viewport_id = viewport.id(); - match &event { - WindowEvent::KeyboardInput { event, .. } => { - self.controllers.handle_key_event(event); - viewport.app.handle_key_event(event); - } - WindowEvent::Focused(new_focused) => { - self.focused = new_focused.then_some(viewport_id); - } - _ => {} - } let mut queue_redraw = false; let mut inactive_viewports = HashSet::new(); - match viewport.on_window_event(event) { + let (consumed, action) = viewport.on_window_event(&event); + if !consumed { + match event { + WindowEvent::KeyboardInput { event, .. } => { + if !viewport.app.handle_key_event(&event) { + self.controllers.handle_key_event(&event); + } + } + WindowEvent::Focused(new_focused) => { + self.focused = new_focused.then_some(viewport_id); + } + _ => {} + } + } + match action { Some(Action::Redraw) => { for viewport in self.viewports.values_mut() { match viewport.redraw(event_loop) { @@ -194,15 +198,16 @@ impl ApplicationHandler for Application { fn user_event(&mut self, event_loop: &ActiveEventLoop, event: UserEvent) { match event { UserEvent::GamepadEvent(event) => { - self.controllers.handle_gamepad_event(&event); - let Some(viewport) = self + if let Some(viewport) = self .focused .as_ref() .and_then(|id| self.viewports.get_mut(id)) - else { - return; - }; - viewport.app.handle_gamepad_event(&event); + { + if viewport.app.handle_gamepad_event(&event) { + return; + } + } + self.controllers.handle_gamepad_event(&event); } UserEvent::OpenAbout => { let about = AboutWindow; @@ -388,8 +393,8 @@ impl Viewport { self.app.viewport_id() } - pub fn on_window_event(&mut self, event: WindowEvent) -> Option { - let response = self.state.on_window_event(&self.window, &event); + pub fn on_window_event(&mut self, event: &WindowEvent) -> (bool, Option) { + let response = self.state.on_window_event(&self.window, event); egui_winit::update_viewport_info( &mut self.info, self.state.egui_ctx(), @@ -397,22 +402,22 @@ impl Viewport { false, ); - match event { + let action = match event { WindowEvent::RedrawRequested => Some(Action::Redraw), WindowEvent::CloseRequested => Some(Action::Close), WindowEvent::Resized(size) => { - let (Some(width), Some(height)) = + if let (Some(width), Some(height)) = (NonZero::new(size.width), NonZero::new(size.height)) - else { - return None; - }; - self.painter - .on_window_resized(ViewportId::ROOT, width, height); + { + self.painter + .on_window_resized(ViewportId::ROOT, width, height); + } None } _ if response.repaint => Some(Action::Redraw), _ => None, - } + }; + (response.consumed, action) } fn redraw(&mut self, event_loop: &ActiveEventLoop) -> Option { diff --git a/src/window.rs b/src/window.rs index ac5922e..132caca 100644 --- a/src/window.rs +++ b/src/window.rs @@ -28,10 +28,12 @@ pub trait AppWindow { let _ = render_state; } fn on_destroy(&mut self) {} - fn handle_key_event(&mut self, event: &KeyEvent) { + fn handle_key_event(&mut self, event: &KeyEvent) -> bool { let _ = event; + false } - fn handle_gamepad_event(&mut self, event: &gilrs::Event) { + fn handle_gamepad_event(&mut self, event: &gilrs::Event) -> bool { let _ = event; + false } } diff --git a/src/window/input.rs b/src/window/input.rs index 8fc20c2..de23e9b 100644 --- a/src/window/input.rs +++ b/src/window/input.rs @@ -198,58 +198,63 @@ impl AppWindow for InputWindow { }); } - fn handle_key_event(&mut self, event: &winit::event::KeyEvent) { + fn handle_key_event(&mut self, event: &winit::event::KeyEvent) -> bool { if !event.state.is_pressed() { - return; + return false; } let sim_id = match self.active_tab { InputTab::Player1 => SimId::Player1, InputTab::Player2 => SimId::Player2, _ => { - return; + return false; } }; let Some(vb) = self.now_binding.take() else { - return; + return false; }; let mut mappings = self.mappings.for_sim(sim_id).write().unwrap(); mappings.add_keyboard_mapping(vb, event.physical_key); drop(mappings); self.mappings.save(); + true } - fn handle_gamepad_event(&mut self, event: &gilrs::Event) { + fn handle_gamepad_event(&mut self, event: &gilrs::Event) -> bool { let InputTab::RebindGamepad(gamepad_id) = self.active_tab else { - return; + return false; }; if gamepad_id != event.id { - return; + return false; } let Some(mappings) = self.mappings.for_gamepad(gamepad_id) else { - return; + return false; }; let Some(vb) = self.now_binding else { - return; + return false; }; match event.event { EventType::ButtonPressed(_, code) => { let mut mapping = mappings.write().unwrap(); mapping.add_button_mapping(vb, code); self.now_binding.take(); + true } EventType::AxisChanged(_, value, code) => { if value < -0.75 { let mut mapping = mappings.write().unwrap(); mapping.add_axis_neg_mapping(vb, code); self.now_binding.take(); - } - if value > 0.75 { + true + } else if value > 0.75 { let mut mapping = mappings.write().unwrap(); mapping.add_axis_pos_mapping(vb, code); self.now_binding.take(); + true + } else { + false } } - _ => {} + _ => false, } } }