diff options
Diffstat (limited to 'src/history.rs')
-rw-r--r-- | src/history.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/history.rs b/src/history.rs index 42c5b0a..162c3bd 100644 --- a/src/history.rs +++ b/src/history.rs @@ -156,6 +156,8 @@ pub fn create_dirlist_with_history( ) -> io::Result<JoshutoDirList> { let filter_func = options.filter_func(); let mut contents = read_directory(path, filter_func, options)?; + + // re-use directory size information on reload for entry in contents.iter_mut() { if entry.metadata.is_dir() { if let Some(lst) = history.get(entry.file_path()) { @@ -164,6 +166,19 @@ pub fn create_dirlist_with_history( } } + // preserve selection status of entries on reload + if let Some(former_dir_list) = history.get(path) { + let former_entries_by_file_name = HashMap::<&str, &JoshutoDirEntry>::from_iter( + former_dir_list.contents.iter().map(|e| (e.file_name(), e)), + ); + for entry in contents.iter_mut() { + if let Some(former_entry) = former_entries_by_file_name.get(entry.file_name()) { + entry.set_permanent_selected(former_entry.is_permanent_selected()); + entry.set_visual_mode_selected(former_entry.is_visual_mode_selected()); + } + } + } + let sort_options = tab_options.sort_options_ref(); contents.sort_by(|f1, f2| sort_options.compare(f1, f2)); @@ -199,6 +214,20 @@ pub fn create_dirlist_with_history( None => 0, } }; + let visual_mode_anchor_index = match history.get(path) { + None => None, + Some(dirlist) => { + dirlist + .get_visual_mode_anchor_index() + .map(|old_visual_mode_anchor_index| { + if old_visual_mode_anchor_index < contents_len { + old_visual_mode_anchor_index + } else { + contents_len - 1 + } + }) + } + }; let metadata = JoshutoMetadata::from(path)?; let dirlist = JoshutoDirList::new( @@ -206,6 +235,7 @@ pub fn create_dirlist_with_history( contents, index, viewport_index, + visual_mode_anchor_index, metadata, ); |