Bind `cmd-e` to deploy `FindBar` without focusing it

Antonio Scandurra created

Change summary

crates/find/src/find.rs | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)

Detailed changes

crates/find/src/find.rs 🔗

@@ -19,7 +19,7 @@ use std::{
 };
 use workspace::{ItemViewHandle, Settings, Toolbar, Workspace};
 
-action!(Deploy);
+action!(Deploy, bool);
 action!(Cancel);
 action!(ToggleMode, SearchMode);
 action!(GoToMatch, Direction);
@@ -39,7 +39,8 @@ pub enum SearchMode {
 
 pub fn init(cx: &mut MutableAppContext) {
     cx.add_bindings([
-        Binding::new("cmd-f", Deploy, Some("Editor && mode == full")),
+        Binding::new("cmd-f", Deploy(true), Some("Editor && mode == full")),
+        Binding::new("cmd-e", Deploy(false), Some("Editor && mode == full")),
         Binding::new("escape", Cancel, Some("FindBar")),
         Binding::new("enter", GoToMatch(Direction::Next), Some("FindBar")),
         Binding::new("shift-enter", GoToMatch(Direction::Prev), Some("FindBar")),
@@ -74,6 +75,9 @@ impl View for FindBar {
     }
 
     fn on_focus(&mut self, cx: &mut ViewContext<Self>) {
+        self.query_editor.update(cx, |query_editor, cx| {
+            query_editor.select_all(&editor::SelectAll, cx);
+        });
         cx.focus(&self.query_editor);
     }
 
@@ -195,7 +199,6 @@ impl FindBar {
                 let len = query_buffer.read(cx).len();
                 query_buffer.edit([0..len], query, cx);
             });
-            query_editor.select_ranges([0..query.len()], None, cx);
         });
     }
 
@@ -249,7 +252,7 @@ impl FindBar {
         .boxed()
     }
 
-    fn deploy(workspace: &mut Workspace, _: &Deploy, cx: &mut ViewContext<Workspace>) {
+    fn deploy(workspace: &mut Workspace, Deploy(focus): &Deploy, cx: &mut ViewContext<Workspace>) {
         let settings = workspace.settings();
         workspace.active_pane().update(cx, |pane, cx| {
             pane.show_toolbar(cx, |cx| FindBar::new(settings, cx));
@@ -257,8 +260,6 @@ impl FindBar {
                 .active_toolbar()
                 .and_then(|toolbar| toolbar.downcast::<Self>())
             {
-                cx.focus(&find_bar);
-
                 if let Some(editor) = pane
                     .active_item()
                     .and_then(|editor| editor.act_as::<Editor>(cx))
@@ -270,7 +271,7 @@ impl FindBar {
                         .read(cx)
                         .newest_selection::<usize>(&display_map.buffer_snapshot);
 
-                    let text: String;
+                    let mut text: String;
                     if selection.start == selection.end {
                         let point = selection.start.to_display_point(&display_map);
                         let range = editor::movement::surrounding_word(&display_map, point);
@@ -278,7 +279,7 @@ impl FindBar {
                             ..range.end.to_offset(&display_map, Bias::Right);
                         text = display_map.buffer_snapshot.text_for_range(range).collect();
                         if text.trim().is_empty() {
-                            return;
+                            text = String::new();
                         }
                     } else {
                         text = display_map
@@ -287,7 +288,13 @@ impl FindBar {
                             .collect();
                     }
 
-                    find_bar.update(cx, |find_bar, cx| find_bar.set_query(&text, cx));
+                    if !text.is_empty() {
+                        find_bar.update(cx, |find_bar, cx| find_bar.set_query(&text, cx));
+                    }
+                }
+
+                if *focus {
+                    cx.focus(&find_bar);
                 }
             }
         });