diff --git a/assets/settings/default.json b/assets/settings/default.json index 6eaf7a42a6..83f6fb55e5 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -284,6 +284,11 @@ // 4. Save when idle for a certain amount of time: // "autosave": { "after_delay": {"milliseconds": 500} }, "autosave": "off", + // Settings related to the editor's tab bar. + "tab_bar": { + // Whether or not to show the navigation history buttons. + "show_nav_history_buttons": true + }, // Settings related to the editor's tabs "tabs": { // Show git status colors in the editor tabs. diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index 6cc6d8b8c1..e657d1cecd 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -1,7 +1,7 @@ use crate::{ item::{ClosePosition, Item, ItemHandle, ItemSettings, WeakItemHandle}, toolbar::Toolbar, - workspace_settings::{AutosaveSetting, WorkspaceSettings}, + workspace_settings::{AutosaveSetting, TabBarSettings, WorkspaceSettings}, NewCenterTerminal, NewFile, NewSearch, OpenVisible, SplitDirection, ToggleZoom, Workspace, }; use anyhow::Result; @@ -17,7 +17,7 @@ use gpui::{ use parking_lot::Mutex; use project::{Project, ProjectEntryId, ProjectPath}; use serde::Deserialize; -use settings::Settings; +use settings::{Settings, SettingsStore}; use std::{ any::Any, cmp, fmt, mem, @@ -256,6 +256,7 @@ impl Pane { cx.on_focus(&focus_handle, Pane::focus_in), cx.on_focus_in(&focus_handle, Pane::focus_in), cx.on_focus_out(&focus_handle, Pane::focus_out), + cx.observe_global::(Self::settings_changed), ]; let handle = cx.view().downgrade(); @@ -350,7 +351,7 @@ impl Pane { }) .into_any_element() }), - display_nav_history_buttons: true, + display_nav_history_buttons: TabBarSettings::get_global(cx).show_nav_history_buttons, _subscriptions: subscriptions, double_click_dispatch_action, } @@ -418,6 +419,11 @@ impl Pane { cx.notify(); } + fn settings_changed(&mut self, cx: &mut ViewContext) { + self.display_nav_history_buttons = TabBarSettings::get_global(cx).show_nav_history_buttons; + cx.notify(); + } + pub fn active_item_index(&self) -> usize { self.active_item_index } diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 8a2fb64b8b..6f25af48b9 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -81,7 +81,7 @@ use ui::{ }; use util::ResultExt; use uuid::Uuid; -pub use workspace_settings::{AutosaveSetting, WorkspaceSettings}; +pub use workspace_settings::{AutosaveSetting, TabBarSettings, WorkspaceSettings}; use crate::persistence::{ model::{DockData, DockStructure, SerializedItem, SerializedPane, SerializedPaneGroup}, @@ -260,6 +260,7 @@ impl Column for WorkspaceId { pub fn init_settings(cx: &mut AppContext) { WorkspaceSettings::register(cx); ItemSettings::register(cx); + TabBarSettings::register(cx); } pub fn init(app_state: Arc, cx: &mut AppContext) { diff --git a/crates/workspace/src/workspace_settings.rs b/crates/workspace/src/workspace_settings.rs index 4a922b85c2..a4841f0a34 100644 --- a/crates/workspace/src/workspace_settings.rs +++ b/crates/workspace/src/workspace_settings.rs @@ -32,6 +32,19 @@ pub struct WorkspaceSettingsContent { pub autosave: Option, } +#[derive(Deserialize)] +pub struct TabBarSettings { + pub show_nav_history_buttons: bool, +} + +#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] +pub struct TabBarSettingsContent { + /// Whether or not to show the navigation history buttons in the tab bar. + /// + /// Default: true + pub show_nav_history_buttons: Option, +} + #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum AutosaveSetting { @@ -58,3 +71,17 @@ impl Settings for WorkspaceSettings { Self::load_via_json_merge(default_value, user_values) } } + +impl Settings for TabBarSettings { + const KEY: Option<&'static str> = Some("tab_bar"); + + type FileContent = TabBarSettingsContent; + + fn load( + default_value: &Self::FileContent, + user_values: &[&Self::FileContent], + _: &mut gpui::AppContext, + ) -> anyhow::Result { + Self::load_via_json_merge(default_value, user_values) + } +}