use editor::EditorSettings; use gpui::Pixels; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; use ui::scrollbars::{ScrollbarVisibility, ShowScrollbar}; use workspace::dock::DockPosition; #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] pub struct ScrollbarSettingsContent { /// When to show the scrollbar in the git panel. /// /// Default: inherits editor scrollbar settings pub show: Option>, } #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] pub struct ScrollbarSettings { pub show: Option, } #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[serde(rename_all = "snake_case")] // Style of the git status indicator in the panel. // // Default: icon pub enum StatusStyleContent { Icon, LabelColor, } #[derive(Default, Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] #[serde(rename_all = "snake_case")] pub enum StatusStyle { #[default] Icon, LabelColor, } #[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] #[settings_key(key = "git_panel")] pub struct GitPanelSettingsContent { /// Whether to show the panel button in the status bar. /// /// Default: true pub button: Option, /// Where to dock the panel. /// /// Default: left pub dock: Option, /// Default width of the panel in pixels. /// /// Default: 360 pub default_width: Option, /// How entry statuses are displayed. /// /// Default: icon pub status_style: Option, /// How and when the scrollbar should be displayed. /// /// Default: inherits editor scrollbar settings pub scrollbar: Option, /// What the default branch name should be when /// `init.defaultBranch` is not set in git /// /// Default: main pub fallback_branch_name: Option, /// Whether to sort entries in the panel by path /// or by status (the default). /// /// Default: false pub sort_by_path: Option, /// Whether to collapse untracked files in the diff panel. /// /// Default: false pub collapse_untracked_diff: Option, } #[derive(Deserialize, Debug, Clone, PartialEq)] pub struct GitPanelSettings { pub button: bool, pub dock: DockPosition, pub default_width: Pixels, pub status_style: StatusStyle, pub scrollbar: ScrollbarSettings, pub fallback_branch_name: String, pub sort_by_path: bool, pub collapse_untracked_diff: bool, } impl ScrollbarVisibility for GitPanelSettings { fn visibility(&self, cx: &ui::App) -> ShowScrollbar { // TODO: This PR should have defined Editor's `scrollbar.axis` // as an Option, not a ScrollbarAxes as it would allow you to // `.unwrap_or(EditorSettings::get_global(cx).scrollbar.show)`. // // Once this is fixed we can extend the GitPanelSettings with a `scrollbar.axis` // so we can show each axis based on the settings. // // We should fix this. PR: https://github.com/zed-industries/zed/pull/19495 self.scrollbar .show .unwrap_or_else(|| EditorSettings::get_global(cx).scrollbar.show) } } impl Settings for GitPanelSettings { type FileContent = GitPanelSettingsContent; fn load( sources: SettingsSources, _: &mut gpui::App, ) -> anyhow::Result { sources.json_merge() } fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { vscode.bool_setting("git.enabled", &mut current.button); vscode.string_setting("git.defaultBranchName", &mut current.fallback_branch_name); } }