bevy_input_sequence/
chord.rs1use bevy::{
2 input::keyboard::KeyCode,
3 prelude::{Deref, DerefMut, Resource},
4 reflect::Enum,
5};
6
7use std::{collections::VecDeque, fmt};
8
9use keyseq::Modifiers;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
13pub struct KeyChord(pub Modifiers, pub KeyCode);
14
15impl fmt::Display for KeyChord {
16 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17 use KeyCode::*;
18 self.0.fmt(f)?;
19 if !self.0.is_empty() {
20 f.write_str("-")?;
21 }
22 let key_repr = match self.1 {
23 Semicolon => ";",
24 Period => ".",
25 Equal => "=",
26 Slash => "/",
27 Minus => "-",
28 BracketLeft => "[",
29 BracketRight => "]",
30 Quote => "'",
31 Backquote => "`",
32 key_code => {
33 let mut key = key_code.variant_name();
34 key = key.strip_prefix("Key").unwrap_or(key);
35 key = key.strip_prefix("Digit").unwrap_or(key);
36 return f.write_str(key);
37 }
38 };
39 f.write_str(key_repr)
40 }
41}
42
43impl From<(Modifiers, KeyCode)> for KeyChord {
44 #[inline(always)]
45 fn from((mods, key): (Modifiers, KeyCode)) -> Self {
46 KeyChord(mods, key)
47 }
48}
49
50impl From<KeyCode> for KeyChord {
51 #[inline(always)]
52 fn from(key: KeyCode) -> Self {
53 KeyChord(Modifiers::empty(), key)
54 }
55}
56
57pub(crate) fn is_modifier(key: KeyCode) -> bool {
58 matches!(
59 key,
60 KeyCode::ControlLeft
61 | KeyCode::ControlRight
62 | KeyCode::ShiftLeft
63 | KeyCode::ShiftRight
64 | KeyCode::AltLeft
65 | KeyCode::AltRight
66 | KeyCode::SuperLeft
67 | KeyCode::SuperRight
68 )
69}
70
71#[derive(Resource, Debug, Deref, DerefMut, Default)]
76pub struct KeyChordQueue(pub VecDeque<KeyChord>);