use std::slice::Iter;
use bevy::prelude::{GamepadButtonType, KeyCode, MouseButton, Reflect, ScanCode};
use serde::{Deserialize, Serialize};
use crate::bindings::input_analog::AnalogInput;
pub type Chord = Vec<BinaryInput>;
#[derive(Debug, Serialize, Deserialize, Reflect, Clone, PartialEq)]
pub enum BinaryInput {
Key(KeyCode),
ScanCode(ScanCode),
KeyGroup(KeyGroup),
MouseButton(MouseButton),
Gamepad(GamepadButtonType),
Axis(AnalogInput, Threshold),
}
#[derive(Debug, Serialize, Deserialize, Reflect, Clone, PartialEq)]
pub struct Threshold(pub f32);
impl Threshold {
pub fn new(value: f32) -> Self {
Self(value)
}
pub fn preset_down() -> Self {
Self::preset_neg()
}
pub fn preset_left() -> Self {
Self::preset_neg()
}
pub fn preset_neg() -> Self {
Self(-0.75)
}
pub fn preset_up() -> Self {
Self::preset_pos()
}
pub fn preset_right() -> Self {
Self::preset_pos()
}
pub fn preset_pos() -> Self {
Self(0.75)
}
pub fn is_reached(&self, value: f32) -> bool {
if self.0.is_sign_negative() {
value <= self.0
} else {
self.0 <= value
}
}
}
#[derive(Debug, Serialize, Deserialize, Reflect, Clone, PartialEq, Eq, Hash)]
pub enum KeyGroup {
Enter,
Control,
Shift,
Alt,
Super,
Number0,
Number1,
Number2,
Number3,
Number4,
Number5,
Number6,
Number7,
Number8,
Number9,
}
impl KeyGroup {
pub fn iter(&self) -> Iter<'_, KeyCode> {
match self {
KeyGroup::Enter => [KeyCode::Return, KeyCode::NumpadEnter].iter(),
KeyGroup::Control => [KeyCode::ControlLeft, KeyCode::ControlRight].iter(),
KeyGroup::Shift => [KeyCode::ShiftLeft, KeyCode::ShiftRight].iter(),
KeyGroup::Alt => [KeyCode::AltLeft, KeyCode::AltRight].iter(),
KeyGroup::Super => [KeyCode::SuperLeft, KeyCode::SuperRight].iter(),
KeyGroup::Number0 => [KeyCode::Key0, KeyCode::Numpad0].iter(),
KeyGroup::Number1 => [KeyCode::Key1, KeyCode::Numpad1].iter(),
KeyGroup::Number2 => [KeyCode::Key2, KeyCode::Numpad2].iter(),
KeyGroup::Number3 => [KeyCode::Key3, KeyCode::Numpad3].iter(),
KeyGroup::Number4 => [KeyCode::Key4, KeyCode::Numpad4].iter(),
KeyGroup::Number5 => [KeyCode::Key5, KeyCode::Numpad5].iter(),
KeyGroup::Number6 => [KeyCode::Key6, KeyCode::Numpad6].iter(),
KeyGroup::Number7 => [KeyCode::Key7, KeyCode::Numpad7].iter(),
KeyGroup::Number8 => [KeyCode::Key8, KeyCode::Numpad8].iter(),
KeyGroup::Number9 => [KeyCode::Key9, KeyCode::Numpad9].iter(),
}
}
}
impl From<KeyCode> for BinaryInput {
fn from(input: KeyCode) -> Self {
BinaryInput::Key(input)
}
}
impl From<ScanCode> for BinaryInput {
fn from(input: ScanCode) -> Self {
BinaryInput::ScanCode(input)
}
}
impl From<KeyGroup> for BinaryInput {
fn from(input: KeyGroup) -> Self {
BinaryInput::KeyGroup(input)
}
}
impl From<MouseButton> for BinaryInput {
fn from(input: MouseButton) -> Self {
BinaryInput::MouseButton(input)
}
}
impl From<GamepadButtonType> for BinaryInput {
fn from(input: GamepadButtonType) -> Self {
BinaryInput::Gamepad(input)
}
}