diff --git a/assets/keymaps/default.json b/assets/keymaps/default.json index 987c6cf1054fd58c3cb40086669df8b2d3fd1e50..88b27fd2f901375c0dd3dc22c1b64c26248d92e1 100644 --- a/assets/keymaps/default.json +++ b/assets/keymaps/default.json @@ -367,7 +367,30 @@ "workspace::ActivatePane", 8 ], - "cmd-b": "workspace::ToggleLeftDock", + "cmd-b": [ + "workspace::ToggleLeftDock", + { "focus": true } + ], + "cmd-shift-b": [ + "workspace::ToggleLeftDock", + { "focus": false } + ], + "cmd-r": [ + "workspace::ToggleRightDock", + { "focus": true } + ], + "cmd-shift-r": [ + "workspace::ToggleRightDock", + { "focus": false } + ], + "cmd-j": [ + "workspace::ToggleBottomDock", + { "focus": true } + ], + "cmd-shift-j": [ + "workspace::ToggleBottomDock", + { "focus": false } + ], "cmd-shift-f": "workspace::NewSearch", "cmd-k cmd-t": "theme_selector::Toggle", "cmd-k cmd-s": "zed::OpenKeymap", diff --git a/crates/welcome/src/welcome.rs b/crates/welcome/src/welcome.rs index b7460c4c461f6a707bf77ee193145770418eeb50..cef6f53a6ecf50b376b93b460fbba82c96eb51de 100644 --- a/crates/welcome/src/welcome.rs +++ b/crates/welcome/src/welcome.rs @@ -32,7 +32,7 @@ pub fn init(cx: &mut AppContext) { pub fn show_welcome_experience(app_state: &Arc, cx: &mut AppContext) { open_new(&app_state, cx, |workspace, cx| { - workspace.toggle_dock(DockPosition::Left, cx); + workspace.toggle_dock(DockPosition::Left, false, cx); let welcome_page = cx.add_view(|cx| WelcomePage::new(workspace, cx)); workspace.add_item_to_center(Box::new(welcome_page.clone()), cx); cx.focus(&welcome_page); diff --git a/crates/workspace/src/dock.rs b/crates/workspace/src/dock.rs index 6ca78cd935b0c35aa3303ba683364fd07449c4d1..7256ee870422113b6280f4f1c0fcae7a5f852395 100644 --- a/crates/workspace/src/dock.rs +++ b/crates/workspace/src/dock.rs @@ -423,6 +423,16 @@ impl View for Dock { Empty::new().into_any() } } + + fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { + if cx.is_self_focused() { + if let Some(active_entry) = self.active_entry() { + cx.focus(active_entry.panel.as_any()); + } else { + cx.focus_parent(); + } + } + } } impl PanelButtons { diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 40d170b0ded381a43b31252fcaffcde41d38ab93..39ecce2ca5f365bc2d77dc4dcce86941902f1377 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -103,6 +103,21 @@ pub trait Modal: View { #[derive(Clone, PartialEq)] pub struct RemoveWorktreeFromProject(pub WorktreeId); +#[derive(Copy, Clone, Default, Deserialize, PartialEq)] +pub struct ToggleLeftDock { + pub focus: bool, +} + +#[derive(Copy, Clone, Default, Deserialize, PartialEq)] +pub struct ToggleBottomDock { + pub focus: bool, +} + +#[derive(Copy, Clone, Default, Deserialize, PartialEq)] +pub struct ToggleRightDock { + pub focus: bool, +} + actions!( workspace, [ @@ -118,9 +133,6 @@ actions!( ActivatePreviousPane, ActivateNextPane, FollowNextCollaborator, - ToggleLeftDock, - ToggleRightDock, - ToggleBottomDock, NewTerminal, ToggleTerminalFocus, NewSearch, @@ -133,6 +145,11 @@ actions!( actions!(zed, [OpenSettings]); +impl_actions!( + workspace, + [ToggleLeftDock, ToggleBottomDock, ToggleRightDock] +); + #[derive(Clone, PartialEq)] pub struct OpenPaths { pub paths: Vec, @@ -249,14 +266,14 @@ pub fn init(app_state: Arc, cx: &mut AppContext) { cx.add_action(|workspace: &mut Workspace, _: &ActivateNextPane, cx| { workspace.activate_next_pane(cx) }); - cx.add_action(|workspace: &mut Workspace, _: &ToggleLeftDock, cx| { - workspace.toggle_dock(DockPosition::Left, cx); + cx.add_action(|workspace: &mut Workspace, action: &ToggleLeftDock, cx| { + workspace.toggle_dock(DockPosition::Left, action.focus, cx); }); - cx.add_action(|workspace: &mut Workspace, _: &ToggleRightDock, cx| { - workspace.toggle_dock(DockPosition::Right, cx); + cx.add_action(|workspace: &mut Workspace, action: &ToggleRightDock, cx| { + workspace.toggle_dock(DockPosition::Right, action.focus, cx); }); - cx.add_action(|workspace: &mut Workspace, _: &ToggleBottomDock, cx| { - workspace.toggle_dock(DockPosition::Bottom, cx); + cx.add_action(|workspace: &mut Workspace, action: &ToggleBottomDock, cx| { + workspace.toggle_dock(DockPosition::Bottom, action.focus, cx); }); cx.add_action(Workspace::activate_pane_at_index); @@ -1455,21 +1472,29 @@ impl Workspace { } } - pub fn toggle_dock(&mut self, dock_side: DockPosition, cx: &mut ViewContext) { + pub fn toggle_dock( + &mut self, + dock_side: DockPosition, + focus: bool, + cx: &mut ViewContext, + ) { let dock = match dock_side { - DockPosition::Left => &mut self.left_dock, - DockPosition::Bottom => &mut self.bottom_dock, - DockPosition::Right => &mut self.right_dock, + DockPosition::Left => &self.left_dock, + DockPosition::Bottom => &self.bottom_dock, + DockPosition::Right => &self.right_dock, }; dock.update(cx, |dock, cx| { let open = !dock.is_open(); dock.set_open(open, cx); }); - self.serialize_workspace(cx); - - cx.focus_self(); + if dock.read(cx).is_open() && focus { + cx.focus(dock); + } else { + cx.focus_self(); + } cx.notify(); + self.serialize_workspace(cx); } pub fn toggle_panel(&mut self, action: &TogglePanel, cx: &mut ViewContext) { diff --git a/crates/zed/src/menus.rs b/crates/zed/src/menus.rs index 37e835c13de2c79f144d71d4e06089a0e658daa9..b242b0f183767106f3b323a2c8cf52ce3900d9b1 100644 --- a/crates/zed/src/menus.rs +++ b/crates/zed/src/menus.rs @@ -89,9 +89,18 @@ pub fn menus() -> Vec> { MenuItem::action("Zoom Out", super::DecreaseBufferFontSize), MenuItem::action("Reset Zoom", super::ResetBufferFontSize), MenuItem::separator(), - MenuItem::action("Toggle Left Dock", workspace::ToggleLeftDock), - MenuItem::action("Toggle Right Dock", workspace::ToggleRightDock), - MenuItem::action("Toggle Bottom Dock", workspace::ToggleBottomDock), + MenuItem::action( + "Toggle Left Dock", + workspace::ToggleLeftDock { focus: false }, + ), + MenuItem::action( + "Toggle Right Dock", + workspace::ToggleRightDock { focus: false }, + ), + MenuItem::action( + "Toggle Bottom Dock", + workspace::ToggleBottomDock { focus: false }, + ), MenuItem::submenu(Menu { name: "Editor Layout", items: vec![ diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index f9c0a1855ee099ca7c4575ec4ca63c8462aabca9..1dfe9c24e54dd15f098d2a4e5d1df2f2c2e75f1e 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -354,7 +354,7 @@ pub fn initialize_workspace( .map_or(false, |entry| entry.is_dir()) }) { - workspace.toggle_dock(project_panel_position, cx); + workspace.toggle_dock(project_panel_position, false, cx); } workspace.add_panel(terminal_panel, cx)