Update database tree directly after filter change

The database tree was updated for the filter string of the previous key
press before. This became more apparent with the new movements like
'delete word' (Ctrl-w).
pull/154/head
sebashwa 2 years ago
parent 221d10ee91
commit 8ab2d44d53

@ -36,7 +36,7 @@ pub enum Focus {
pub struct DatabasesComponent { pub struct DatabasesComponent {
tree: DatabaseTree, tree: DatabaseTree,
filter: DatabaseFilterComponent, filter: DatabaseFilterComponent,
filterd_tree: Option<DatabaseTree>, filtered_tree: Option<DatabaseTree>,
scroll: VerticalScroll, scroll: VerticalScroll,
focus: Focus, focus: Focus,
key_config: KeyConfig, key_config: KeyConfig,
@ -47,7 +47,7 @@ impl DatabasesComponent {
Self { Self {
tree: DatabaseTree::default(), tree: DatabaseTree::default(),
filter: DatabaseFilterComponent::new(), filter: DatabaseFilterComponent::new(),
filterd_tree: None, filtered_tree: None,
scroll: VerticalScroll::new(false, false), scroll: VerticalScroll::new(false, false),
focus: Focus::Tree, focus: Focus::Tree,
key_config, key_config,
@ -63,7 +63,7 @@ impl DatabasesComponent {
None => pool.get_databases().await?, None => pool.get_databases().await?,
}; };
self.tree = DatabaseTree::new(databases.as_slice(), &BTreeSet::new())?; self.tree = DatabaseTree::new(databases.as_slice(), &BTreeSet::new())?;
self.filterd_tree = None; self.filtered_tree = None;
self.filter.reset(); self.filter.reset();
Ok(()) Ok(())
} }
@ -73,7 +73,7 @@ impl DatabasesComponent {
} }
pub fn tree(&self) -> &DatabaseTree { pub fn tree(&self) -> &DatabaseTree {
self.filterd_tree.as_ref().unwrap_or(&self.tree) self.filtered_tree.as_ref().unwrap_or(&self.tree)
} }
fn tree_item_to_span( fn tree_item_to_span(
@ -168,10 +168,9 @@ impl DatabasesComponent {
.draw(f, chunks[0], matches!(self.focus, Focus::Filter))?; .draw(f, chunks[0], matches!(self.focus, Focus::Filter))?;
let tree_height = chunks[1].height as usize; let tree_height = chunks[1].height as usize;
let tree = if let Some(tree) = self.filterd_tree.as_ref() { let tree = match self.filtered_tree.as_ref() {
tree Some(t) => t,
} else { None => &self.tree,
&self.tree
}; };
tree.visual_selection().map_or_else( tree.visual_selection().map_or_else(
|| { || {
@ -223,40 +222,40 @@ impl Component for DatabasesComponent {
} }
fn event(&mut self, key: Key) -> Result<EventState> { fn event(&mut self, key: Key) -> Result<EventState> {
if key == self.key_config.filter && self.focus == Focus::Tree {
self.focus = Focus::Filter;
return Ok(EventState::Consumed);
}
if matches!(self.focus, Focus::Filter) { if matches!(self.focus, Focus::Filter) {
self.filterd_tree = if self.filter.input.value_str().is_empty() { match key {
None Key::Enter => {
} else { self.focus = Focus::Tree;
Some(self.tree.filter(self.filter.input.value_str()))
};
}
match key {
Key::Enter if matches!(self.focus, Focus::Filter) => {
self.focus = Focus::Tree;
return Ok(EventState::Consumed);
}
key if matches!(self.focus, Focus::Filter) => {
if self.filter.event(key)?.is_consumed() {
return Ok(EventState::Consumed); return Ok(EventState::Consumed);
} }
key => {
if self.filter.event(key)?.is_consumed() {
let filter_str = self.filter.input.value_str();
self.filtered_tree = if filter_str.is_empty() {
None
} else {
Some(self.tree.filter(filter_str))
};
return Ok(EventState::Consumed);
}
}
} }
key => { } else if matches!(self.focus, Focus::Tree) {
if tree_nav( match key {
if let Some(tree) = self.filterd_tree.as_mut() { key => {
tree if key == self.key_config.filter {
} else { self.focus = Focus::Filter;
&mut self.tree return Ok(EventState::Consumed);
}, }
key, let tree_for_nav = match self.filtered_tree.as_mut() {
&self.key_config, Some(tree) => tree,
) { None => &mut self.tree,
return Ok(EventState::Consumed); };
if tree_nav(tree_for_nav, key, &self.key_config) {
return Ok(EventState::Consumed);
}
} }
} }
} }
@ -376,7 +375,7 @@ mod test {
} }
#[test] #[test]
fn test_filterd_tree_item_to_span() { fn test_filtered_tree_item_to_span() {
const WIDTH: u16 = 10; const WIDTH: u16 = 10;
assert_eq!( assert_eq!(
DatabasesComponent::tree_item_to_span( DatabasesComponent::tree_item_to_span(

Loading…
Cancel
Save