Bind CloseWindow and Open actions on workspace

Co-Authored-By: Max <max@zed.dev>
This commit is contained in:
Nathan Sobo 2023-12-01 16:17:48 -07:00
parent 6f7995c150
commit 0edd89a92f
2 changed files with 85 additions and 88 deletions

View file

@ -210,6 +210,9 @@ pub fn init(app_state: Arc<AppState>, cx: &mut AppContext) {
init_settings(cx); init_settings(cx);
notifications::init(cx); notifications::init(cx);
cx.on_action(Workspace::close_global);
cx.on_action(restart);
cx.on_action({ cx.on_action({
let app_state = Arc::downgrade(&app_state); let app_state = Arc::downgrade(&app_state);
move |_: &Open, cx: &mut AppContext| { move |_: &Open, cx: &mut AppContext| {
@ -1178,7 +1181,6 @@ impl Workspace {
} }
} }
// todo!(Non-window-actions)
pub fn close_global(_: &CloseWindow, cx: &mut AppContext) { pub fn close_global(_: &CloseWindow, cx: &mut AppContext) {
cx.windows().iter().find(|window| { cx.windows().iter().find(|window| {
window window
@ -1196,21 +1198,18 @@ impl Workspace {
}); });
} }
pub fn close( pub fn close_window(&mut self, _: &CloseWindow, cx: &mut ViewContext<Self>) {
&mut self,
_: &CloseWindow,
cx: &mut ViewContext<Self>,
) -> Option<Task<Result<()>>> {
let window = cx.window_handle(); let window = cx.window_handle();
let prepare = self.prepare_to_close(false, cx); let prepare = self.prepare_to_close(false, cx);
Some(cx.spawn(|_, mut cx| async move { cx.spawn(|_, mut cx| async move {
if prepare.await? { if prepare.await? {
window.update(&mut cx, |_, cx| { window.update(&mut cx, |_, cx| {
cx.remove_window(); cx.remove_window();
})?; })?;
} }
Ok(()) anyhow::Ok(())
})) })
.detach_and_log_err(cx)
} }
pub fn prepare_to_close( pub fn prepare_to_close(
@ -2431,7 +2430,7 @@ impl Workspace {
// &mut self, // &mut self,
// _: &FollowNextCollaborator, // _: &FollowNextCollaborator,
// cx: &mut ViewContext<Self>, // cx: &mut ViewContext<Self>,
// ) -> Option<Task<Result<()>>> { // ) {
// let collaborators = self.project.read(cx).collaborators(); // let collaborators = self.project.read(cx).collaborators();
// let next_leader_id = if let Some(leader_id) = self.leader_for_pane(&self.active_pane) { // let next_leader_id = if let Some(leader_id) = self.leader_for_pane(&self.active_pane) {
// let mut collaborators = collaborators.keys().copied(); // let mut collaborators = collaborators.keys().copied();
@ -2456,12 +2455,14 @@ impl Workspace {
// let pane = self.active_pane.clone(); // let pane = self.active_pane.clone();
// let Some(leader_id) = next_leader_id.or_else(|| collaborators.keys().copied().next()) // let Some(leader_id) = next_leader_id.or_else(|| collaborators.keys().copied().next())
// else { // else {
// return None; // return;
// }; // };
// if Some(leader_id) == self.unfollow(&pane, cx) { // if Some(leader_id) == self.unfollow(&pane, cx) {
// return None; // return;
// }
// if let Some(task) = self.follow(leader_id, cx) {
// task.detach();
// } // }
// self.follow(leader_id, cx)
// } // }
// pub fn follow( // pub fn follow(
@ -3287,13 +3288,8 @@ impl Workspace {
fn actions(&self, div: Div, cx: &mut ViewContext<Self>) -> Div { fn actions(&self, div: Div, cx: &mut ViewContext<Self>) -> Div {
self.add_workspace_actions_listeners(div, cx) self.add_workspace_actions_listeners(div, cx)
// cx.add_async_action(Workspace::open);
// cx.add_async_action(Workspace::follow_next_collaborator);
// cx.add_async_action(Workspace::close);
.on_action(cx.listener(Self::close_inactive_items_and_panes)) .on_action(cx.listener(Self::close_inactive_items_and_panes))
.on_action(cx.listener(Self::close_all_items_and_panes)) .on_action(cx.listener(Self::close_all_items_and_panes))
// cx.add_global_action(Workspace::close_global);
// cx.add_global_action(restart);
.on_action(cx.listener(Self::save_all)) .on_action(cx.listener(Self::save_all))
.on_action(cx.listener(Self::add_folder_to_project)) .on_action(cx.listener(Self::add_folder_to_project))
.on_action(cx.listener(|workspace, _: &Unfollow, cx| { .on_action(cx.listener(|workspace, _: &Unfollow, cx| {
@ -3342,6 +3338,9 @@ impl Workspace {
workspace.close_all_docks(cx); workspace.close_all_docks(cx);
}), }),
) )
.on_action(cx.listener(Workspace::open))
.on_action(cx.listener(Workspace::close_window))
// cx.add_action(Workspace::activate_pane_at_index); // cx.add_action(Workspace::activate_pane_at_index);
// cx.add_action(|workspace: &mut Workspace, _: &ReopenClosedItem, cx| { // cx.add_action(|workspace: &mut Workspace, _: &ReopenClosedItem, cx| {
// workspace.reopen_closed_item(cx).detach(); // workspace.reopen_closed_item(cx).detach();

View file

@ -168,9 +168,7 @@ pub fn initialize_workspace(app_state: Arc<AppState>, cx: &mut AppContext) {
cx.on_window_should_close(move |cx| { cx.on_window_should_close(move |cx| {
handle handle
.update(cx, |workspace, cx| { .update(cx, |workspace, cx| {
if let Some(task) = workspace.close(&Default::default(), cx) { workspace.close_window(&Default::default(), cx);
task.detach_and_log_err(cx);
}
false false
}) })
.unwrap_or(true) .unwrap_or(true)