Editor tab bar settings (#7356)

This PR is another step to tabless editing (#6424, #4963). It adds
support for tab bar settings that allow the user to change its placement
or to hide completely.

Configuraton:

```json
"tab_bar": {
  "show": true
}
```

Placemnet options are "top", "bottom" and "no".

This PR intentionally doesn't affect tab bars of other panes (Terminal
for instance) to keep code changes small. I guess we'll do the rest in
separate PRs.

Release Notes:

- Added support for configuring the editor tab bar (part of #6424,
#4963).

---------

Co-authored-by: Mikayla <mikayla@zed.dev>
This commit is contained in:
Andrew Lygin 2024-05-08 20:54:48 +03:00 committed by GitHub
parent 689e4aef2f
commit 0933426e63
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 98 additions and 2 deletions

View file

@ -69,7 +69,7 @@ impl ClosePosition {
pub struct ItemSettingsContent {
/// Whether to show the Git file status on a tab item.
///
/// Default: true
/// Default: false
git_status: Option<bool>,
/// Position of the close button in a tab.
///

View file

@ -203,6 +203,7 @@ pub struct Pane {
custom_drop_handle:
Option<Arc<dyn Fn(&mut Pane, &dyn Any, &mut ViewContext<Pane>) -> ControlFlow<(), ()>>>,
can_split: bool,
should_display_tab_bar: Rc<dyn Fn(&ViewContext<Pane>) -> bool>,
render_tab_bar_buttons: Rc<dyn Fn(&mut Pane, &mut ViewContext<Pane>) -> AnyElement>,
_subscriptions: Vec<Subscription>,
tab_bar_scroll_handle: ScrollHandle,
@ -312,6 +313,7 @@ impl Pane {
can_drop_predicate,
custom_drop_handle: None,
can_split: true,
should_display_tab_bar: Rc::new(|cx| TabBarSettings::get_global(cx).show),
render_tab_bar_buttons: Rc::new(move |pane, cx| {
// Ideally we would return a vec of elements here to pass directly to the [TabBar]'s
// `end_slot`, but due to needing a view here that isn't possible.
@ -468,6 +470,13 @@ impl Pane {
&self.activation_history
}
pub fn set_should_display_tab_bar<F>(&mut self, should_display_tab_bar: F)
where
F: 'static + Fn(&ViewContext<Pane>) -> bool,
{
self.should_display_tab_bar = Rc::new(should_display_tab_bar);
}
pub fn set_can_split(&mut self, can_split: bool, cx: &mut ViewContext<Self>) {
self.can_split = can_split;
cx.notify();
@ -1963,6 +1972,9 @@ impl Render for Pane {
key_context.add("EmptyPane");
}
let should_display_tab_bar = self.should_display_tab_bar.clone();
let display_tab_bar = should_display_tab_bar(cx);
v_flex()
.key_context(key_context)
.track_focus(&self.focus_handle)
@ -2061,7 +2073,7 @@ impl Render for Pane {
}
}),
)
.when(self.active_item().is_some(), |pane| {
.when(self.active_item().is_some() && display_tab_bar, |pane| {
pane.child(self.render_tab_bar(cx))
})
.child({

View file

@ -60,11 +60,16 @@ pub struct WorkspaceSettingsContent {
#[derive(Deserialize)]
pub struct TabBarSettings {
pub show: bool,
pub show_nav_history_buttons: bool,
}
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
pub struct TabBarSettingsContent {
/// Whether or not to show the tab bar in the editor.
///
/// Default: top
pub show: Option<bool>,
/// Whether or not to show the navigation history buttons in the tab bar.
///
/// Default: true