mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-12 05:15:00 +00:00
Add key bindings to toggle the project panel
- Use `cmd-1` to open the project panel and toggle focus between it and the workspace center. - Use `cmd-shift-1` to open or close the project panel.
This commit is contained in:
parent
8dcd38c25a
commit
2b3e5945c6
3 changed files with 54 additions and 4 deletions
|
@ -2900,6 +2900,11 @@ impl AnyViewHandle {
|
||||||
TypeId::of::<T>() == self.view_type
|
TypeId::of::<T>() == self.view_type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_focused(&self, cx: &AppContext) -> bool {
|
||||||
|
cx.focused_view_id(self.window_id)
|
||||||
|
.map_or(false, |focused_id| focused_id == self.view_id)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn downcast<T: View>(self) -> Option<ViewHandle<T>> {
|
pub fn downcast<T: View>(self) -> Option<ViewHandle<T>> {
|
||||||
if self.is::<T>() {
|
if self.is::<T>() {
|
||||||
let result = Some(ViewHandle {
|
let result = Some(ViewHandle {
|
||||||
|
|
|
@ -12,6 +12,7 @@ use crate::{
|
||||||
rpc,
|
rpc,
|
||||||
settings::Settings,
|
settings::Settings,
|
||||||
user,
|
user,
|
||||||
|
workspace::sidebar::{Side, Sidebar, SidebarItemId, ToggleSidebarItem, ToggleSidebarItemFocus},
|
||||||
worktree::{File, Worktree},
|
worktree::{File, Worktree},
|
||||||
AppState, Authenticate,
|
AppState, Authenticate,
|
||||||
};
|
};
|
||||||
|
@ -31,7 +32,6 @@ use log::error;
|
||||||
pub use pane::*;
|
pub use pane::*;
|
||||||
pub use pane_group::*;
|
pub use pane_group::*;
|
||||||
use postage::{prelude::Stream, watch};
|
use postage::{prelude::Stream, watch};
|
||||||
use sidebar::{Side, Sidebar, ToggleSidebarItem};
|
|
||||||
use std::{
|
use std::{
|
||||||
collections::{hash_map::Entry, HashMap},
|
collections::{hash_map::Entry, HashMap},
|
||||||
future::Future,
|
future::Future,
|
||||||
|
@ -55,6 +55,7 @@ pub fn init(cx: &mut MutableAppContext) {
|
||||||
cx.add_action(Workspace::debug_elements);
|
cx.add_action(Workspace::debug_elements);
|
||||||
cx.add_action(Workspace::open_new_file);
|
cx.add_action(Workspace::open_new_file);
|
||||||
cx.add_action(Workspace::toggle_sidebar_item);
|
cx.add_action(Workspace::toggle_sidebar_item);
|
||||||
|
cx.add_action(Workspace::toggle_sidebar_item_focus);
|
||||||
cx.add_action(Workspace::share_worktree);
|
cx.add_action(Workspace::share_worktree);
|
||||||
cx.add_action(Workspace::unshare_worktree);
|
cx.add_action(Workspace::unshare_worktree);
|
||||||
cx.add_action(Workspace::join_worktree);
|
cx.add_action(Workspace::join_worktree);
|
||||||
|
@ -62,6 +63,22 @@ pub fn init(cx: &mut MutableAppContext) {
|
||||||
cx.add_bindings(vec![
|
cx.add_bindings(vec![
|
||||||
Binding::new("cmd-s", Save, None),
|
Binding::new("cmd-s", Save, None),
|
||||||
Binding::new("cmd-alt-i", DebugElements, None),
|
Binding::new("cmd-alt-i", DebugElements, None),
|
||||||
|
Binding::new(
|
||||||
|
"cmd-shift-!",
|
||||||
|
ToggleSidebarItem(SidebarItemId {
|
||||||
|
side: Side::Left,
|
||||||
|
item_index: 0,
|
||||||
|
}),
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
Binding::new(
|
||||||
|
"cmd-1",
|
||||||
|
ToggleSidebarItemFocus(SidebarItemId {
|
||||||
|
side: Side::Left,
|
||||||
|
item_index: 0,
|
||||||
|
}),
|
||||||
|
None,
|
||||||
|
),
|
||||||
]);
|
]);
|
||||||
pane::init(cx);
|
pane::init(cx);
|
||||||
}
|
}
|
||||||
|
@ -805,6 +822,26 @@ impl Workspace {
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn toggle_sidebar_item_focus(
|
||||||
|
&mut self,
|
||||||
|
action: &ToggleSidebarItemFocus,
|
||||||
|
cx: &mut ViewContext<Self>,
|
||||||
|
) {
|
||||||
|
let sidebar = match action.0.side {
|
||||||
|
Side::Left => &mut self.left_sidebar,
|
||||||
|
Side::Right => &mut self.right_sidebar,
|
||||||
|
};
|
||||||
|
sidebar.activate_item(action.0.item_index);
|
||||||
|
if let Some(active_item) = sidebar.active_item() {
|
||||||
|
if active_item.is_focused(cx) {
|
||||||
|
cx.focus_self();
|
||||||
|
} else {
|
||||||
|
cx.focus(active_item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cx.notify();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn debug_elements(&mut self, _: &DebugElements, cx: &mut ViewContext<Self>) {
|
pub fn debug_elements(&mut self, _: &DebugElements, cx: &mut ViewContext<Self>) {
|
||||||
match to_string_pretty(&cx.debug_elements()) {
|
match to_string_pretty(&cx.debug_elements()) {
|
||||||
Ok(json) => {
|
Ok(json) => {
|
||||||
|
|
|
@ -23,10 +23,11 @@ struct Item {
|
||||||
view: AnyViewHandle,
|
view: AnyViewHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
action!(ToggleSidebarItem, ToggleArg);
|
action!(ToggleSidebarItem, SidebarItemId);
|
||||||
|
action!(ToggleSidebarItemFocus, SidebarItemId);
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ToggleArg {
|
pub struct SidebarItemId {
|
||||||
pub side: Side,
|
pub side: Side,
|
||||||
pub item_index: usize,
|
pub item_index: usize,
|
||||||
}
|
}
|
||||||
|
@ -45,6 +46,10 @@ impl Sidebar {
|
||||||
self.items.push(Item { icon_path, view });
|
self.items.push(Item { icon_path, view });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn activate_item(&mut self, item_ix: usize) {
|
||||||
|
self.active_item_ix = Some(item_ix);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn toggle_item(&mut self, item_ix: usize) {
|
pub fn toggle_item(&mut self, item_ix: usize) {
|
||||||
if self.active_item_ix == Some(item_ix) {
|
if self.active_item_ix == Some(item_ix) {
|
||||||
self.active_item_ix = None;
|
self.active_item_ix = None;
|
||||||
|
@ -102,7 +107,10 @@ impl Sidebar {
|
||||||
)
|
)
|
||||||
.with_cursor_style(CursorStyle::PointingHand)
|
.with_cursor_style(CursorStyle::PointingHand)
|
||||||
.on_mouse_down(move |cx| {
|
.on_mouse_down(move |cx| {
|
||||||
cx.dispatch_action(ToggleSidebarItem(ToggleArg { side, item_index }))
|
cx.dispatch_action(ToggleSidebarItem(SidebarItemId {
|
||||||
|
side,
|
||||||
|
item_index,
|
||||||
|
}))
|
||||||
})
|
})
|
||||||
.boxed()
|
.boxed()
|
||||||
}))
|
}))
|
||||||
|
|
Loading…
Reference in a new issue