diff --git a/assets/settings/default.json b/assets/settings/default.json index 154fe2d6e34e6573e95e7ffedbb46df8bbf10634..09c47f5d073d9ffe3867510f61723fe47c4c0fc2 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -1319,15 +1319,17 @@ // Globs to match files that will be considered "hidden". These files can be hidden from the // project panel by toggling the "hide_hidden" setting. "hidden_files": ["**/.*"], - // Git gutter behavior configuration. + // Git integration settings. "git": { - // Global switch to enable or disable all git integration features. - // If set to true, disables all git integration features. - // If set to false, individual git integration features below will be independently enabled or disabled. + // Master switch to disable all git integration features. + // When true, all git features are disabled regardless of other settings. + // When false (default), individual features are controlled by their respective settings. "disable_git": false, - // Whether to enable git status tracking. + // Whether to show git status indicators (modified, added, deleted) in the + // project panel, outline panel, and tabs. "enable_status": true, - // Whether to enable git diff display. + // Whether to show git diff information, including gutter diff indicators + // and scrollbar diff markers. "enable_diff": true, // Control whether the git gutter is shown. May take 2 values: // 1. Show the gutter diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index f7b6aa949e74dca9bee73419fa2b87899f9986fd..2a45400072425bf6ec0b5b5ba82300a6bcef3837 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -64,10 +64,7 @@ use project::{ debugger::breakpoint_store::{Breakpoint, BreakpointSessionState}, project_settings::ProjectSettings, }; -use settings::{ - GitGutterSetting, GitHunkStyleSetting, IndentGuideBackgroundColoring, IndentGuideColoring, - Settings, -}; +use settings::{GitHunkStyleSetting, IndentGuideBackgroundColoring, IndentGuideColoring, Settings}; use smallvec::{SmallVec, smallvec}; use std::{ any::TypeId, @@ -2204,8 +2201,8 @@ impl EditorElement { .display_diff_hunks_for_rows(display_rows, folded_buffers) .map(|hunk| (hunk, None)) .collect::>(); - let git_gutter_setting = ProjectSettings::get_global(cx).git.git_gutter; - if let GitGutterSetting::TrackedFiles = git_gutter_setting { + let git_settings = &ProjectSettings::get_global(cx).git; + if git_settings.is_gutter_enabled() { for (hunk, hitbox) in &mut display_hunks { if matches!(hunk, DisplayDiffHunk::Unfolded { .. }) { let hunk_bounds = @@ -6469,12 +6466,7 @@ impl EditorElement { .position_map .snapshot .show_git_diff_gutter - .unwrap_or_else(|| { - matches!( - ProjectSettings::get_global(cx).git.git_gutter, - GitGutterSetting::TrackedFiles - ) - }); + .unwrap_or_else(|| ProjectSettings::get_global(cx).git.is_gutter_enabled()); if show_git_gutter { Self::paint_gutter_diff_hunks(layout, window, cx) } diff --git a/crates/project/src/project_settings.rs b/crates/project/src/project_settings.rs index 633f2bbd3b40139f6355e109211d665cfd0c1e5f..12c2e394b3df09e93f99c0e1a328527e1acc9f93 100644 --- a/crates/project/src/project_settings.rs +++ b/crates/project/src/project_settings.rs @@ -365,6 +365,27 @@ pub struct GitSettings { pub path_style: GitPathStyle, } +impl GitSettings { + /// Returns whether git status indicators should be shown. + /// This includes status in the project panel, outline panel, and tabs. + pub fn is_status_enabled(&self) -> bool { + self.enabled.status + } + + /// Returns whether git diff features should be shown. + /// This includes gutter diff indicators and scrollbar diff markers. + pub fn is_diff_enabled(&self) -> bool { + self.enabled.diff + } + + /// Returns whether the git gutter should be shown. + /// This checks both the global diff setting and the gutter-specific setting. + pub fn is_gutter_enabled(&self) -> bool { + self.is_diff_enabled() + && matches!(self.git_gutter, settings::GitGutterSetting::TrackedFiles) + } +} + #[derive(Clone, Copy, Debug)] pub struct GitEnabledSettings { /// Whether git integration is enabled for showing git status. diff --git a/crates/settings/src/settings_content/project.rs b/crates/settings/src/settings_content/project.rs index 8e2d864149c9ecb6ca38ca73ef58205f588dc07b..80d4d4017d688b8b6373a5c1730fdb0652f3721c 100644 --- a/crates/settings/src/settings_content/project.rs +++ b/crates/settings/src/settings_content/project.rs @@ -322,12 +322,28 @@ pub struct GitSettings { pub path_style: Option, } +/// Global controls for enabling or disabling git integration features. +/// +/// These settings provide a centralized way to control git integration, +/// rather than having to configure each feature individually. #[with_fallible_options] #[derive(Clone, Copy, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)] #[serde(rename_all = "snake_case")] pub struct GitEnabledSettings { + /// Master switch to disable all git integration features. + /// When true, all git features are disabled regardless of other settings. + /// + /// Default: false pub disable_git: Option, + /// Whether to show git status indicators (modified, added, deleted) + /// in the project panel, outline panel, and tabs. + /// + /// Default: true pub enable_status: Option, + /// Whether to show git diff information, including gutter diff + /// indicators and scrollbar diff markers. + /// + /// Default: true pub enable_diff: Option, }