diff --git a/crates/settings_ui/src/components.rs b/crates/settings_ui/src/components.rs index a29aae3bb1f2ef086e6d3289b03fbe29000d0f45..d424d96f273de131f65b0eae253f90bd52a21b08 100644 --- a/crates/settings_ui/src/components.rs +++ b/crates/settings_ui/src/components.rs @@ -62,10 +62,6 @@ impl RenderOnce for SettingsEditor { } }); - if let Some(tab_index) = self.tab_index { - editor.focus_handle(cx).tab_index(tab_index); - } - let weak_editor = editor.downgrade(); let theme_colors = cx.theme().colors(); @@ -78,6 +74,11 @@ impl RenderOnce for SettingsEditor { .border_1() .border_color(theme_colors.border) .bg(theme_colors.editor_background) + .when_some(self.tab_index, |this, tab_index| { + let focus_handle = editor.focus_handle(cx).tab_index(tab_index).tab_stop(true); + this.track_focus(&focus_handle) + .focus(|s| s.border_color(theme_colors.border_focused)) + }) .child(editor) .when_some(self.confirm, |this, confirm| { this.on_action::({ diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index ef3049ea20953c032714f4855a1b3da8a60a5434..9c1b3f2e561d420b7022a467b86f0368e2330bbd 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -1821,6 +1821,9 @@ impl SettingsWindow { .read(cx) .handle .contains_focused(window, cx) + || self + .visible_navbar_entries() + .any(|(_, entry)| entry.focus_handle.is_focused(window)) { "Focus Content" } else { @@ -2020,7 +2023,13 @@ impl SettingsWindow { .border_t_1() .border_color(cx.theme().colors().border_variant) .children( - KeyBinding::for_action(&ToggleFocusNav, window, cx).map(|this| { + KeyBinding::for_action_in( + &ToggleFocusNav, + &self.navbar_focus_handle.focus_handle(cx), + window, + cx, + ) + .map(|this| { KeybindingHint::new( this, cx.theme().colors().surface_background.opacity(0.5), @@ -2123,6 +2132,17 @@ impl SettingsWindow { .any(|(index, _)| index == nav_entry_index) } + fn focus_and_scroll_to_first_visible_nav_entry( + &self, + window: &mut Window, + cx: &mut Context, + ) { + if let Some(nav_entry_index) = self.visible_navbar_entries().next().map(|(index, _)| index) + { + self.focus_and_scroll_to_nav_entry(nav_entry_index, window, cx); + } + } + fn focus_and_scroll_to_nav_entry( &self, nav_entry_index: usize, @@ -2735,9 +2755,17 @@ impl Render for SettingsWindow { let prev_index = this.focused_file_index(window, cx).saturating_sub(1); this.focus_file_at_index(prev_index, window); })) - .on_action(|_: &menu::SelectNext, window, _| { - window.focus_next(); - }) + .on_action(cx.listener(|this, _: &menu::SelectNext, window, cx| { + if this + .search_bar + .focus_handle(cx) + .contains_focused(window, cx) + { + this.focus_and_scroll_to_first_visible_nav_entry(window, cx); + } else { + window.focus_next(); + } + })) .on_action(|_: &menu::SelectPrevious, window, _| { window.focus_prev(); })