Do not dismiss buffer search when any modal is present (#3988)

Kirill Bulatov created

Release Notes:

- Fixed buffer search being dismissed not after the modals are

Change summary

crates/search/src/buffer_search.rs  | 13 +++++++++----
crates/workspace/src/modal_layer.rs |  4 ++++
crates/workspace/src/workspace.rs   |  4 ++++
3 files changed, 17 insertions(+), 4 deletions(-)

Detailed changes

crates/search/src/buffer_search.rs 🔗

@@ -43,7 +43,7 @@ pub enum Event {
 }
 
 pub fn init(cx: &mut AppContext) {
-    cx.observe_new_views(|editor: &mut Workspace, _| BufferSearchBar::register(editor))
+    cx.observe_new_views(|workspace: &mut Workspace, _| BufferSearchBar::register(workspace))
         .detach();
 }
 
@@ -479,6 +479,11 @@ impl SearchActionsRegistrar for Workspace {
         callback: fn(&mut BufferSearchBar, &A, &mut ViewContext<BufferSearchBar>),
     ) {
         self.register_action(move |workspace, action: &A, cx| {
+            if workspace.has_active_modal(cx) {
+                cx.propagate();
+                return;
+            }
+
             let pane = workspace.active_pane();
             pane.update(cx, move |this, cx| {
                 this.toolbar().update(cx, move |this, cx| {
@@ -539,11 +544,11 @@ impl BufferSearchBar {
             this.select_all_matches(action, cx);
         });
         registrar.register_handler(|this, _: &editor::Cancel, cx| {
-            if !this.dismissed {
+            if this.dismissed {
+                cx.propagate();
+            } else {
                 this.dismiss(&Dismiss, cx);
-                return;
             }
-            cx.propagate();
         });
         registrar.register_handler(|this, deploy, cx| {
             this.deploy(deploy, cx);

crates/workspace/src/modal_layer.rs 🔗

@@ -101,6 +101,10 @@ impl ModalLayer {
         let active_modal = self.active_modal.as_ref()?;
         active_modal.modal.view().downcast::<V>().ok()
     }
+
+    pub fn has_active_modal(&self) -> bool {
+        self.active_modal.is_some()
+    }
 }
 
 impl Render for ModalLayer {

crates/workspace/src/workspace.rs 🔗

@@ -3383,6 +3383,10 @@ impl Workspace {
         div
     }
 
+    pub fn has_active_modal(&self, cx: &WindowContext<'_>) -> bool {
+        self.modal_layer.read(cx).has_active_modal()
+    }
+
     pub fn active_modal<V: ManagedView + 'static>(
         &mut self,
         cx: &ViewContext<Self>,