use px_backend::winit;
#[derive(Debug, Clone, Copy)]
pub struct Input {
pub pressed: bool,
pub held: bool,
pub released: bool,
}
impl Input {
#[must_use]
pub const fn new(pressed: bool, held: bool, released: bool) -> Self {
Input {
pressed,
held,
released,
}
}
#[must_use]
pub const fn default() -> Self {
Input {
pressed: false,
held: false,
released: false,
}
}
#[must_use]
pub fn any(self) -> bool {
self.pressed || self.held || self.released
}
}
#[derive(Debug, Clone, Copy)]
pub(crate) struct Mouse {
pub(crate) buttons: [Input; 3],
pub(crate) pos: (u32, u32),
pub(crate) wheel: MouseWheel,
}
impl Mouse {
pub const fn new() -> Self {
Mouse {
buttons: [Input::default(), Input::default(), Input::default()],
pos: (0, 0),
wheel: MouseWheel::None,
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum MouseBtn {
Left,
Right,
Middle,
}
#[derive(Debug, Clone, Copy)]
pub enum MouseWheel {
None,
Up,
Down,
Right,
Left,
}
pub use winit::event::VirtualKeyCode as Keycodes;
#[derive(Eq, PartialEq, Debug, Hash, Clone, Copy)]
pub struct Key {
pub key: Keycodes,
}
impl Key {
#[must_use]
pub fn get_str_option(self) -> Option<String> {
let s = self.get_str();
if s.is_empty() {
None
} else {
Some(self.get_str())
}
}
#[must_use]
pub fn get_str(self) -> String {
use Keycodes::{
Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Numpad0, Numpad1, Numpad2,
Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, Space, A, B, C, D, E, F,
G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
};
(match self.key {
A => "a",
B => "b",
C => "c",
D => "d",
E => "e",
F => "f",
G => "g",
H => "h",
I => "i",
J => "j",
K => "k",
L => "l",
M => "m",
N => "n",
O => "o",
P => "p",
Q => "q",
R => "r",
S => "s",
T => "t",
U => "u",
V => "v",
W => "w",
X => "x",
Y => "y",
Z => "z",
Key1 | Numpad1 => "1",
Key2 | Numpad2 => "2",
Key3 | Numpad3 => "3",
Key4 | Numpad4 => "4",
Key5 | Numpad5 => "5",
Key6 | Numpad6 => "6",
Key7 | Numpad7 => "7",
Key8 | Numpad8 => "8",
Key9 | Numpad9 => "9",
Key0 | Numpad0 => "0",
Space => " ",
_ => "",
})
.to_owned()
}
}
impl From<winit::event::KeyboardInput> for Key {
fn from(key: winit::event::KeyboardInput) -> Self {
Self {
key: key.virtual_keycode.unwrap(),
}
}
}
pub(crate) trait KeySet {
fn has(&self, key: Keycodes) -> bool;
}
impl KeySet for std::collections::HashSet<Key> {
fn has(&self, key: Keycodes) -> bool {
for k in self {
if k.key == key {
return true;
}
}
false
}
}