diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index 592e71bbf12f7a64dbb14dd6aa3d152b890b0121..2cd18d0a3da34f5fb6f42b84f14972d1eb9e0503 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -541,7 +541,6 @@ pub struct SettingsWindow { content_focus_handle: Entity, files_focus_handle: FocusHandle, search_index: Option>, - visible_items: Vec, list_state: ListState, } @@ -1074,7 +1073,6 @@ impl SettingsWindow { .tab_index(HEADER_CONTAINER_TAB_INDEX) .tab_stop(false), search_index: None, - visible_items: Vec::default(), list_state, }; @@ -1116,16 +1114,8 @@ impl SettingsWindow { let expanded = &mut self.navbar_entries[nav_entry_index].expanded; *expanded = !*expanded; - let expanded = *expanded; - - let toggle_page_index = self.page_index_from_navbar_index(nav_entry_index); - let selected_page_index = self.page_index_from_navbar_index(self.navbar_entry); - // if currently selected page is a child of the parent page we are folding, - // set the current page to the parent page - if !expanded && selected_page_index == toggle_page_index { - self.navbar_entry = nav_entry_index; - // note: not opening page. Toggling does not change content just selected page - } + self.navbar_entry = nav_entry_index; + self.reset_list_state(); } fn build_navbar(&mut self, cx: &App) { @@ -1480,14 +1470,14 @@ impl SettingsWindow { fn reset_list_state(&mut self) { // plus one for the title - self.visible_items = self.visible_page_items().map(|(index, _)| index).collect(); + let mut visible_items_count = self.visible_page_items().count(); - if self.visible_items.is_empty() { - self.list_state.reset(0); - } else { + if visible_items_count > 0 { // show page title if page is non empty - self.list_state.reset(self.visible_items.len() + 1); + visible_items_count += 1; } + + self.list_state.reset(visible_items_count); } fn build_ui(&mut self, window: &mut Window, cx: &mut Context) { @@ -1961,9 +1951,6 @@ impl SettingsWindow { .on_toggle(cx.listener( move |this, _, window, cx| { this.toggle_navbar_entry(ix); - // Update selection state immediately before cx.notify - // to prevent double selection flash - this.navbar_entry = ix; window.focus( &this.navbar_entries[ix].focus_handle, ); @@ -2134,7 +2121,7 @@ impl SettingsWindow { let mut page_content = v_flex().id("settings-ui-page").size_full(); let has_active_search = !self.search_bar.read(cx).is_empty(cx); - let has_no_results = self.visible_items.len() == 0 && has_active_search; + let has_no_results = self.visible_page_items().next().is_none() && has_active_search; if has_no_results { let search_query = self.search_bar.read(cx).text(cx); @@ -2153,16 +2140,12 @@ impl SettingsWindow { ), ) } else { - let items = &self.current_page().items; - let last_non_header_index = self - .visible_items - .iter() - .map(|index| &items[*index]) - .enumerate() - .rev() - .find(|(_, item)| !matches!(item, SettingsPageItem::SectionHeader(_))) - .map(|(index, _)| index); + .visible_page_items() + .filter_map(|(index, item)| { + (!matches!(item, SettingsPageItem::SectionHeader(_))).then_some(index) + }) + .last(); let root_nav_label = self .navbar_entries @@ -2184,20 +2167,16 @@ impl SettingsWindow { }) .into_any_element(); } + let mut visible_items = this.visible_page_items(); + let Some((actual_item_index, item)) = visible_items.nth(index - 1) else { + return gpui::Empty.into_any_element(); + }; - let index = index - 1; - let actual_item_index = this.visible_items[index]; - let item: &SettingsPageItem = &this.current_page().items[actual_item_index]; - - let no_bottom_border = this - .visible_items - .get(index + 1) - .map(|item_index| { - let item = &this.current_page().items[*item_index]; - matches!(item, SettingsPageItem::SectionHeader(_)) - }) + let no_bottom_border = visible_items + .next() + .map(|(_, item)| matches!(item, SettingsPageItem::SectionHeader(_))) .unwrap_or(false); - let is_last = Some(index) == last_non_header_index; + let is_last = Some(actual_item_index) == last_non_header_index; v_flex() .id(("settings-page-item", actual_item_index)) @@ -3073,7 +3052,6 @@ mod test { ), files_focus_handle: cx.focus_handle(), search_index: None, - visible_items: Vec::default(), list_state: ListState::new(0, gpui::ListAlignment::Top, px(0.0)), }; @@ -3231,11 +3209,11 @@ mod test { ", toggle_page: "General Page", after: r" - > General Page + > General Page* v Project - Worktree Settings Content v AI - - General* + - General > Appearance & Behavior " ); @@ -3254,13 +3232,13 @@ mod test { ", toggle_page: "General Page", after: r" - v General Page + v General Page* - General - Privacy v Project - Worktree Settings Content v AI - - General* + - General > Appearance & Behavior " );