settings_ui: Last minute cleanup (#40217)

Closes #ISSUE

Release Notes:

- N/A *or* Added/Fixed/Improved ...

---------

Co-authored-by: Mikayla <mikayla@zed.dev>
This commit is contained in:
Ben Kunkle
2025-10-14 23:51:03 +00:00
committed by GitHub
co-authored by Mikayla
parent 54df5812d9
commit 5c194f7cdc
8 changed files with 1000 additions and 466 deletions
+1 -1
View File
@@ -269,7 +269,7 @@ async fn test_first_line_pattern(cx: &mut TestAppContext) {
async fn test_language_for_file_with_custom_file_types(cx: &mut TestAppContext) {
cx.update(|cx| {
init_settings(cx, |settings| {
settings.file_types.extend([
settings.file_types.get_or_insert_default().extend([
("TypeScript".into(), vec!["js".into()].into()),
(
"JavaScript".into(),
+2 -1
View File
@@ -639,7 +639,7 @@ impl settings::Settings for AllLanguageSettings {
let mut file_types: FxHashMap<Arc<str>, GlobSet> = FxHashMap::default();
for (language, patterns) in &all_languages.file_types {
for (language, patterns) in all_languages.file_types.iter().flatten() {
let mut builder = GlobSetBuilder::new();
for pattern in &patterns.0 {
@@ -778,6 +778,7 @@ impl settings::Settings for AllLanguageSettings {
.project
.all_languages
.file_types
.get_or_insert_default()
.extend(associations);
// cursor global ignore list applies to cursor-tab, so transfer it to edit_predictions.disabled_globs
+41 -4
View File
@@ -234,7 +234,6 @@ impl UserSettingsContent {
Eq,
Default,
strum::VariantArray,
strum::VariantNames,
)]
pub enum BaseKeymapContent {
#[default]
@@ -248,6 +247,19 @@ pub enum BaseKeymapContent {
None,
}
impl strum::VariantNames for BaseKeymapContent {
const VARIANTS: &'static [&'static str] = &[
"VSCode",
"JetBrains",
"Sublime Text",
"Atom",
"TextMate",
"Emacs",
"Cursor",
"None",
];
}
#[skip_serializing_none]
#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)]
pub struct TitleBarSettingsContent {
@@ -502,7 +514,18 @@ pub struct GitPanelSettingsContent {
}
#[derive(
Default, Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq,
Default,
Copy,
Clone,
Debug,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
PartialEq,
Eq,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum StatusStyle {
@@ -512,7 +535,9 @@ pub enum StatusStyle {
}
#[skip_serializing_none]
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq)]
#[derive(
Copy, Clone, Default, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, PartialEq, Eq,
)]
pub struct ScrollbarSettings {
pub show: Option<ShowScrollbar>,
}
@@ -814,7 +839,19 @@ pub struct ImageViewerSettingsContent {
}
#[skip_serializing_none]
#[derive(Clone, Copy, Debug, Serialize, Deserialize, JsonSchema, MergeFrom, Default, PartialEq)]
#[derive(
Clone,
Copy,
Debug,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
Default,
PartialEq,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum ImageFileSizeUnit {
/// Displays file size in binary units (e.g., KiB, MiB).
+12 -1
View File
@@ -334,7 +334,18 @@ pub struct GutterContent {
/// How to render LSP `textDocument/documentColor` colors in the editor.
#[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 DocumentColorsRenderMode {
@@ -27,8 +27,7 @@ pub struct AllLanguageSettingsContent {
pub languages: LanguageToSettingsMap,
/// Settings for associating file extensions and filenames
/// with languages.
#[serde(default)]
pub file_types: HashMap<Arc<str>, ExtendingVec<String>>,
pub file_types: Option<HashMap<Arc<str>, ExtendingVec<String>>>,
}
impl merge_from::MergeFrom for AllLanguageSettingsContent {
@@ -12,7 +12,7 @@ use crate::{DockPosition, DockSide, ScrollbarSettingsContent, ShowIndentGuides};
#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
pub struct WorkspaceSettingsContent {
/// Active pane styling settings.
pub active_pane_modifiers: Option<ActivePanelModifiers>,
pub active_pane_modifiers: Option<ActivePaneModifiers>,
/// Layout mode for the bottom dock
///
/// Default: contained
@@ -243,7 +243,7 @@ pub enum ActivateOnClose {
#[skip_serializing_none]
#[derive(Copy, Clone, PartialEq, Debug, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
#[serde(rename_all = "snake_case")]
pub struct ActivePanelModifiers {
pub struct ActivePaneModifiers {
/// Size of the border surrounding the active pane.
/// When set to 0, the active pane doesn't have any border.
/// The border is drawn inset.
@@ -403,14 +403,38 @@ impl AutosaveSetting {
}
}
#[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 PaneSplitDirectionHorizontal {
Up,
Down,
}
#[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 PaneSplitDirectionVertical {
Left,
File diff suppressed because it is too large Load Diff
+34 -17
View File
@@ -1,4 +1,3 @@
//! # settings_ui
mod components;
mod page_data;
@@ -16,10 +15,7 @@ use heck::ToTitleCase as _;
use project::WorktreeId;
use schemars::JsonSchema;
use serde::Deserialize;
use settings::{
BottomDockLayout, CloseWindowWhenNoItems, CodeFade, CursorShape, OnLastWindowClosed,
RestoreOnStartupBehavior, SaturatingBool, SettingsContent, SettingsStore,
};
use settings::{SettingsContent, SettingsStore};
use std::{
any::{Any, TypeId, type_name},
cell::RefCell,
@@ -330,8 +326,10 @@ impl Focusable for NonFocusableHandle {
}
}
#[derive(Default)]
struct SettingsFieldMetadata {
placeholder: Option<&'static str>,
should_do_titlecase: Option<bool>,
}
pub struct SettingsUiFeatureFlag;
@@ -369,12 +367,12 @@ fn init_renderers(cx: &mut App) {
})
.add_basic_renderer::<bool>(render_toggle_button)
.add_basic_renderer::<String>(render_text_field)
.add_basic_renderer::<SaturatingBool>(render_toggle_button)
.add_basic_renderer::<CursorShape>(render_dropdown)
.add_basic_renderer::<RestoreOnStartupBehavior>(render_dropdown)
.add_basic_renderer::<BottomDockLayout>(render_dropdown)
.add_basic_renderer::<OnLastWindowClosed>(render_dropdown)
.add_basic_renderer::<CloseWindowWhenNoItems>(render_dropdown)
.add_basic_renderer::<settings::SaturatingBool>(render_toggle_button)
.add_basic_renderer::<settings::CursorShape>(render_dropdown)
.add_basic_renderer::<settings::RestoreOnStartupBehavior>(render_dropdown)
.add_basic_renderer::<settings::BottomDockLayout>(render_dropdown)
.add_basic_renderer::<settings::OnLastWindowClosed>(render_dropdown)
.add_basic_renderer::<settings::CloseWindowWhenNoItems>(render_dropdown)
.add_basic_renderer::<settings::FontFamilyName>(render_font_picker)
// todo(settings_ui): This needs custom ui
// .add_renderer::<settings::BufferLineHeight>(|settings_field, file, _, window, cx| {
@@ -421,7 +419,7 @@ fn init_renderers(cx: &mut App) {
.add_basic_renderer::<usize>(render_number_field)
.add_basic_renderer::<NonZero<usize>>(render_number_field)
.add_basic_renderer::<NonZeroU32>(render_number_field)
.add_basic_renderer::<CodeFade>(render_number_field)
.add_basic_renderer::<settings::CodeFade>(render_number_field)
.add_basic_renderer::<FontWeight>(render_number_field)
.add_basic_renderer::<settings::MinimumContrast>(render_number_field)
.add_basic_renderer::<settings::ShowScrollbar>(render_dropdown)
@@ -431,7 +429,15 @@ fn init_renderers(cx: &mut App) {
.add_basic_renderer::<settings::MinimapThumb>(render_dropdown)
.add_basic_renderer::<settings::MinimapThumbBorder>(render_dropdown)
.add_basic_renderer::<settings::SteppingGranularity>(render_dropdown)
.add_basic_renderer::<settings::NotifyWhenAgentWaiting>(render_dropdown);
.add_basic_renderer::<settings::NotifyWhenAgentWaiting>(render_dropdown)
.add_basic_renderer::<settings::ImageFileSizeUnit>(render_dropdown)
.add_basic_renderer::<settings::StatusStyle>(render_dropdown)
.add_basic_renderer::<settings::PaneSplitDirectionHorizontal>(render_dropdown)
.add_basic_renderer::<settings::PaneSplitDirectionVertical>(render_dropdown)
.add_basic_renderer::<settings::PaneSplitDirectionVertical>(render_dropdown)
.add_basic_renderer::<settings::DocumentColorsRenderMode>(render_dropdown)
// please semicolon stay on next line
;
// .add_renderer::<ThemeSelection>(|settings_field, file, _, window, cx| {
// render_dropdown(*settings_field, file, window, cx)
// });
@@ -1913,7 +1919,7 @@ impl SettingsWindow {
return;
};
self.page_scroll_handle
.scroll_to_top_of_item(selected_item_index);
.scroll_to_top_of_item(selected_item_index + 1);
if focus_content {
self.focus_content_element(entry_item_index, window, cx);
@@ -2606,7 +2612,7 @@ fn render_number_field<T: NumberFieldType + Send + Sync>(
fn render_dropdown<T>(
field: SettingField<T>,
file: SettingsUiFile,
_metadata: Option<&SettingsFieldMetadata>,
metadata: Option<&SettingsFieldMetadata>,
window: &mut Window,
cx: &mut App,
) -> AnyElement
@@ -2615,6 +2621,9 @@ where
{
let variants = || -> &'static [T] { <T as strum::VariantArray>::VARIANTS };
let labels = || -> &'static [&'static str] { <T as strum::VariantNames>::VARIANTS };
let should_do_titlecase = metadata
.and_then(|metadata| metadata.should_do_titlecase)
.unwrap_or(true);
let (_, current_value) =
SettingsStore::global(cx).get_value_from_file(file.to_settings(), field.pick);
@@ -2625,12 +2634,20 @@ where
DropdownMenu::new(
"dropdown",
current_value_label.to_title_case(),
if should_do_titlecase {
current_value_label.to_title_case()
} else {
current_value_label.to_string()
},
ContextMenu::build(window, cx, move |mut menu, _, _| {
for (&value, &label) in std::iter::zip(variants(), labels()) {
let file = file.clone();
menu = menu.toggleable_entry(
label.to_title_case(),
if should_do_titlecase {
label.to_title_case()
} else {
label.to_string()
},
value == current_value,
IconPosition::End,
None,