From dc9d7fd44ffc59c50aa2c3f0fe011d1b2a2d38bc Mon Sep 17 00:00:00 2001 From: sebashwa Date: Mon, 23 May 2022 09:37:15 +0200 Subject: [PATCH] Allow database tree navigation while filtering This makes UX much smoother IMHO. The filter focus is now moved back to the tree by pressing while in filtering mode. --- src/app.rs | 2 +- src/components/databases.rs | 41 +++++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/app.rs b/src/app.rs index 55431af..f29646d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -223,7 +223,7 @@ impl App { return Ok(EventState::Consumed); } - if key == self.config.key_config.enter && self.databases.tree_focused() { + if key == self.config.key_config.enter { if let Some((database, table)) = self.databases.tree().selected_table() { self.record_table.reset(); let (headers, records) = self diff --git a/src/components/databases.rs b/src/components/databases.rs index 9e357ef..171e9e8 100644 --- a/src/components/databases.rs +++ b/src/components/databases.rs @@ -9,7 +9,7 @@ use crate::event::Key; use crate::ui::common_nav; use crate::ui::scrolllist::draw_list_block; use anyhow::Result; -use database_tree::{Database, DatabaseTree, DatabaseTreeItem}; +use database_tree::{Database, DatabaseTree, DatabaseTreeItem, MoveSelection}; use std::collections::BTreeSet; use std::convert::From; use tui::{ @@ -76,6 +76,21 @@ impl DatabasesComponent { self.filtered_tree.as_ref().unwrap_or(&self.tree) } + fn navigate_tree(&mut self, nav: MoveSelection) -> bool { + let tree = match self.filtered_tree.as_mut() { + Some(t) => t, + None => &mut self.tree, + }; + tree.move_selection(nav) + } + + fn maybe_navigate_tree(&mut self, key: Key) -> bool { + match common_nav(key, &self.key_config) { + Some(nav) => self.navigate_tree(nav), + None => false, + } + } + fn tree_item_to_span( item: DatabaseTreeItem, selected: bool, @@ -224,10 +239,18 @@ impl Component for DatabasesComponent { fn event(&mut self, key: Key) -> Result { if matches!(self.focus, Focus::Filter) { match key { - Key::Enter => { + Key::Esc => { self.focus = Focus::Tree; return Ok(EventState::Consumed); } + Key::Ctrl('j') | Key::Ctrl('n') => { + self.navigate_tree(MoveSelection::Down); + return Ok(EventState::Consumed); + } + Key::Ctrl('k') | Key::Ctrl('p') => { + self.navigate_tree(MoveSelection::Up); + return Ok(EventState::Consumed); + } key => { if self.filter.event(key)?.is_consumed() { let filter_str = self.filter.input.value_str(); @@ -248,12 +271,8 @@ impl Component for DatabasesComponent { self.focus = Focus::Filter; return Ok(EventState::Consumed); } - let tree_for_nav = match self.filtered_tree.as_mut() { - Some(tree) => tree, - None => &mut self.tree, - }; - if tree_nav(tree_for_nav, key, &self.key_config) { + if self.maybe_navigate_tree(key) { return Ok(EventState::Consumed); } } @@ -263,14 +282,6 @@ impl Component for DatabasesComponent { } } -fn tree_nav(tree: &mut DatabaseTree, key: Key, key_config: &KeyConfig) -> bool { - if let Some(common_nav) = common_nav(key, key_config) { - tree.move_selection(common_nav) - } else { - false - } -} - #[cfg(test)] mod test { use super::{Color, Database, DatabaseTreeItem, DatabasesComponent, Span, Spans, Style};