added move_up
parent
44e138d39e
commit
d101367e34
|
@ -220,6 +220,37 @@ impl Directory {
|
|||
self.selection += u16::try_from(sibling_len).unwrap_or(u16::MAX);
|
||||
}
|
||||
|
||||
fn move_up(&mut self) {
|
||||
let current_depth = self.selected().depth;
|
||||
|
||||
let Some(index) = (0 .. self.selection())
|
||||
.rev()
|
||||
.take_while(|&i| self.dirs[i].depth >= current_depth)
|
||||
.filter(|&i| self.dirs[i].depth == current_depth)
|
||||
.next()
|
||||
else {
|
||||
return
|
||||
};
|
||||
|
||||
let selected_subtree = self.subtree_indices(self.selection());
|
||||
let sibling_subtree = self.subtree_indices(index);
|
||||
|
||||
let select_len = selected_subtree.len();
|
||||
let sibling_len = sibling_subtree.len();
|
||||
|
||||
let selected_copy = self.dirs[selected_subtree].to_owned();
|
||||
let sibling_copy = self.dirs[sibling_subtree].to_owned();
|
||||
let back_to_back = selected_copy.into_iter().chain(sibling_copy);
|
||||
|
||||
let full_range = index .. index+select_len+sibling_len;
|
||||
for (dst, item) in self.dirs[full_range].iter_mut().zip(back_to_back) {
|
||||
*dst = item;
|
||||
}
|
||||
|
||||
self.selection -= u16::try_from(sibling_len).unwrap_or(u16::MAX);
|
||||
|
||||
}
|
||||
|
||||
fn selected(&self) -> &Item {
|
||||
&self.dirs[self.selection()]
|
||||
}
|
||||
|
@ -316,6 +347,9 @@ impl Directory {
|
|||
},
|
||||
KeyCode::Down => {
|
||||
self.move_down();
|
||||
},
|
||||
KeyCode::Up => {
|
||||
self.move_up();
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue