From 02c3f9c21e6237c3d27177a9dd923f3dad055448 Mon Sep 17 00:00:00 2001 From: Jonathan Slenders Date: Tue, 28 Apr 2020 23:58:11 +0200 Subject: [PATCH] Added ComboBox widget. --- prompt_toolkit/widgets/base.py | 53 +++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/prompt_toolkit/widgets/base.py b/prompt_toolkit/widgets/base.py index 37ba7471bf..378b3302e5 100644 --- a/prompt_toolkit/widgets/base.py +++ b/prompt_toolkit/widgets/base.py @@ -32,6 +32,7 @@ AnyFormattedText, StyleAndTextTuples, Template, + merge_formatted_text, to_formatted_text, ) from prompt_toolkit.formatted_text.utils import fragment_list_to_text @@ -833,7 +834,57 @@ def checked(self, value: bool) -> None: self.current_values = [] -class VerticalLine(object): +class ComboBox: + """ + Input field where the user can select one out of multiple entries. + """ + + def __init__(self, entries: List[AnyFormattedText]) -> None: + self.entries = entries + self.selected_entry = 0 + self.container = Window( + content=FormattedTextControl( + text=self._get_formatted_text, + focusable=True, + key_bindings=self._get_key_bindings(), + ), + style="class:select-box", + height=D(preferred=5), + cursorline=True, + right_margins=[ScrollbarMargin(display_arrows=True),], + ) + + def _get_formatted_text(self) -> AnyFormattedText: + result: List[AnyFormattedText] = [] + + for i, entry in enumerate(self.entries): + if i == self.selected_entry: + result.append([("[SetCursorPosition]", "")]) + result.append(entry) + result.append("\n") + + return merge_formatted_text(result) + + def _get_key_bindings(self) -> KeyBindings: + kb = KeyBindings() + + @kb.add("up") + def _go_up(event) -> None: + if len(self.entries): + self.selected_entry = (self.selected_entry - 1) % len(self.entries) + + @kb.add("down") + def _go_down(event) -> None: + if len(self.entries): + self.selected_entry = (self.selected_entry + 1) % len(self.entries) + + return kb + + def __pt_container__(self) -> Container: + return self.container + + +class VerticalLine: """ A simple vertical line with a width of 1. """