diff options
author | rabite <rabite@posteo.de> | 2019-12-20 22:07:38 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-12-20 22:07:38 +0100 |
commit | 03693f96d0265f665ec00b5bb204cb727d7b137a (patch) | |
tree | 0e9e7f01e7eaff33f764c76a3a09c0fc84f02d60 /src/listview.rs | |
parent | 0525f37c6964e43cc82dd548bd7ac460c7c84601 (diff) |
improved Files interface by returning Iterator instead of Vec<&File>
Diffstat (limited to 'src/listview.rs')
-rw-r--r-- | src/listview.rs | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/src/listview.rs b/src/listview.rs index 53cbff6..f44a705 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -222,14 +222,31 @@ impl ListView<Files> { pub fn selected_file(&self) -> &File { let selection = self.selection; - let file = &self.content.get_files()[selection]; - file + + &self.content + .iter_files() + .nth(selection) + .unwrap_or(&self.content.directory) } pub fn selected_file_mut(&mut self) -> &mut File { let selection = self.selection; - let file = self.content.get_file_mut(selection); - file.unwrap() + + let file = self.content + .iter_files_mut() + .nth(selection) + .map(|f| f as *mut File); + + + // Work around annoying restriction until polonius borrow checker becomes default + // Since we only ever return one mutable borrow this is perfectly safe + // See also: https://github.com/rust-lang/rust/issues/21906 + match file { + Some(file) => unsafe { return file.as_mut().unwrap() }, + None => { + &mut self.content.directory + } + } } pub fn clone_selected_file(&self) -> File { @@ -271,9 +288,8 @@ impl ListView<Files> pub fn select_file(&mut self, file: &File) { let pos = self .content - .get_files() - .iter() - .position(|item| item == &file) + .iter_files() + .position(|item| item == file) .unwrap_or(0); self.set_selection(pos); } @@ -308,7 +324,7 @@ impl ListView<Files> self.select_file(&file); - if self.seeking == false || self.selection + 1 == self.content.len() { + if self.seeking == false || self.selection + 1 >= self.content.len() { self.selection = 0; self.offset = 0; } else { @@ -390,7 +406,7 @@ impl ListView<Files> } pub fn invert_selection(&mut self) { - for file in self.content.get_files_mut() { + for file in self.content.iter_files_mut() { file.toggle_selection(); } @@ -404,7 +420,7 @@ impl ListView<Files> } pub fn clear_selections(&mut self) { - for file in self.content.get_files_mut() { + for file in self.content.iter_files_mut() { file.selected = false; } self.content.set_dirty(); @@ -632,9 +648,8 @@ impl ListView<Files> fn render(&self) -> Vec<String> { self.content - .get_files() - .iter() - .map(|file| self.render_line(&file)) + .iter_files() + .map(|file| self.render_line(file)) .collect() } } |