diff --git a/examples/example.rs b/examples/example.rs index 20c58c1..df1ba17 100644 --- a/examples/example.rs +++ b/examples/example.rs @@ -91,11 +91,13 @@ fn run_app(terminal: &mut Terminal, mut app: App) -> io::Result<( if let Event::Key(key) = event::read()? { match key.code { KeyCode::Char('q') => return Ok(()), + KeyCode::Char('\n' | ' ') => app.tree.toggle(), KeyCode::Left => app.tree.left(), KeyCode::Right => app.tree.right(), - KeyCode::Char('\n') => app.tree.toggle(), KeyCode::Down => app.tree.down(), KeyCode::Up => app.tree.up(), + KeyCode::Home => app.tree.first(), + KeyCode::End => app.tree.last(), _ => {} } } diff --git a/examples/util/mod.rs b/examples/util/mod.rs index 69bf9f8..d022fe2 100644 --- a/examples/util/mod.rs +++ b/examples/util/mod.rs @@ -21,6 +21,14 @@ impl<'a> StatefulTree<'a> { } } + pub fn first(&mut self) { + self.state.select_first(); + } + + pub fn last(&mut self) { + self.state.select_last(&self.items); + } + pub fn down(&mut self) { self.state.key_down(&self.items); } diff --git a/src/lib.rs b/src/lib.rs index 224c227..5449d7c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -86,6 +86,21 @@ impl TreeState { self.opened.clear(); } + /// Select the first node. + pub fn select_first(&mut self) { + self.select(vec![0]); + } + + /// Select the last node. + pub fn select_last(&mut self, items: &[TreeItem]) { + let visible = flatten(&self.get_all_opened(), items); + let new_identifier = visible + .last() + .map(|o| o.identifier.clone()) + .unwrap_or_default(); + self.select(new_identifier); + } + /// Handles the up arrow key. /// Moves up in the current depth or to its parent. pub fn key_up(&mut self, items: &[TreeItem]) {