7402 lines · 364.3 KB · Rust
RawDownload
use gpui::App;use settings::{LanguageSettingsContent, SettingsContent};use std::sync::Arc;use strum::IntoDiscriminant as _;use ui::{IntoElement, SharedString}; use crate::{    DynamicItem, PROJECT, SettingField, SettingItem, SettingsFieldMetadata, SettingsPage,    SettingsPageItem, SubPageLink, USER, all_language_names, sub_page_stack,}; const DEFAULT_STRING: String = String::new();/// A default empty string reference. Useful in `pick` functions for cases either in dynamic item fields, or when dealing with `settings::Maybe`/// to avoid the "NO DEFAULT" case.const DEFAULT_EMPTY_STRING: Option<&String> = Some(&DEFAULT_STRING); const DEFAULT_SHARED_STRING: SharedString = SharedString::new_static("");/// A default empty string reference. Useful in `pick` functions for cases either in dynamic item fields, or when dealing with `settings::Maybe`/// to avoid the "NO DEFAULT" case.const DEFAULT_EMPTY_SHARED_STRING: Option<&SharedString> = Some(&DEFAULT_SHARED_STRING); pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {    vec![        SettingsPage {            title: "General",            items: vec![                SettingsPageItem::SectionHeader("General Settings"),                SettingsPageItem::SettingItem(SettingItem {                    files: PROJECT,                    title: "Project Name",                    description: "The displayed name of this project. If left empty, the root directory name will be displayed.",                    field: Box::new(                        SettingField {                            json_path: Some("project_name"),                            pick: |settings_content| {                                settings_content.project.worktree.project_name.as_ref().or(DEFAULT_EMPTY_STRING)                            },                            write: |settings_content, value| {                                settings_content.project.worktree.project_name = value.filter(|name| !name.is_empty());                            },                        }                    ),                    metadata: Some(Box::new(SettingsFieldMetadata { placeholder: Some("Project Name"), ..Default::default() })),                }),                SettingsPageItem::SettingItem(SettingItem {                    title: "When Closing With No Tabs",                    description: "What to do when using the 'close active item' action with no tabs.",                    field: Box::new(SettingField {                        json_path: Some("when_closing_with_no_tabs"),                        pick: |settings_content| {                            settings_content                                .workspace                                .when_closing_with_no_tabs                                .as_ref()                        },                        write: |settings_content, value| {                            settings_content.workspace.when_closing_with_no_tabs = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SettingItem(SettingItem {                    title: "On Last Window Closed",                    description: "What to do when the last window is closed.",                    field: Box::new(SettingField {                        json_path: Some("on_last_window_closed"),                        pick: |settings_content| {                            settings_content.workspace.on_last_window_closed.as_ref()                        },                        write: |settings_content, value| {                            settings_content.workspace.on_last_window_closed = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SettingItem(SettingItem {                    title: "Use System Path Prompts",                    description: "Use native OS dialogs for 'Open' and 'Save As'.",                    field: Box::new(SettingField {                        json_path: Some("use_system_path_prompts"),                        pick: |settings_content| {                            settings_content.workspace.use_system_path_prompts.as_ref()                        },                        write: |settings_content, value| {                            settings_content.workspace.use_system_path_prompts = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SettingItem(SettingItem {                    title: "Use System Prompts",                    description: "Use native OS dialogs for confirmations.",                    field: Box::new(SettingField {                        json_path: Some("use_system_prompts"),                        pick: |settings_content| {                            settings_content.workspace.use_system_prompts.as_ref()                        },                        write: |settings_content, value| {                            settings_content.workspace.use_system_prompts = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SettingItem(SettingItem {                    title: "Redact Private Values",                    description: "Hide the values of variables in private files.",                    field: Box::new(SettingField {                        json_path: Some("redact_private_values"),                        pick: |settings_content| {                            settings_content.editor.redact_private_values.as_ref()                        },                        write: |settings_content, value| {                            settings_content.editor.redact_private_values = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SettingItem(SettingItem {                    title: "Private Files",                    description: "Globs to match against file paths to determine if a file is private.",                    field: Box::new(                        SettingField {                            json_path: Some("worktree.private_files"),                            pick: |settings_content| {                                settings_content.project.worktree.private_files.as_ref()                            },                            write: |settings_content, value| {                                settings_content.project.worktree.private_files = value;                            },                        }                        .unimplemented(),                    ),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SectionHeader("Workspace Restoration"),                SettingsPageItem::SettingItem(SettingItem {                    title: "Restore Unsaved Buffers",                    description: "Whether or not to restore unsaved buffers on restart.",                    field: Box::new(SettingField {                        json_path: Some("session.restore_unsaved_buffers"),                        pick: |settings_content| {                            settings_content                                .session                                .as_ref()                                .and_then(|session| session.restore_unsaved_buffers.as_ref())                        },                        write: |settings_content, value| {                            settings_content                                .session                                .get_or_insert_default()                                .restore_unsaved_buffers = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SettingItem(SettingItem {                    title: "Restore On Startup",                    description: "What to restore from the previous session when opening Zed.",                    field: Box::new(SettingField {                        json_path: Some("restore_on_startup"),                        pick: |settings_content| {                            settings_content.workspace.restore_on_startup.as_ref()                        },                        write: |settings_content, value| {                            settings_content.workspace.restore_on_startup = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SectionHeader("Scoped Settings"),                SettingsPageItem::SettingItem(SettingItem {                    files: USER,                    title: "Preview Channel",                    description: "Which settings should be activated only in Preview build of Zed.",                    field: Box::new(                        SettingField {                            json_path: Some("preview_channel_settings"),                            pick: |settings_content| {                                Some(settings_content)                            },                            write: |_settings_content, _value| {                             },                        }                        .unimplemented(),                    ),                    metadata: None,                }),                SettingsPageItem::SettingItem(SettingItem {                    files: USER,                    title: "Settings Profiles",                    description: "Any number of settings profiles that are temporarily applied on top of your existing user settings.",                    field: Box::new(                        SettingField {                            json_path: Some("settings_profiles"),                            pick: |settings_content| {                                Some(settings_content)                            },                            write: |_settings_content, _value| {                            },                        }                        .unimplemented(),                    ),                    metadata: None,                }),                SettingsPageItem::SectionHeader("Privacy"),                SettingsPageItem::SettingItem(SettingItem {                    title: "Telemetry Diagnostics",                    description: "Send debug information like crash reports.",                    field: Box::new(SettingField {                        json_path: Some("telemetry.diagnostics"),                        pick: |settings_content| {                            settings_content                                .telemetry                                .as_ref()                                .and_then(|telemetry| telemetry.diagnostics.as_ref())                        },                        write: |settings_content, value| {                            settings_content                                .telemetry                                .get_or_insert_default()                                .diagnostics = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SettingItem(SettingItem {                    title: "Telemetry Metrics",                    description: "Send anonymized usage data like what languages you're using Zed with.",                    field: Box::new(SettingField {                        json_path: Some("telemetry.metrics"),                        pick: |settings_content| {                            settings_content                                .telemetry                                .as_ref()                                .and_then(|telemetry| telemetry.metrics.as_ref())                        },                        write: |settings_content, value| {                            settings_content.telemetry.get_or_insert_default().metrics = value;                        },                    }),                    metadata: None,                    files: USER,                }),                SettingsPageItem::SectionHeader("Auto Update"),                SettingsPageItem::SettingItem(SettingItem {                    title: "Auto Update",                    description: "Whether or not to automatically check for updates.",                    field: Box::new(SettingField {                        json_path: Some("auto_update"),                        pick: |settings_content| settings_content.auto_update.as_ref(),                        write: |settings_content, value| {                            settings_content.auto_update = value;                        },                    }),                    metadata: None,                    files: USER,                }),            ],        },        SettingsPage {            title: "Appearance",            items: vec![                SettingsPageItem::SectionHeader("Theme"),                SettingsPageItem::DynamicItem(DynamicItem {                    discriminant: SettingItem {                        files: USER,                        title: "Theme Mode",                        description: "Choose a static, fixed theme or dynamically select themes based on appearance and light/dark modes.",                        field: Box::new(SettingField {                            json_path: Some("theme$"),                            pick: |settings_content| {                                Some(&dynamic_variants::<settings::ThemeSelection>()[                                    settings_content                                        .theme                                        .theme                                        .as_ref()?                                        .discriminant() as usize])                            },                            write: |settings_content, value| {                                let Some(value) = value else {                                    settings_content.theme.theme = None;                                    return;                                };                                let settings_value = settings_content.theme.theme.get_or_insert_with(|| {                                    settings::ThemeSelection::Static(theme::ThemeName(theme::default_theme(theme::SystemAppearance::default().0).into()))                                });                                *settings_value = match value {                                    settings::ThemeSelectionDiscriminants::Static => {                                        let name = match settings_value {                                            settings::ThemeSelection::Static(_) => return,                                            settings::ThemeSelection::Dynamic { mode, light, dark } => {                                                match mode {                                                    theme::ThemeAppearanceMode::Light => light.clone(),                                                    theme::ThemeAppearanceMode::Dark => dark.clone(),                                                    theme::ThemeAppearanceMode::System => dark.clone(), // no cx, can't determine correct choice                                                }                                            },                                        };                                        settings::ThemeSelection::Static(name)                                    },                                    settings::ThemeSelectionDiscriminants::Dynamic => {                                        let static_name = match settings_value {                                            settings::ThemeSelection::Static(theme_name) => theme_name.clone(),                                            settings::ThemeSelection::Dynamic {..} => return,                                        };                                         settings::ThemeSelection::Dynamic {                                            mode: settings::ThemeAppearanceMode::System,                                            light: static_name.clone(),                                            dark: static_name,                                        }                                    },                                };                            },                        }),                        metadata: None,                    },                    pick_discriminant: |settings_content| {                        Some(settings_content.theme.theme.as_ref()?.discriminant() as usize)                    },                    fields: dynamic_variants::<settings::ThemeSelection>().into_iter().map(|variant| {                        match variant {                            settings::ThemeSelectionDiscriminants::Static => vec![                                SettingItem {                                    files: USER,                                    title: "Theme Name",                                    description: "The name of your selected theme.",                                    field: Box::new(SettingField {                                        json_path: Some("theme"),                                        pick: |settings_content| {                                            match settings_content.theme.theme.as_ref() {                                                Some(settings::ThemeSelection::Static(name)) => Some(name),                                                _ => None                                            }                                        },                                        write: |settings_content, value| {                                            let Some(value) = value else {                                                return;                                            };                                            match settings_content                                                .theme                                                .theme.as_mut() {                                                    Some(settings::ThemeSelection::Static(theme_name)) => *theme_name = value,                                                    _ => return                                                }                                        },                                    }),                                    metadata: None,                                }                            ],                            settings::ThemeSelectionDiscriminants::Dynamic => vec![                                SettingItem {                                    files: USER,                                    title: "Mode",                                    description: "Choose whether to use the selected light or dark theme or to follow your OS appearance configuration.",                                    field: Box::new(SettingField {                                        json_path: Some("theme.mode"),                                        pick: |settings_content| {                                            match settings_content.theme.theme.as_ref() {                                                Some(settings::ThemeSelection::Dynamic { mode, ..}) => Some(mode),                                                _ => None                                            }                                        },                                        write: |settings_content, value| {                                            let Some(value) = value else {                                                return;                                            };                                            match settings_content                                                .theme                                                .theme.as_mut() {                                                    Some(settings::ThemeSelection::Dynamic{ mode, ..}) => *mode = value,                                                    _ => return                                                }                                        },                                    }),                                    metadata: None,                                },                                SettingItem {                                    files: USER,                                    title: "Light Theme",                                    description: "The theme to use when mode is set to light, or when mode is set to system and it is in light mode.",                                    field: Box::new(SettingField {                                        json_path: Some("theme.light"),                                        pick: |settings_content| {                                            match settings_content.theme.theme.as_ref() {                                                Some(settings::ThemeSelection::Dynamic { light, ..}) => Some(light),                                                _ => None                                            }                                        },                                        write: |settings_content, value| {                                            let Some(value) = value else {                                                return;                                            };                                            match settings_content                                                .theme                                                .theme.as_mut() {                                                    Some(settings::ThemeSelection::Dynamic{ light, ..}) => *light = value,                                                    _ => return                                                }                                        },                                    }),                                    metadata: None,                                },                                SettingItem {                                    files: USER,                                    title: "Dark Theme",                                    description: "The theme to use when mode is set to dark, or when mode is set to system and it is in dark mode.",                                    field: Box::new(SettingField {                                        json_path: Some("theme.dark"),                                        pick: |settings_content| {                                            match settings_content.theme.theme.as_ref() {                                                Some(settings::ThemeSelection::Dynamic { dark, ..}) => Some(dark),                                                _ => None                                            }                                        },                                        write: |settings_content, value| {                                            let Some(value) = value else {                                                return;                                            };                                            match settings_content                                                .theme                                                .theme.as_mut() {                                                    Some(settings::ThemeSelection::Dynamic{ dark, ..}) => *dark = value,                                                    _ => return                                                }                                        },                                    }),                                    metadata: None,                                }                            ],                        }                    }).collect(),                }),                SettingsPageItem::DynamicItem(DynamicItem {                    discriminant: SettingItem {                        files: USER,                        title: "Icon Theme",                        description: "The custom set of icons Zed will associate with files and directories.",                        field: Box::new(SettingField {                            json_path: Some("icon_theme$"),                            pick: |settings_content| {                                Some(&dynamic_variants::<settings::IconThemeSelection>()[                                    settings_content                                        .theme                                        .icon_theme                                        .as_ref()?                                        .discriminant() as usize])                            },                            write: |settings_content, value| {                                let Some(value) = value else {                                    settings_content.theme.icon_theme = None;                                    return;                                };                                let settings_value = settings_content.theme.icon_theme.get_or_insert_with(|| {                                    settings::IconThemeSelection::Static(settings::IconThemeName(theme::default_icon_theme().name.clone().into()))                                });                                *settings_value = match value {                                    settings::IconThemeSelectionDiscriminants::Static => {                                        let name = match settings_value {                                            settings::IconThemeSelection::Static(_) => return,                                            settings::IconThemeSelection::Dynamic { mode, light, dark } => {                                                match mode {                                                    theme::ThemeAppearanceMode::Light => light.clone(),                                                    theme::ThemeAppearanceMode::Dark => dark.clone(),                                                    theme::ThemeAppearanceMode::System => dark.clone(), // no cx, can't determine correct choice                                                }                                            },                                        };                                        settings::IconThemeSelection::Static(name)                                    },                                    settings::IconThemeSelectionDiscriminants::Dynamic => {                                        let static_name = match settings_value {                                            settings::IconThemeSelection::Static(theme_name) => theme_name.clone(),                                            settings::IconThemeSelection::Dynamic {..} => return,                                        };                                         settings::IconThemeSelection::Dynamic {                                            mode: settings::ThemeAppearanceMode::System,                                            light: static_name.clone(),                                            dark: static_name,                                        }                                    },                                };                            },                        }),                        metadata: None,                    },                    pick_discriminant: |settings_content| {                        Some(settings_content.theme.icon_theme.as_ref()?.discriminant() as usize)                    },

Lines 1–500 of 7402.