summaryrefslogtreecommitdiffstats
path: root/src/listview.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2020-02-15 15:59:31 +0100
committerrabite <rabite@posteo.de>2020-02-15 21:04:32 +0100
commitcf2d04c04baf3fd4cdef9e5c0289ba1dd9959b50 (patch)
tree1186a0a6edfaa4a6fb688909b180fccdef29a057 /src/listview.rs
parentd1e9acd09960dc8020363200136d389cc1a7acca (diff)
lowered cpu usage while browsing using binary search
Diffstat (limited to 'src/listview.rs')
-rw-r--r--src/listview.rs41
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()
}