settings ui: Add basic setting page fields to UI (#39343)

This PR starts the process of adding each setting field manually to
their respective page in the UI and organizes user/project fields as
well. The next major step is implementing a numeric stepper component,
and handling discriminate union enums as well.

I also did some minor polish in this PR as well
- Switches now use accent color
- Fixed text input rendering with zero width 
- Made setting pages scrollable 
- Set drop down context menu style to outline

Release Notes:

- N/A

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>
This commit is contained in:
Anthony Eid
2025-10-02 09:04:02 +00:00
committed by GitHub
co-authored by dino
parent f17096879c
commit ec202a26c8
9 changed files with 2822 additions and 85 deletions
+35 -3
View File
@@ -220,7 +220,18 @@ impl UserSettingsContent {
///
/// Default: VSCode
#[derive(
Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq, Default,
Copy,
Clone,
Debug,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
PartialEq,
Eq,
Default,
strum::VariantArray,
strum::VariantNames,
)]
pub enum BaseKeymapContent {
#[default]
@@ -313,7 +324,7 @@ pub struct AudioSettingsContent {
/// Control what info is collected by Zed.
#[skip_serializing_none]
#[derive(Default, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Debug, MergeFrom)]
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Debug, MergeFrom)]
pub struct TelemetrySettingsContent {
/// Send debug info like crash reports.
///
@@ -325,6 +336,15 @@ pub struct TelemetrySettingsContent {
pub metrics: Option<bool>,
}
impl Default for TelemetrySettingsContent {
fn default() -> Self {
Self {
diagnostics: Some(true),
metrics: Some(true),
}
}
}
#[skip_serializing_none]
#[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Clone, MergeFrom)]
pub struct DebuggerSettingsContent {
@@ -706,7 +726,19 @@ pub struct OutlinePanelSettingsContent {
pub expand_outlines_with_depth: Option<usize>,
}
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, Copy, PartialEq)]
#[derive(
Clone,
Copy,
Debug,
PartialEq,
Eq,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum DockSide {
Left,
+100 -8
View File
@@ -363,7 +363,19 @@ pub enum DocumentColorsRenderMode {
Background,
}
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)]
#[derive(
Copy,
Clone,
Debug,
Serialize,
Deserialize,
PartialEq,
Eq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum CurrentLineHighlight {
// Don't highlight the current line.
@@ -377,7 +389,19 @@ pub enum CurrentLineHighlight {
}
/// When to populate a new search's query based on the text under the cursor.
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)]
#[derive(
Copy,
Clone,
Debug,
Serialize,
Deserialize,
PartialEq,
Eq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum SeedQuerySetting {
/// Always populate the search query with the word under the cursor.
@@ -390,7 +414,18 @@ pub enum SeedQuerySetting {
/// What to do when multibuffer is double clicked in some of its excerpts (parts of singleton buffers).
#[derive(
Default, Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom,
Default,
Copy,
Clone,
Debug,
Serialize,
Deserialize,
PartialEq,
Eq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum DoubleClickInMultibuffer {
@@ -459,7 +494,19 @@ pub enum ScrollbarDiagnostics {
/// The key to use for adding multiple cursors
///
/// Default: alt
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)]
#[derive(
Copy,
Clone,
Debug,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
PartialEq,
Eq,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum MultiCursorModifier {
Alt,
@@ -470,7 +517,19 @@ pub enum MultiCursorModifier {
/// Whether the editor will scroll beyond the last line.
///
/// Default: one_page
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)]
#[derive(
Copy,
Clone,
Debug,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
PartialEq,
Eq,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum ScrollBeyondLastLine {
/// The editor will not scroll beyond the last line.
@@ -513,7 +572,18 @@ pub enum CursorShape {
/// What to do when go to definition yields no results.
#[derive(
Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom,
Copy,
Clone,
Debug,
Default,
Serialize,
Deserialize,
PartialEq,
Eq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum GoToDefinitionFallback {
@@ -528,7 +598,18 @@ pub enum GoToDefinitionFallback {
///
/// Default: on_typing_and_movement
#[derive(
Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom,
Copy,
Clone,
Debug,
Default,
Serialize,
Deserialize,
PartialEq,
Eq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum HideMouseMode {
@@ -545,7 +626,18 @@ pub enum HideMouseMode {
///
/// Default: inline
#[derive(
Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom,
Copy,
Clone,
Debug,
Default,
Serialize,
Deserialize,
PartialEq,
Eq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum SnippetSortOrder {
@@ -147,7 +147,19 @@ pub enum EditPredictionsMode {
}
/// Controls the soft-wrapping behavior in the editor.
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)]
#[derive(
Copy,
Clone,
Debug,
Serialize,
Deserialize,
PartialEq,
Eq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum SoftWrap {
/// Prefer a single line generally, unless an overly long line is encountered.
@@ -333,7 +345,19 @@ pub struct LanguageSettingsContent {
}
/// Controls how whitespace should be displayedin the editor.
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema, MergeFrom)]
#[derive(
Copy,
Clone,
Debug,
Serialize,
Deserialize,
PartialEq,
Eq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum ShowWhitespaceSetting {
/// Draw whitespace only for the selected text.
@@ -268,7 +268,19 @@ pub struct GitSettings {
pub hunk_style: Option<GitHunkStyleSetting>,
}
#[derive(Clone, Copy, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[derive(
Clone,
Copy,
Debug,
PartialEq,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum GitGutterSetting {
/// Show git gutter in tracked files.
@@ -318,7 +330,7 @@ pub struct BlameSettings {
}
#[skip_serializing_none]
#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[derive(Clone, Copy, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[serde(rename_all = "snake_case")]
pub struct BranchPickerSettingsContent {
/// Whether to show author name as part of the commit information.
@@ -327,7 +339,19 @@ pub struct BranchPickerSettingsContent {
pub show_author_name: Option<bool>,
}
#[derive(Clone, Copy, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[derive(
Clone,
Copy,
PartialEq,
Debug,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum GitHunkStyleSetting {
/// Show unstaged hunks with a filled background and staged hunks hollow.
@@ -338,7 +362,7 @@ pub enum GitHunkStyleSetting {
}
#[skip_serializing_none]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[derive(Clone, Debug, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
pub struct DiagnosticsSettingsContent {
/// Whether to show the project diagnostics button in the status bar.
pub button: Option<bool>,
@@ -354,7 +378,9 @@ pub struct DiagnosticsSettingsContent {
}
#[skip_serializing_none]
#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)]
#[derive(
Clone, Copy, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq,
)]
pub struct LspPullDiagnosticsSettingsContent {
/// Whether to pull for diagnostics or not.
///
@@ -368,7 +394,9 @@ pub struct LspPullDiagnosticsSettingsContent {
}
#[skip_serializing_none]
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize, JsonSchema, MergeFrom, Eq)]
#[derive(
Clone, Copy, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Eq,
)]
pub struct InlineDiagnosticsSettingsContent {
/// Whether or not to show inline diagnostics
///
@@ -427,6 +455,8 @@ pub enum DirenvSettings {
Deserialize,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum DiagnosticSeverityContent {
@@ -301,7 +301,19 @@ impl VenvSettings {
}
}
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)]
#[derive(
Copy,
Clone,
Debug,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
PartialEq,
Eq,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum TerminalDockPosition {
Left,
+34 -1
View File
@@ -200,8 +200,37 @@ impl UiDensity {
#[serde(transparent)]
pub struct FontFamilyName(pub Arc<str>);
impl AsRef<str> for FontFamilyName {
fn as_ref(&self) -> &str {
&self.0
}
}
impl From<String> for FontFamilyName {
fn from(value: String) -> Self {
Self(Arc::from(value))
}
}
impl From<FontFamilyName> for String {
fn from(value: FontFamilyName) -> Self {
value.0.to_string()
}
}
/// The buffer's line height.
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom, Default)]
#[derive(
Clone,
Copy,
Debug,
Serialize,
Deserialize,
PartialEq,
JsonSchema,
MergeFrom,
Default,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum BufferLineHeight {
/// A less dense line height.
@@ -213,6 +242,10 @@ pub enum BufferLineHeight {
Custom(#[serde(deserialize_with = "deserialize_line_height")] f32),
}
impl strum::VariantArray for BufferLineHeight {
const VARIANTS: &'static [Self] = &[Self::Comfortable, Self::Standard];
}
fn deserialize_line_height<'de, D>(deserializer: D) -> Result<f32, D::Error>
where
D: serde::Deserializer<'de>,
@@ -156,7 +156,19 @@ pub struct PreviewTabsSettingsContent {
pub enable_preview_from_code_navigation: Option<bool>,
}
#[derive(Copy, Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[derive(
Copy,
Clone,
Debug,
PartialEq,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "lowercase")]
pub enum ClosePosition {
Left,
@@ -164,7 +176,19 @@ pub enum ClosePosition {
Right,
}
#[derive(Copy, Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[derive(
Copy,
Clone,
Debug,
PartialEq,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "lowercase")]
pub enum ShowCloseButton {
Always,
@@ -174,7 +198,18 @@ pub enum ShowCloseButton {
}
#[derive(
Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq,
Copy,
Clone,
Debug,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
PartialEq,
Eq,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum ShowDiagnostics {
@@ -184,7 +219,19 @@ pub enum ShowDiagnostics {
All,
}
#[derive(Copy, Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[derive(
Copy,
Clone,
Debug,
PartialEq,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum ActivateOnClose {
#[default]
@@ -212,7 +259,19 @@ pub struct ActivePanelModifiers {
pub inactive_opacity: Option<f32>,
}
#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, PartialEq, JsonSchema, MergeFrom)]
#[derive(
Copy,
Clone,
Debug,
Default,
Serialize,
Deserialize,
PartialEq,
JsonSchema,
MergeFrom,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum BottomDockLayout {
/// Contained between the left and right docks
@@ -226,7 +285,19 @@ pub enum BottomDockLayout {
RightAligned,
}
#[derive(Copy, Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)]
#[derive(
Copy,
Clone,
PartialEq,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
Debug,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum CloseWindowWhenNoItems {
/// Match platform conventions by default, so "on" on macOS and "off" everywhere else
@@ -249,7 +320,18 @@ impl CloseWindowWhenNoItems {
}
#[derive(
Copy, Clone, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug,
Copy,
Clone,
PartialEq,
Eq,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
Debug,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum RestoreOnStartupBehavior {
@@ -333,7 +415,19 @@ pub struct CenteredLayoutSettings {
pub right_padding: Option<f32>,
}
#[derive(Copy, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Debug)]
#[derive(
Copy,
Clone,
Default,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
PartialEq,
Debug,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum OnLastWindowClosed {
/// Match platform conventions by default, so don't quit on macOS, and quit on other platforms
+2
View File
@@ -49,6 +49,8 @@ impl RenderOnce for SettingsEditor {
if let Some(placeholder) = self.placeholder {
editor.set_placeholder_text(placeholder, window, cx);
}
// todo(settings_ui): We should have an observe global use for settings store
// so whenever a settings file is updated, the settings ui updates too
editor
}
});
File diff suppressed because it is too large Load Diff