Switch from changing the meaning of the predicate to adding an additional match_dispatch_path_context API for UI elements

This commit is contained in:
Mikayla Maki 2023-03-09 19:32:09 -08:00
parent 0384456e7d
commit 9dc608dc4b
3 changed files with 12 additions and 9 deletions

View file

@ -1248,7 +1248,7 @@ impl MutableAppContext {
self.keystroke_matcher
.bindings_for_action_type(action.as_any().type_id())
.find_map(|b| {
if b.match_context(&contexts) {
if b.match_dispatch_path_context(&contexts) {
Some(b.keystrokes().into())
} else {
None
@ -1283,7 +1283,7 @@ impl MutableAppContext {
deserialize("{}").ok()?,
self.keystroke_matcher
.bindings_for_action_type(*type_id)
.filter(|b| b.match_context(&contexts))
.filter(|b| b.match_dispatch_path_context(&contexts))
.collect(),
))
} else {

View file

@ -42,6 +42,15 @@ impl Binding {
.unwrap_or(true)
}
pub fn match_dispatch_path_context(&self, contexts: &[KeymapContext]) -> bool {
for i in 0..contexts.len() {
if self.match_context(&contexts[i..]) {
return true;
}
}
false
}
pub fn match_keys_and_context(
&self,
pending_keystrokes: &Vec<Keystroke>,

View file

@ -64,13 +64,7 @@ impl KeymapContextPredicate {
pub fn eval(&self, contexts: &[KeymapContext]) -> bool {
let Some(context) = contexts.first() else { return false };
match self {
Self::Identifier(name) => {
if (&context.set).contains(name.as_str()) {
true
} else {
self.eval(&contexts[1..])
}
}
Self::Identifier(name) => (&context.set).contains(name.as_str()),
Self::Equal(left, right) => context
.map
.get(left.as_str())