WIP: Change to matches to vec

Mikayla Maki created

Change summary

crates/editor/src/blink_manager.rs |  1 -
crates/gpui/src/app.rs             |  7 +++++++
crates/gpui/src/keymap.rs          | 16 +++++++---------
3 files changed, 14 insertions(+), 10 deletions(-)

Detailed changes

@@ -71,7 +71,6 @@ impl BlinkManager {
             if epoch == self.blink_epoch && self.enabled && !self.blinking_paused {
                 self.visible = !self.visible;
                 cx.notify();
-                dbg!(cx.handle());
 
                 let epoch = self.next_blink_epoch();
                 let interval = self.blink_interval;

crates/gpui/src/app.rs 🔗

@@ -1524,6 +1524,13 @@ impl MutableAppContext {
 
     pub fn dispatch_keystroke(&mut self, window_id: usize, keystroke: &Keystroke) -> bool {
         if let Some(focused_view_id) = self.focused_view_id(window_id) {
+            // For each view in self
+            // - Get it's keymap context
+            // - Try to execute keybinding
+
+            // For us, get out dispatch path
+            // - ONLY execute for that terminal path
+
             let dispatch_path = self
                 .ancestors(window_id, focused_view_id)
                 .map(|view_id| {

crates/gpui/src/keymap.rs 🔗

@@ -77,10 +77,7 @@ where
 pub enum MatchResult {
     None,
     Pending,
-    Match {
-        view_id: usize,
-        action: Box<dyn Action>,
-    },
+    Match(Vec<(usize, Box<dyn Action>)>),
 }
 
 impl Debug for MatchResult {
@@ -157,8 +154,10 @@ impl Matcher {
         dispatch_path: Vec<(usize, Context)>,
     ) -> MatchResult {
         let mut any_pending = false;
+        let mut matched_bindings = Vec::new();
 
         let first_keystroke = self.pending.is_empty();
+        dbg!(&dispatch_path);
         for (view_id, context) in dispatch_path {
             if !first_keystroke && !self.pending.contains_key(&view_id) {
                 continue;
@@ -185,10 +184,7 @@ impl Matcher {
                 {
                     if binding.keystrokes.len() == pending.keystrokes.len() {
                         self.pending.remove(&view_id);
-                        return MatchResult::Match {
-                            view_id,
-                            action: binding.action.boxed_clone(),
-                        };
+                        matched_bindings.push((view_id, binding.action.boxed_clone()));
                     } else {
                         retain_pending = true;
                         pending.context = Some(context.clone());
@@ -203,7 +199,9 @@ impl Matcher {
             }
         }
 
-        if any_pending {
+        if !matched_bindings.is_empty() {
+            MatchResult::Match(matched_bindings)
+        } else if any_pending {
             MatchResult::Pending
         } else {
             MatchResult::None