use super::action::Action;
use super::mode::InputMode;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Modifiers {
pub alt: bool,
pub shift: bool,
pub ctrl: bool,
}
impl Modifiers {
pub const NONE: Self = Self {
alt: false,
shift: false,
ctrl: false,
};
pub const ALT: Self = Self {
alt: true,
shift: false,
ctrl: false,
};
pub const SHIFT: Self = Self {
alt: false,
shift: true,
ctrl: false,
};
pub const CTRL: Self = Self {
alt: false,
shift: false,
ctrl: true,
};
pub const CTRL_SHIFT: Self = Self {
alt: false,
shift: true,
ctrl: true,
};
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum KeyCode {
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,
Tab,
Enter,
Escape,
Backtick,
Backspace,
Comma,
Period,
LeftBracket,
RightBracket,
Slash,
LeftShift,
RightShift,
Num0,
Num1,
Num2,
Num3,
Num4,
Num5,
Num6,
Num7,
Num8,
Num9,
Space,
Up,
Down,
Left,
Right,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
F13,
F14,
F15,
F16,
F17,
F18,
F19,
F20,
F21,
F22,
F23,
F24,
Semicolon,
Apostrophe,
Backslash,
Minus,
Equals,
LeftCtrl,
RightCtrl,
LeftAlt,
RightAlt,
LeftSuper,
RightSuper,
CapsLock,
Delete,
Insert,
Home,
End,
PageUp,
PageDown,
Numpad0,
Numpad1,
Numpad2,
Numpad3,
Numpad4,
Numpad5,
Numpad6,
Numpad7,
Numpad8,
Numpad9,
NumpadAdd,
NumpadSubtract,
NumpadMultiply,
NumpadDivide,
NumpadDecimal,
NumpadEnter,
NumLock,
PrintScreen,
Pause,
ScrollLock,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MouseButton {
Left,
Right,
Middle,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TriggerKind {
Key(KeyCode),
MouseButton(MouseButton),
Scroll,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ActivationMode {
OnPress,
WhileHeld,
OnDrag,
OnScroll,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Trigger {
pub kind: TriggerKind,
pub modifiers: Modifiers,
pub activation: ActivationMode,
pub ignore_modifiers: bool,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Binding {
pub action: Action,
pub trigger: Trigger,
pub active_modes: Vec<InputMode>,
}
impl Binding {
pub fn global(action: Action, trigger: Trigger) -> Self {
Self {
action,
trigger,
active_modes: Vec::new(),
}
}
pub fn in_modes(action: Action, trigger: Trigger, modes: &[InputMode]) -> Self {
Self {
action,
trigger,
active_modes: modes.to_vec(),
}
}
}