VIP inspection tooling #4
			
				
			
		
		
		
	
							
								
								
									
										43
									
								
								src/app.rs
								
								
								
								
							
							
						
						
									
										43
									
								
								src/app.rs
								
								
								
								
							| 
						 | 
					@ -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> {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue