From 8ab2d44d5393d2966562bacd7d642a4b4effaf14 Mon Sep 17 00:00:00 2001 From: sebashwa Date: Mon, 23 May 2022 07:40:42 +0200 Subject: [PATCH] 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). --- src/components/databases.rs | 77 ++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/src/components/databases.rs b/src/components/databases.rs index 218ec48..9e357ef 100644 --- a/src/components/databases.rs +++ b/src/components/databases.rs @@ -36,7 +36,7 @@ pub enum Focus { pub struct DatabasesComponent { tree: DatabaseTree, filter: DatabaseFilterComponent, - filterd_tree: Option, + filtered_tree: Option, scroll: VerticalScroll, focus: Focus, key_config: KeyConfig, @@ -47,7 +47,7 @@ impl DatabasesComponent { Self { tree: DatabaseTree::default(), filter: DatabaseFilterComponent::new(), - filterd_tree: None, + filtered_tree: None, scroll: VerticalScroll::new(false, false), focus: Focus::Tree, key_config, @@ -63,7 +63,7 @@ impl DatabasesComponent { None => pool.get_databases().await?, }; self.tree = DatabaseTree::new(databases.as_slice(), &BTreeSet::new())?; - self.filterd_tree = None; + self.filtered_tree = None; self.filter.reset(); Ok(()) } @@ -73,7 +73,7 @@ impl DatabasesComponent { } 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( @@ -168,10 +168,9 @@ impl DatabasesComponent { .draw(f, chunks[0], matches!(self.focus, Focus::Filter))?; let tree_height = chunks[1].height as usize; - let tree = if let Some(tree) = self.filterd_tree.as_ref() { - tree - } else { - &self.tree + let tree = match self.filtered_tree.as_ref() { + Some(t) => t, + None => &self.tree, }; tree.visual_selection().map_or_else( || { @@ -223,40 +222,40 @@ impl Component for DatabasesComponent { } fn event(&mut self, key: Key) -> Result { - if key == self.key_config.filter && self.focus == Focus::Tree { - self.focus = Focus::Filter; - return Ok(EventState::Consumed); - } - if matches!(self.focus, Focus::Filter) { - self.filterd_tree = if self.filter.input.value_str().is_empty() { - None - } else { - 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() { + match key { + Key::Enter => { + self.focus = Focus::Tree; 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 => { - if tree_nav( - if let Some(tree) = self.filterd_tree.as_mut() { - tree - } else { - &mut self.tree - }, - key, - &self.key_config, - ) { - return Ok(EventState::Consumed); + } else if matches!(self.focus, Focus::Tree) { + match key { + key => { + if key == self.key_config.filter { + 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) { + return Ok(EventState::Consumed); + } } } } @@ -376,7 +375,7 @@ mod test { } #[test] - fn test_filterd_tree_item_to_span() { + fn test_filtered_tree_item_to_span() { const WIDTH: u16 = 10; assert_eq!( DatabasesComponent::tree_item_to_span(