Implement the unimplemented setting (#39747)

Mikayla Maki created

Release Notes:

- N/A

Change summary

crates/settings_ui/src/settings_ui.rs | 30 +++++++++++++++++-----------
1 file changed, 18 insertions(+), 12 deletions(-)

Detailed changes

crates/settings_ui/src/settings_ui.rs 🔗

@@ -55,7 +55,9 @@ actions!(
         /// Focuses the next file in the file list.
         FocusNextFile,
         /// Focuses the previous file in the file list.
-        FocusPreviousFile
+        FocusPreviousFile,
+        /// Opens an editor for the current file
+        OpenCurrentFile,
     ]
 );
 
@@ -239,20 +241,14 @@ 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<SettingsFile>)
     cx.default_global::<SettingFieldRenderer>()
         .add_renderer::<UnimplementedSettingField>(|_, _, _, _, _| {
-            // 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)
+            Button::new("open-in-settings-file", "Edit in settings.json")
+                .size(ButtonSize::Default)
                 .style(ButtonStyle::Outlined)
-                .tooltip(Tooltip::text(
-                    "This warning is only displayed in dev builds.",
-                ))
+                .on_click(|_, window, cx| {
+                    window.dispatch_action(Box::new(OpenCurrentFile), cx);
+                })
                 .into_any_element()
         })
         .add_renderer::<bool>(|settings_field, file, _, _, cx| {
@@ -792,6 +788,10 @@ enum SettingsUiFile {
 }
 
 impl SettingsUiFile {
+    fn is_server(&self) -> bool {
+        matches!(self, SettingsUiFile::Server(_))
+    }
+
     fn worktree_id(&self) -> Option<WorktreeId> {
         match self {
             SettingsUiFile::User => None,
@@ -1176,6 +1176,9 @@ impl SettingsWindow {
             let Some(settings_ui_file) = SettingsUiFile::from_settings(file) else {
                 continue;
             };
+            if settings_ui_file.is_server() {
+                continue;
+            }
 
             if let Some(worktree_id) = settings_ui_file.worktree_id() {
                 let directory_name = all_projects(cx)
@@ -1798,6 +1801,9 @@ impl Render for SettingsWindow {
             .id("settings-window")
             .key_context("SettingsWindow")
             .track_focus(&self.focus_handle)
+            .on_action(cx.listener(|this, _: &OpenCurrentFile, _, cx| {
+                this.open_current_settings_file(cx);
+            }))
             .on_action(|_: &Minimize, window, _cx| {
                 window.minimize_window();
             })