diff options
author | rabite <rabite@posteo.de> | 2020-02-15 15:59:31 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2020-02-15 21:04:32 +0100 |
commit | cf2d04c04baf3fd4cdef9e5c0289ba1dd9959b50 (patch) | |
tree | 1186a0a6edfaa4a6fb688909b180fccdef29a057 /src/listview.rs | |
parent | d1e9acd09960dc8020363200136d389cc1a7acca (diff) |
lowered cpu usage while browsing using binary search
Diffstat (limited to 'src/listview.rs')
-rw-r--r-- | src/listview.rs | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/src/listview.rs b/src/listview.rs index 7cddfbf..3a40289 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -52,7 +52,7 @@ impl Acting for ListView<Files> { } if pos != self.get_selection() { - self.update_selected_file(); + self.update_selected_file(pos); } Ok(()) @@ -82,7 +82,7 @@ impl Acting for ListView<Files> { } if pos != self.get_selection() { - self.update_selected_file(); + self.update_selected_file(pos); } Ok(()) @@ -357,15 +357,26 @@ impl ListView<Files> FileListBuilder::new(core, source) } - pub fn update_selected_file(&mut self) { - let pos = self.selection; + pub fn update_selected_file(&mut self, oldpos: usize) { + let newpos = self.get_selection(); + let skip = + match newpos > oldpos { + true => newpos - oldpos, + false => 0 + }; + + let seek_back = + match newpos < oldpos { + true => oldpos - newpos, + false => 0 + }; let file = self.content - .iter_files() - .nth(pos) - .map(|f| f.clone()); + .iter_files_from(self.selected_file(), seek_back) + .skip(skip) + .nth(0); - self.current_item = file; + self.current_item = file.cloned(); } pub fn selected_file(&self) -> &File { @@ -376,11 +387,11 @@ impl ListView<Files> } pub fn selected_file_mut(&mut self) -> &mut File { - let selection = self.selection; + let selected_file = self.selected_file().clone(); let file = self.content - .iter_files_mut() - .nth(selection) + .iter_files_mut_from(&selected_file, 0) + .nth(0) .map(|f| f as *mut File); @@ -838,12 +849,12 @@ impl ListView<Files> fn render(&self) -> Vec<String> { let render_fn = self.render_line_fn(); let ysize = self.get_coordinates().unwrap().ysize_u(); + let files_above_selection = self.get_selection() - self.offset; + let selected_file = self.selected_file(); + self.content - .iter_files() - .skip(self.offset) + .iter_files_from(selected_file, files_above_selection) .take(ysize+1) - // .collect::<Vec<_>>() - // .into_par_iter() .map(|file| render_fn(file)) .collect() } |