2023-11-12 20:52:24 +01:00
|
|
|
use speedy2d::window::VirtualKeyCode;
|
2023-08-13 23:58:53 +02:00
|
|
|
|
2023-11-12 20:52:24 +01:00
|
|
|
/// requires `keyboard_events_watch = true`
|
|
|
|
pub struct Hotkey {
|
|
|
|
/// 4 * (ignore, pressed): 10 (or 11, but 0b11111111 -> never) -> doesn't matter, 01 -> must be pressed, 00 -> must not be pressed
|
2023-08-13 23:58:53 +02:00
|
|
|
/// logo alt shift ctrl
|
|
|
|
pub modifiers: u8,
|
|
|
|
pub key: VirtualKeyCode,
|
|
|
|
}
|
2023-11-12 20:52:24 +01:00
|
|
|
#[allow(unused)]
|
|
|
|
impl Hotkey {
|
|
|
|
pub fn triggered(
|
|
|
|
&self,
|
2023-08-13 23:58:53 +02:00
|
|
|
modifiers: speedy2d::window::ModifiersState,
|
|
|
|
down: bool,
|
|
|
|
key: Option<speedy2d::window::VirtualKeyCode>,
|
2023-11-12 20:52:24 +01:00
|
|
|
) -> bool {
|
|
|
|
if self.modifiers == u8::MAX {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
down == false
|
2023-08-13 23:58:53 +02:00
|
|
|
&& key.is_some_and(|v| v == self.key)
|
|
|
|
&& (self.modifiers & 0b10 == 1 || (self.modifiers & 0b01 == 1) == modifiers.ctrl())
|
2023-11-12 20:52:24 +01:00
|
|
|
&& (self.modifiers & 0b1000 == 1 || (self.modifiers & 0b0100 == 1) == modifiers.shift())
|
2023-08-13 23:58:53 +02:00
|
|
|
&& (self.modifiers & 0b100000 == 1
|
|
|
|
|| (self.modifiers & 0b010000 == 1) == modifiers.alt())
|
|
|
|
&& (self.modifiers & 0b10000000 == 1
|
2023-11-12 20:52:24 +01:00
|
|
|
|| (self.modifiers & 0b01000000 == 1) == modifiers.logo())
|
2023-08-13 23:58:53 +02:00
|
|
|
}
|
2023-11-12 20:52:24 +01:00
|
|
|
/// unlike noshift, this ignores the shift modifier
|
|
|
|
pub fn new_key(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0b1000, key)
|
|
|
|
}
|
|
|
|
/// requires the key to be pressed without any modifiers
|
|
|
|
pub fn new_noshift(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0, key)
|
|
|
|
}
|
|
|
|
pub fn new_shift(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0b0100, key)
|
|
|
|
}
|
|
|
|
pub fn new_ctrl(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0b01, key)
|
|
|
|
}
|
|
|
|
pub fn new_ctrl_shift(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0b0101, key)
|
|
|
|
}
|
|
|
|
pub fn new_alt(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0b010000, key)
|
|
|
|
}
|
|
|
|
pub fn new_alt_shift(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0b010100, key)
|
2023-08-13 23:58:53 +02:00
|
|
|
}
|
2023-11-12 20:52:24 +01:00
|
|
|
pub fn new_ctrl_alt(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0b010001, key)
|
2023-08-13 23:58:53 +02:00
|
|
|
}
|
2023-11-12 20:52:24 +01:00
|
|
|
pub fn new_ctrl_alt_shift(key: VirtualKeyCode) -> Self {
|
|
|
|
Self::new(0b010101, key)
|
2023-08-13 23:58:53 +02:00
|
|
|
}
|
2023-11-12 20:52:24 +01:00
|
|
|
pub fn new(modifiers: u8, key: VirtualKeyCode) -> Self {
|
|
|
|
Hotkey { modifiers, key }
|
2023-08-13 23:58:53 +02:00
|
|
|
}
|
|
|
|
}
|