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); }