From d101367e34d60e5a5961b1b1bd459d1c29356f6b Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 10 Oct 2024 13:14:08 -0400 Subject: [PATCH] added move_up --- src/directory.rs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/directory.rs b/src/directory.rs index 6aae855..28f191a 100644 --- a/src/directory.rs +++ b/src/directory.rs @@ -216,10 +216,41 @@ impl Directory { 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 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(); } _ => (), }