use crate::state::gamepad::{GamepadState, GamepadsState};
use crate::state::keyboard::KeyboardState;
use crate::state::mouse::MouseState;
use crate::types::*;
#[derive(Default)]
pub struct AdvancedInputState {
pub keyboard: KeyboardState,
pub mouse: MouseState,
pub gamepads: GamepadsState,
pub frame: u32,
pub time: f64,
}
impl AdvancedInputState {
pub fn new() -> Self {
Self {
keyboard: KeyboardState::new(),
mouse: MouseState::new(),
gamepads: GamepadsState::new(),
frame: 0,
time: 0.0,
}
}
pub fn end_frame(&mut self, delta_time_ms: f32) {
self.frame += 1;
self.time += delta_time_ms as f64;
self.keyboard.end_frame(delta_time_ms);
self.mouse.end_frame(delta_time_ms);
self.gamepads.end_frame();
}
pub fn is_key_down(&self, key: KeyCode) -> bool {
self.keyboard.is_down(key)
}
pub fn was_key_just_pressed(&self, key: KeyCode) -> bool {
self.keyboard.was_just_pressed(key)
}
pub fn was_key_just_released(&self, key: KeyCode) -> bool {
self.keyboard.was_just_released(key)
}
pub fn get_key_held_duration(&self, key: KeyCode) -> f32 {
self.keyboard.get_held_duration(key)
}
pub fn get_mouse_position(&self) -> (f32, f32) {
self.mouse.position
}
pub fn get_mouse_delta(&self) -> (f32, f32) {
self.mouse.delta
}
pub fn get_mouse_scroll(&self) -> (f32, f32) {
self.mouse.scroll
}
pub fn is_mouse_button_down(&self, button: MouseButton) -> bool {
self.mouse.is_button_down(button)
}
pub fn was_mouse_button_just_pressed(&self, button: MouseButton) -> bool {
self.mouse.was_button_just_pressed(button)
}
pub fn was_mouse_button_just_released(&self, button: MouseButton) -> bool {
self.mouse.was_button_just_released(button)
}
pub fn get_gamepad(&self, id: GamepadId) -> Option<&GamepadState> {
self.gamepads.get(id)
}
pub fn is_gamepad_connected(&self, id: GamepadId) -> bool {
self.gamepads
.get(id)
.map(|gp| gp.connected)
.unwrap_or(false)
}
}