Allow moving backwards in completions

This commit is contained in:
Kevin Sjöberg 2021-06-05 23:20:34 +02:00 committed by Blaž Hrastnik
parent 145bc1970a
commit a4ff8cdd8a

View file

@ -28,6 +28,11 @@ pub enum PromptEvent {
Abort, Abort,
} }
pub enum CompletionDirection {
Forward,
Backward,
}
impl Prompt { impl Prompt {
pub fn new( pub fn new(
prompt: String, prompt: String,
@ -80,11 +85,20 @@ impl Prompt {
self.exit_selection(); self.exit_selection();
} }
pub fn change_completion_selection(&mut self) { pub fn change_completion_selection(&mut self, direction: CompletionDirection) {
if self.completion.is_empty() { if self.completion.is_empty() {
return; return;
} }
let index = self.selection.map_or(0, |i| i + 1) % self.completion.len();
let index = match direction {
CompletionDirection::Forward => {
self.selection.map_or(0, |i| i + 1) % self.completion.len()
}
CompletionDirection::Backward => {
(self.selection.unwrap_or(0) + self.completion.len() - 1) % self.completion.len()
}
};
self.selection = Some(index); self.selection = Some(index);
let (range, item) = &self.completion[index]; let (range, item) = &self.completion[index];
@ -92,8 +106,8 @@ impl Prompt {
self.line.replace_range(range.clone(), item); self.line.replace_range(range.clone(), item);
self.move_end(); self.move_end();
// TODO: recalculate completion when completion item is accepted, (Enter)
} }
pub fn exit_selection(&mut self) { pub fn exit_selection(&mut self) {
self.selection = None; self.selection = None;
} }
@ -263,7 +277,11 @@ impl Component for Prompt {
} }
KeyEvent { KeyEvent {
code: KeyCode::Tab, .. code: KeyCode::Tab, ..
} => self.change_completion_selection(), } => self.change_completion_selection(CompletionDirection::Forward),
KeyEvent {
code: KeyCode::BackTab,
..
} => self.change_completion_selection(CompletionDirection::Backward),
KeyEvent { KeyEvent {
code: KeyCode::Char('q'), code: KeyCode::Char('q'),
modifiers: KeyModifiers::CONTROL, modifiers: KeyModifiers::CONTROL,