History

settings_ui: Preserve selected nav entry when changing files (#39721)

Closes #ISSUE Release Notes: - N/A *or* Added/Fixed/Improved ...

Ben Kunkle committed 1 year ago

Commit cd679411 parent 669db621 file · +40 −1Browse files

Unified · Split

crates/settings_ui/src/settings_ui.rs+40−1
@@ -818,6 +818,24 @@ impl SettingsWindow { · 817 unmodified lines
818818 }
819819
820820 fn build_navbar(&mut self) {
821+ let mut prev_navbar_state = HashMap::new();
822+ let mut root_entry = "";
823+ let mut prev_selected_entry = None;
824+ for (index, entry) in self.navbar_entries.iter().enumerate() {
825+ let sub_entry_title;
826+ if entry.is_root {
827+ sub_entry_title = None;
828+ root_entry = entry.title;
829+ } else {
830+ sub_entry_title = Some(entry.title);
831+ }
832+ let key = (root_entry, sub_entry_title);
833+ if index == self.navbar_entry {
834+ prev_selected_entry = Some(key);
835+ }
836+ prev_navbar_state.insert(key, entry.expanded);
837+ }
838+
821839 let mut navbar_entries = Vec::with_capacity(self.navbar_entries.len());
822840 for (page_index, page) in self.pages.iter().enumerate() {
823841 navbar_entries.push(NavBarEntry {
@@ -841,6 +859,27 @@ impl SettingsWindow { · 17 unmodified lines
841859 });
842860 }
843861 }
862+
863+ let mut root_entry = "";
864+ let mut found_nav_entry = false;
865+ for (index, entry) in navbar_entries.iter_mut().enumerate() {
866+ let sub_entry_title;
867+ if entry.is_root {
868+ root_entry = entry.title;
869+ sub_entry_title = None;
870+ } else {
871+ sub_entry_title = Some(entry.title);
872+ };
873+ let key = (root_entry, sub_entry_title);
874+ if Some(key) == prev_selected_entry {
875+ self.navbar_entry = index;
876+ found_nav_entry = true;
877+ }
878+ entry.expanded = *prev_navbar_state.get(&key).unwrap_or(&false);
879+ }
880+ if !found_nav_entry {
881+ self.navbar_entry = 0;
882+ }
844883 self.navbar_entries = navbar_entries;
845884 }
846885
@@ -1046,7 +1085,7 @@ impl SettingsWindow { · 199 unmodified lines
10461085 return;
10471086 }
10481087 self.current_file = self.files[ix].0.clone();
1049− self.navbar_entry = 0;
1088+ // self.navbar_entry = 0;
10501089 self.build_ui(cx);
10511090 }
10521091