diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index 6999a754e5b7f1c27ff9d05c9aaf29494f93a750..d5b71f4211175fa640dbe64dcff6f898f38d44a8 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -818,6 +818,24 @@ impl SettingsWindow { } fn build_navbar(&mut self) { + let mut prev_navbar_state = HashMap::new(); + let mut root_entry = ""; + let mut prev_selected_entry = None; + for (index, entry) in self.navbar_entries.iter().enumerate() { + let sub_entry_title; + if entry.is_root { + sub_entry_title = None; + root_entry = entry.title; + } else { + sub_entry_title = Some(entry.title); + } + let key = (root_entry, sub_entry_title); + if index == self.navbar_entry { + prev_selected_entry = Some(key); + } + prev_navbar_state.insert(key, entry.expanded); + } + let mut navbar_entries = Vec::with_capacity(self.navbar_entries.len()); for (page_index, page) in self.pages.iter().enumerate() { navbar_entries.push(NavBarEntry { @@ -841,6 +859,27 @@ impl SettingsWindow { }); } } + + let mut root_entry = ""; + let mut found_nav_entry = false; + for (index, entry) in navbar_entries.iter_mut().enumerate() { + let sub_entry_title; + if entry.is_root { + root_entry = entry.title; + sub_entry_title = None; + } else { + sub_entry_title = Some(entry.title); + }; + let key = (root_entry, sub_entry_title); + if Some(key) == prev_selected_entry { + self.navbar_entry = index; + found_nav_entry = true; + } + entry.expanded = *prev_navbar_state.get(&key).unwrap_or(&false); + } + if !found_nav_entry { + self.navbar_entry = 0; + } self.navbar_entries = navbar_entries; } @@ -1046,7 +1085,7 @@ impl SettingsWindow { return; } self.current_file = self.files[ix].0.clone(); - self.navbar_entry = 0; + // self.navbar_entry = 0; self.build_ui(cx); }