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 1/2] 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); } From b1da623a224acdee74da5b5eb19e7e7e2643056b Mon Sep 17 00:00:00 2001 From: kyoto7250 <50972773+kyoto7250@users.noreply.github.com> Date: Fri, 15 Apr 2022 11:12:27 +0900 Subject: [PATCH 2/2] change flag name: offset -> is_empty --- src/components/completion.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/completion.rs b/src/components/completion.rs index 3d944e3..1164501 100644 --- a/src/components/completion.rs +++ b/src/components/completion.rs @@ -19,7 +19,7 @@ const ALL_RESERVED_WORDS: &[&str] = &[ pub struct CompletionComponent { key_config: KeyConfig, state: ListState, - offset: bool, + is_empty: bool, word: String, candidates: Vec, } @@ -38,14 +38,14 @@ impl CompletionComponent { .map(|w| w.to_string()) .collect() }, - offset: false, + is_empty: true, } } pub fn update(&mut self, word: impl Into) { self.word = word.into(); self.state.select(Some(0)); - self.offset = false; + self.is_empty = true; } fn next(&mut self) { @@ -112,8 +112,10 @@ impl MovableComponent for CompletionComponent { .map(|c| ListItem::new(c.to_string())) .collect::>(); if candidates.clone().is_empty() { - self.offset = false; + self.is_empty = true; return Ok(()); + } else { + self.is_empty = false; } let candidate_list = List::new(candidates.clone()) .block(Block::default().borders(Borders::ALL)) @@ -129,8 +131,6 @@ 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); } @@ -142,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 && self.offset { + if key == self.key_config.move_down && !self.is_empty { self.next(); return Ok(EventState::Consumed); - } else if key == self.key_config.move_up && self.offset { + } else if key == self.key_config.move_up && !self.is_empty { self.previous(); return Ok(EventState::Consumed); }