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}