Allow database tree navigation while filtering

This makes UX much smoother IMHO.
The filter focus is now moved back to the tree by pressing <Esc> while
in filtering mode.
pull/154/head
sebashwa 2 years ago
parent fff86b95d1
commit dc9d7fd44f

@ -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

@ -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<EventState> {
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};

Loading…
Cancel
Save