use anyhow::Result; use collections::HashMap; use gpui::AppContext; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::{Settings, SettingsSources}; #[derive(Deserialize)] pub struct WorkspaceSettings { pub active_pane_magnification: f32, pub centered_layout: CenteredLayoutSettings, pub confirm_quit: bool, pub show_call_status_icon: bool, pub autosave: AutosaveSetting, pub restore_on_startup: RestoreOnStartupBehavior, pub drop_target_size: f32, pub when_closing_with_no_tabs: CloseWindowWhenNoItems, pub use_system_path_prompts: bool, pub command_aliases: HashMap, } #[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum CloseWindowWhenNoItems { /// Match platform conventions by default, so "on" on macOS and "off" everywhere else #[default] PlatformDefault, /// Close the window when there are no tabs CloseWindow, /// Leave the window open when there are no tabs KeepWindowOpen, } impl CloseWindowWhenNoItems { pub fn should_close(&self) -> bool { match self { CloseWindowWhenNoItems::PlatformDefault => cfg!(target_os = "macos"), CloseWindowWhenNoItems::CloseWindow => true, CloseWindowWhenNoItems::KeepWindowOpen => false, } } } #[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum RestoreOnStartupBehavior { /// Always start with an empty editor None, /// Restore the workspace that was closed last. LastWorkspace, /// Restore all workspaces that were open when quitting Zed. #[default] LastSession, } #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] pub struct WorkspaceSettingsContent { /// Scale by which to zoom the active pane. /// When set to 1.0, the active pane has the same size as others, /// but when set to a larger value, the active pane takes up more space. /// /// Default: `1.0` pub active_pane_magnification: Option, // Centered layout related settings. pub centered_layout: Option, /// Whether or not to prompt the user to confirm before closing the application. /// /// Default: false pub confirm_quit: Option, /// Whether or not to show the call status icon in the status bar. /// /// Default: true pub show_call_status_icon: Option, /// When to automatically save edited buffers. /// /// Default: off pub autosave: Option, /// Controls previous session restoration in freshly launched Zed instance. /// Values: none, last_workspace, last_session /// Default: last_session pub restore_on_startup: Option, /// The size of the workspace split drop targets on the outer edges. /// Given as a fraction that will be multiplied by the smaller dimension of the workspace. /// /// Default: `0.2` (20% of the smaller dimension of the workspace) pub drop_target_size: Option, /// Whether to close the window when using 'close active item' on a workspace with no tabs /// /// Default: auto ("on" on macOS, "off" otherwise) pub when_closing_with_no_tabs: Option, /// Whether to use the system provided dialogs for Open and Save As. /// When set to false, Zed will use the built-in keyboard-first pickers. /// /// Default: true pub use_system_path_prompts: Option, /// Aliases for the command palette. When you type a key in this map, /// it will be assumed to equal the value. /// /// Default: true pub command_aliases: Option>, } #[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: true pub show: Option, /// 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 { /// Disable autosave. Off, /// Save after inactivity period of `milliseconds`. AfterDelay { milliseconds: u64 }, /// Autosave when focus changes. OnFocusChange, /// Autosave when the active window changes. OnWindowChange, } #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "snake_case")] pub struct CenteredLayoutSettings { /// The relative width of the left padding of the central pane from the /// workspace when the centered layout is used. /// /// Default: 0.2 pub left_padding: Option, // The relative width of the right padding of the central pane from the // workspace when the centered layout is used. /// /// Default: 0.2 pub right_padding: Option, } impl Settings for WorkspaceSettings { const KEY: Option<&'static str> = None; type FileContent = WorkspaceSettingsContent; fn load(sources: SettingsSources, _: &mut AppContext) -> Result { sources.json_merge() } } impl Settings for TabBarSettings { const KEY: Option<&'static str> = Some("tab_bar"); type FileContent = TabBarSettingsContent; fn load(sources: SettingsSources, _: &mut AppContext) -> Result { sources.json_merge() } }