When the UI consumes an input, don't send it to the game

This commit is contained in:
Simon Gellis 2025-02-10 23:08:35 -05:00
parent ebe444870f
commit ba15dc77ae
3 changed files with 53 additions and 41 deletions

View File

@ -130,19 +130,23 @@ impl ApplicationHandler<UserEvent> for Application {
return; return;
}; };
let viewport_id = viewport.id(); let viewport_id = viewport.id();
match &event { let mut queue_redraw = false;
let mut inactive_viewports = HashSet::new();
let (consumed, action) = viewport.on_window_event(&event);
if !consumed {
match event {
WindowEvent::KeyboardInput { event, .. } => { WindowEvent::KeyboardInput { event, .. } => {
self.controllers.handle_key_event(event); if !viewport.app.handle_key_event(&event) {
viewport.app.handle_key_event(event); self.controllers.handle_key_event(&event);
}
} }
WindowEvent::Focused(new_focused) => { WindowEvent::Focused(new_focused) => {
self.focused = new_focused.then_some(viewport_id); self.focused = new_focused.then_some(viewport_id);
} }
_ => {} _ => {}
} }
let mut queue_redraw = false; }
let mut inactive_viewports = HashSet::new(); match action {
match viewport.on_window_event(event) {
Some(Action::Redraw) => { Some(Action::Redraw) => {
for viewport in self.viewports.values_mut() { for viewport in self.viewports.values_mut() {
match viewport.redraw(event_loop) { match viewport.redraw(event_loop) {
@ -194,15 +198,16 @@ impl ApplicationHandler<UserEvent> for Application {
fn user_event(&mut self, event_loop: &ActiveEventLoop, event: UserEvent) { fn user_event(&mut self, event_loop: &ActiveEventLoop, event: UserEvent) {
match event { match event {
UserEvent::GamepadEvent(event) => { UserEvent::GamepadEvent(event) => {
self.controllers.handle_gamepad_event(&event); if let Some(viewport) = self
let Some(viewport) = self
.focused .focused
.as_ref() .as_ref()
.and_then(|id| self.viewports.get_mut(id)) .and_then(|id| self.viewports.get_mut(id))
else { {
if viewport.app.handle_gamepad_event(&event) {
return; return;
}; }
viewport.app.handle_gamepad_event(&event); }
self.controllers.handle_gamepad_event(&event);
} }
UserEvent::OpenAbout => { UserEvent::OpenAbout => {
let about = AboutWindow; let about = AboutWindow;
@ -388,8 +393,8 @@ impl Viewport {
self.app.viewport_id() self.app.viewport_id()
} }
pub fn on_window_event(&mut self, event: WindowEvent) -> Option<Action> { pub fn on_window_event(&mut self, event: &WindowEvent) -> (bool, Option<Action>) {
let response = self.state.on_window_event(&self.window, &event); let response = self.state.on_window_event(&self.window, event);
egui_winit::update_viewport_info( egui_winit::update_viewport_info(
&mut self.info, &mut self.info,
self.state.egui_ctx(), self.state.egui_ctx(),
@ -397,22 +402,22 @@ impl Viewport {
false, false,
); );
match event { let action = match event {
WindowEvent::RedrawRequested => Some(Action::Redraw), WindowEvent::RedrawRequested => Some(Action::Redraw),
WindowEvent::CloseRequested => Some(Action::Close), WindowEvent::CloseRequested => Some(Action::Close),
WindowEvent::Resized(size) => { WindowEvent::Resized(size) => {
let (Some(width), Some(height)) = if let (Some(width), Some(height)) =
(NonZero::new(size.width), NonZero::new(size.height)) (NonZero::new(size.width), NonZero::new(size.height))
else { {
return None;
};
self.painter self.painter
.on_window_resized(ViewportId::ROOT, width, height); .on_window_resized(ViewportId::ROOT, width, height);
}
None None
} }
_ if response.repaint => Some(Action::Redraw), _ if response.repaint => Some(Action::Redraw),
_ => None, _ => None,
} };
(response.consumed, action)
} }
fn redraw(&mut self, event_loop: &ActiveEventLoop) -> Option<Action> { fn redraw(&mut self, event_loop: &ActiveEventLoop) -> Option<Action> {

View File

@ -28,10 +28,12 @@ pub trait AppWindow {
let _ = render_state; let _ = render_state;
} }
fn on_destroy(&mut self) {} fn on_destroy(&mut self) {}
fn handle_key_event(&mut self, event: &KeyEvent) { fn handle_key_event(&mut self, event: &KeyEvent) -> bool {
let _ = event; let _ = event;
false
} }
fn handle_gamepad_event(&mut self, event: &gilrs::Event) { fn handle_gamepad_event(&mut self, event: &gilrs::Event) -> bool {
let _ = event; let _ = event;
false
} }
} }

View File

@ -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() { if !event.state.is_pressed() {
return; return false;
} }
let sim_id = match self.active_tab { let sim_id = match self.active_tab {
InputTab::Player1 => SimId::Player1, InputTab::Player1 => SimId::Player1,
InputTab::Player2 => SimId::Player2, InputTab::Player2 => SimId::Player2,
_ => { _ => {
return; return false;
} }
}; };
let Some(vb) = self.now_binding.take() else { let Some(vb) = self.now_binding.take() else {
return; return false;
}; };
let mut mappings = self.mappings.for_sim(sim_id).write().unwrap(); let mut mappings = self.mappings.for_sim(sim_id).write().unwrap();
mappings.add_keyboard_mapping(vb, event.physical_key); mappings.add_keyboard_mapping(vb, event.physical_key);
drop(mappings); drop(mappings);
self.mappings.save(); 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 { let InputTab::RebindGamepad(gamepad_id) = self.active_tab else {
return; return false;
}; };
if gamepad_id != event.id { if gamepad_id != event.id {
return; return false;
} }
let Some(mappings) = self.mappings.for_gamepad(gamepad_id) else { let Some(mappings) = self.mappings.for_gamepad(gamepad_id) else {
return; return false;
}; };
let Some(vb) = self.now_binding else { let Some(vb) = self.now_binding else {
return; return false;
}; };
match event.event { match event.event {
EventType::ButtonPressed(_, code) => { EventType::ButtonPressed(_, code) => {
let mut mapping = mappings.write().unwrap(); let mut mapping = mappings.write().unwrap();
mapping.add_button_mapping(vb, code); mapping.add_button_mapping(vb, code);
self.now_binding.take(); self.now_binding.take();
true
} }
EventType::AxisChanged(_, value, code) => { EventType::AxisChanged(_, value, code) => {
if value < -0.75 { if value < -0.75 {
let mut mapping = mappings.write().unwrap(); let mut mapping = mappings.write().unwrap();
mapping.add_axis_neg_mapping(vb, code); mapping.add_axis_neg_mapping(vb, code);
self.now_binding.take(); self.now_binding.take();
} true
if value > 0.75 { } else if value > 0.75 {
let mut mapping = mappings.write().unwrap(); let mut mapping = mappings.write().unwrap();
mapping.add_axis_pos_mapping(vb, code); mapping.add_axis_pos_mapping(vb, code);
self.now_binding.take(); self.now_binding.take();
true
} else {
false
} }
} }
_ => {} _ => false,
} }
} }
} }