From 6f38dc965308ed9022dabfce8f859ed3be9ca22e Mon Sep 17 00:00:00 2001 From: kyoto7250 <50972773+kyoto7250@users.noreply.github.com> Date: Tue, 12 Apr 2022 14:13:48 +0900 Subject: [PATCH] adding offset for prevent panic panic reason is closure move in filterd_candidates if tui::ts PR merged, and component will not need to have offset flag @see: https://github.com/fdehau/tui-rs/pull/408 --- src/components/completion.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/completion.rs b/src/components/completion.rs index 848c355..3d944e3 100644 --- a/src/components/completion.rs +++ b/src/components/completion.rs @@ -19,6 +19,7 @@ const ALL_RESERVED_WORDS: &[&str] = &[ pub struct CompletionComponent { key_config: KeyConfig, state: ListState, + offset: bool, word: String, candidates: Vec, } @@ -37,13 +38,14 @@ impl CompletionComponent { .map(|w| w.to_string()) .collect() }, + offset: false, } } pub fn update(&mut self, word: impl Into) { self.word = word.into(); - self.state.select(None); - self.state.select(Some(0)) + self.state.select(Some(0)); + self.offset = false; } fn next(&mut self) { @@ -110,6 +112,7 @@ impl MovableComponent for CompletionComponent { .map(|c| ListItem::new(c.to_string())) .collect::>(); if candidates.clone().is_empty() { + self.offset = false; return Ok(()); } let candidate_list = List::new(candidates.clone()) @@ -126,6 +129,8 @@ impl MovableComponent for CompletionComponent { (candidates.len().min(5) as u16 + 2) .min(f.size().bottom().saturating_sub(area.y + y + 2)), ); + + self.offset = true; f.render_widget(Clear, area); f.render_stateful_widget(candidate_list, area, &mut self.state); } @@ -137,10 +142,10 @@ impl Component for CompletionComponent { fn commands(&self, _out: &mut Vec) {} fn event(&mut self, key: Key) -> Result { - if key == self.key_config.move_down { + if key == self.key_config.move_down && self.offset { self.next(); return Ok(EventState::Consumed); - } else if key == self.key_config.move_up { + } else if key == self.key_config.move_up && self.offset { self.previous(); return Ok(EventState::Consumed); }