use std::collections::HashMap;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Modifiers {
pub ctrl: bool,
pub alt: bool,
pub shift: bool,
pub super_key: bool,
}
impl Modifiers {
pub const NONE: Self = Self {
ctrl: false,
alt: false,
shift: false,
super_key: false,
};
pub const CTRL: Self = Self {
ctrl: true,
alt: false,
shift: false,
super_key: false,
};
pub const ALT: Self = Self {
ctrl: false,
alt: true,
shift: false,
super_key: false,
};
pub const SHIFT: Self = Self {
ctrl: false,
alt: false,
shift: true,
super_key: false,
};
pub const CTRL_SHIFT: Self = Self {
ctrl: true,
alt: false,
shift: true,
super_key: false,
};
pub const CTRL_ALT: Self = Self {
ctrl: true,
alt: true,
shift: false,
super_key: false,
};
}
impl Default for Modifiers {
fn default() -> Self {
Self::NONE
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum KeyCode {
Key(char),
F(u8),
Escape,
Enter,
Space,
Backspace,
Tab,
Up,
Down,
Left,
Right,
Home,
End,
PageUp,
PageDown,
Insert,
Delete,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Hotkey {
pub modifiers: Modifiers,
pub key: KeyCode,
}
impl Hotkey {
#[must_use]
pub const fn new(modifiers: Modifiers, key: KeyCode) -> Self {
Self { modifiers, key }
}
#[must_use]
pub const fn key(key: KeyCode) -> Self {
Self::new(Modifiers::NONE, key)
}
#[must_use]
pub const fn ctrl(key: KeyCode) -> Self {
Self::new(Modifiers::CTRL, key)
}
#[must_use]
pub const fn alt(key: KeyCode) -> Self {
Self::new(Modifiers::ALT, key)
}
#[must_use]
pub const fn ctrl_shift(key: KeyCode) -> Self {
Self::new(Modifiers::CTRL_SHIFT, key)
}
}
pub struct HotkeyRegistry<Message> {
hotkeys: HashMap<Hotkey, Message>,
}
impl<Message> HotkeyRegistry<Message> {
#[must_use]
pub fn new() -> Self {
Self {
hotkeys: HashMap::new(),
}
}
pub fn register(&mut self, hotkey: Hotkey, message: Message) {
self.hotkeys.insert(hotkey, message);
}
pub fn unregister(&mut self, hotkey: &Hotkey) -> Option<Message> {
self.hotkeys.remove(hotkey)
}
pub fn get(&self, hotkey: &Hotkey) -> Option<&Message> {
self.hotkeys.get(hotkey)
}
#[must_use]
pub fn contains(&self, hotkey: &Hotkey) -> bool {
self.hotkeys.contains_key(hotkey)
}
pub fn iter(&self) -> impl Iterator<Item = (&Hotkey, &Message)> {
self.hotkeys.iter()
}
}
impl<Message> Default for HotkeyRegistry<Message> {
fn default() -> Self {
Self::new()
}
}