diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index a129fcb56a48d8a7cea6454ecb7d77551f84954a..75d8cff1f9afe1cfd0f746f873bd3187a415c867 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -41,6 +41,22 @@ struct SettingField { pick_mut: fn(&mut SettingsContent) -> &mut Option, } +/// Helper for unimplemented settings, used in combination with `SettingField::unimplemented` +/// to keep the setting around in the UI with valid pick and pick_mut implementations, but don't actually try to render it. +/// TODO(settings_ui): In non-dev builds (`#[cfg(not(debug_assertions))]`) make this render as edit-in-json +struct UnimplementedSettingField; + +impl SettingField { + /// Helper for settings with types that are not yet implemented. + #[allow(unused)] + fn unimplemented(self) -> SettingField { + SettingField { + pick: |_| &None, + pick_mut: |_| unreachable!(), + } + } +} + trait AnySettingField { fn as_any(&self) -> &dyn Any; fn type_name(&self) -> &'static str; @@ -62,6 +78,10 @@ impl AnySettingField for SettingField { } fn file_set_in(&self, file: SettingsUiFile, cx: &App) -> settings::SettingsFile { + if AnySettingField::type_id(self) == TypeId::of::() { + return file.to_settings(); + } + let (file, _) = cx .global::() .get_value_from_file(file.to_settings(), self.pick); @@ -180,6 +200,17 @@ pub fn init(cx: &mut App) { fn init_renderers(cx: &mut App) { // fn (field: SettingsField, current_file: SettingsFile, cx) -> (currently_set_in: SettingsFile, overridden_in: Vec) cx.default_global::() + .add_renderer::(|_, _, _, _, _| { + // TODO(settings_ui): In non-dev builds (`#[cfg(not(debug_assertions))]`) make this render as edit-in-json + Button::new("unimplemented-field", "UNIMPLEMENTED") + .size(ButtonSize::Medium) + .icon(IconName::XCircle) + .icon_position(IconPosition::Start) + .icon_color(Color::Error) + .icon_size(IconSize::Small) + .style(ButtonStyle::Outlined) + .into_any_element() + }) .add_renderer::(|settings_field, file, _, _, cx| { render_toggle_button(*settings_field, file, cx).into_any_element() })