workspace_settings.rs

 1use schemars::JsonSchema;
 2use serde::{Deserialize, Serialize};
 3use settings::Setting;
 4
 5#[derive(Deserialize)]
 6pub struct WorkspaceSettings {
 7    pub active_pane_magnification: f32,
 8    pub confirm_quit: bool,
 9    pub show_call_status_icon: bool,
10    pub autosave: AutosaveSetting,
11    pub git: GitSettings,
12}
13
14#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
15pub struct WorkspaceSettingsContent {
16    pub active_pane_magnification: Option<f32>,
17    pub confirm_quit: Option<bool>,
18    pub show_call_status_icon: Option<bool>,
19    pub autosave: Option<AutosaveSetting>,
20    pub git: Option<GitSettings>,
21}
22
23#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
24#[serde(rename_all = "snake_case")]
25pub enum AutosaveSetting {
26    Off,
27    AfterDelay { milliseconds: u64 },
28    OnFocusChange,
29    OnWindowChange,
30}
31
32#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
33pub struct GitSettings {
34    pub git_gutter: Option<GitGutterSetting>,
35    pub gutter_debounce: Option<u64>,
36}
37
38#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, JsonSchema)]
39#[serde(rename_all = "snake_case")]
40pub enum GitGutterSetting {
41    #[default]
42    TrackedFiles,
43    Hide,
44}
45
46impl Setting for WorkspaceSettings {
47    const KEY: Option<&'static str> = None;
48
49    type FileContent = WorkspaceSettingsContent;
50
51    fn load(
52        default_value: &Self::FileContent,
53        user_values: &[&Self::FileContent],
54        _: &gpui::AppContext,
55    ) -> anyhow::Result<Self> {
56        Self::load_via_json_merge(default_value, user_values)
57    }
58}