Honor `cmd-w` to close active item

Antonio Scandurra and Julia created

Co-Authored-By: Julia <julia@zed.dev>

Change summary

crates/gpui2/src/action.rs    |  6 +++++-
crates/workspace2/src/pane.rs | 35 ++++++++++++++++++++---------------
2 files changed, 25 insertions(+), 16 deletions(-)

Detailed changes

crates/gpui2/src/action.rs 🔗

@@ -68,8 +68,12 @@ where
     A: for<'a> Deserialize<'a> + PartialEq + Clone + Default + std::fmt::Debug + 'static,
 {
     fn qualified_name() -> SharedString {
+        let name = type_name::<A>();
+        let mut separator_matches = name.rmatch_indices("::");
+        separator_matches.next().unwrap();
+        let name_start_ix = separator_matches.next().map_or(0, |(ix, _)| ix + 2);
         // todo!() remove the 2 replacement when migration is done
-        type_name::<A>().replace("2::", "::").into()
+        name[name_start_ix..].replace("2::", "::").into()
     }
 
     fn build(params: Option<serde_json::Value>) -> Result<Box<dyn Action>>

crates/workspace2/src/pane.rs 🔗

@@ -733,21 +733,21 @@ impl Pane {
     //         self.activate_item(index, activate_pane, activate_pane, cx);
     //     }
 
-    //     pub fn close_active_item(
-    //         &mut self,
-    //         action: &CloseActiveItem,
-    //         cx: &mut ViewContext<Self>,
-    //     ) -> Option<Task<Result<()>>> {
-    //         if self.items.is_empty() {
-    //             return None;
-    //         }
-    //         let active_item_id = self.items[self.active_item_index].id();
-    //         Some(self.close_item_by_id(
-    //             active_item_id,
-    //             action.save_intent.unwrap_or(SaveIntent::Close),
-    //             cx,
-    //         ))
-    //     }
+    pub fn close_active_item(
+        &mut self,
+        action: &CloseActiveItem,
+        cx: &mut ViewContext<Self>,
+    ) -> Option<Task<Result<()>>> {
+        if self.items.is_empty() {
+            return None;
+        }
+        let active_item_id = self.items[self.active_item_index].id();
+        Some(self.close_item_by_id(
+            active_item_id,
+            action.save_intent.unwrap_or(SaveIntent::Close),
+            cx,
+        ))
+    }
 
     pub fn close_item_by_id(
         &mut self,
@@ -1919,7 +1919,12 @@ impl Render for Pane {
 
     fn render(&mut self, cx: &mut ViewContext<Self>) -> Self::Element {
         v_stack()
+            .context("Pane")
             .size_full()
+            .on_action(|pane: &mut Self, action, cx| {
+                pane.close_active_item(action, cx)
+                    .map(|task| task.detach_and_log_err(cx));
+            })
             .child(self.render_tab_bar(cx))
             .child(div() /* todo!(toolbar) */)
             .child(if let Some(item) = self.active_item() {