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,
}
#[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(),
}
}
}