Skip to content

Commit 5b39776

Browse files
authored
Order mapping entries precedence based on number of modifiers (#262)
* Order mapping entries precedence based on number of modifiers * Fix format * Rename variables * More renaming
1 parent 7261527 commit 5b39776

File tree

2 files changed

+33
-11
lines changed

2 files changed

+33
-11
lines changed

core/editor/src/input/input_mapper.rs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ impl Default for KeyMappingEntries {
6161

6262
#[derive(Debug, Clone)]
6363
struct Mapping {
64-
up: [KeyMappingEntries; NUMBER_OF_KEYS],
65-
down: [KeyMappingEntries; NUMBER_OF_KEYS],
64+
key_up: [KeyMappingEntries; NUMBER_OF_KEYS],
65+
key_down: [KeyMappingEntries; NUMBER_OF_KEYS],
6666
pointer_move: KeyMappingEntries,
6767
mouse_scroll: KeyMappingEntries,
6868
}
@@ -91,26 +91,26 @@ macro_rules! entry {
9191
macro_rules! mapping {
9292
//[$(<action=$action:expr; message=$key:expr; $(modifiers=[$($m:ident),* $(,)?];)?>)*] => {{
9393
[$($entry:expr),* $(,)?] => {{
94-
let mut up = KeyMappingEntries::key_array();
95-
let mut down = KeyMappingEntries::key_array();
94+
let mut key_up = KeyMappingEntries::key_array();
95+
let mut key_down = KeyMappingEntries::key_array();
9696
let mut pointer_move: KeyMappingEntries = Default::default();
9797
let mut mouse_scroll: KeyMappingEntries = Default::default();
9898
$(
9999
let arr = match $entry.trigger {
100-
InputMapperMessage::KeyDown(key) => &mut down[key as usize],
101-
InputMapperMessage::KeyUp(key) => &mut up[key as usize],
100+
InputMapperMessage::KeyDown(key) => &mut key_down[key as usize],
101+
InputMapperMessage::KeyUp(key) => &mut key_up[key as usize],
102102
InputMapperMessage::PointerMove => &mut pointer_move,
103103
InputMapperMessage::MouseScroll => &mut mouse_scroll,
104104
};
105105
arr.push($entry);
106106
)*
107-
(up, down, pointer_move, mouse_scroll)
107+
(key_up, key_down, pointer_move, mouse_scroll)
108108
}};
109109
}
110110

111111
impl Default for Mapping {
112112
fn default() -> Self {
113-
let (up, down, pointer_move, mouse_scroll) = mapping![
113+
let mappings = mapping![
114114
entry! {action=DocumentMessage::PasteLayers, key_down=KeyV, modifiers=[KeyControl]},
115115
entry! {action=DocumentMessage::EnableSnapping, key_down=KeyShift},
116116
entry! {action=DocumentMessage::DisableSnapping, key_up=KeyShift},
@@ -238,16 +238,31 @@ impl Default for Mapping {
238238
entry! {action=GlobalMessage::LogDebug, key_down=Key2},
239239
entry! {action=GlobalMessage::LogTrace, key_down=Key3},
240240
];
241-
Self { up, down, pointer_move, mouse_scroll }
241+
242+
let (mut key_up, mut key_down, mut pointer_move, mut mouse_scroll) = mappings;
243+
let sort = |list: &mut KeyMappingEntries| list.0.sort_by(|u, v| v.modifiers.ones().cmp(&u.modifiers.ones()));
244+
for list in [&mut key_up, &mut key_down] {
245+
for sublist in list {
246+
sort(sublist);
247+
}
248+
}
249+
sort(&mut pointer_move);
250+
sort(&mut mouse_scroll);
251+
Self {
252+
key_up,
253+
key_down,
254+
pointer_move,
255+
mouse_scroll,
256+
}
242257
}
243258
}
244259

245260
impl Mapping {
246261
fn match_message(&self, message: InputMapperMessage, keys: &KeyStates, actions: ActionList) -> Option<Message> {
247262
use InputMapperMessage::*;
248263
let list = match message {
249-
KeyDown(key) => &self.down[key as usize],
250-
KeyUp(key) => &self.up[key as usize],
264+
KeyDown(key) => &self.key_down[key as usize],
265+
KeyUp(key) => &self.key_up[key as usize],
251266
PointerMove => &self.pointer_move,
252267
MouseScroll => &self.mouse_scroll,
253268
};

core/editor/src/input/keyboard.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ impl<const LENGTH: usize> BitVector<LENGTH> {
116116
}
117117
result == 0
118118
}
119+
pub fn ones(&self) -> u32 {
120+
let mut result = 0;
121+
for storage in self.0.iter() {
122+
result += storage.count_ones();
123+
}
124+
result
125+
}
119126
}
120127

121128
impl<const LENGTH: usize> Default for BitVector<LENGTH> {

0 commit comments

Comments
 (0)