Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 52 additions & 1 deletion prompt_toolkit/widgets/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
AnyFormattedText,
StyleAndTextTuples,
Template,
merge_formatted_text,
to_formatted_text,
)
from prompt_toolkit.formatted_text.utils import fragment_list_to_text
Expand Down Expand Up @@ -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.
"""
Expand Down