55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
"""A two-column autocomplete example with heavy styling."""
|
|
|
|
from textual.app import App, ComposeResult
|
|
from textual.content import Content
|
|
from textual.widgets import Input, Label
|
|
|
|
from textual_autocomplete import AutoComplete, DropdownItem
|
|
from examples._headers import headers
|
|
|
|
# Define a mapping of sections to colors
|
|
SECTION_COLORS: dict[str, str] = {
|
|
"Authentication": "$text-success",
|
|
"Caching": "$text-primary",
|
|
"Conditionals": "$text-warning",
|
|
"Connection management": "$text-error",
|
|
"Content negotiation": "$text-success",
|
|
"Controls": "$text-accent",
|
|
"Cookies": "$text-warning",
|
|
"CORS": "$text-error",
|
|
# Add fallback color for any other sections
|
|
"default": "$foreground",
|
|
}
|
|
|
|
# Create dropdown items with two columns: rank and language name
|
|
CANDIDATES = [
|
|
DropdownItem(
|
|
Content.styled(
|
|
str(header["name"]),
|
|
style=SECTION_COLORS.get(
|
|
str(header.get("section", "default")), SECTION_COLORS["default"]
|
|
),
|
|
), # Main text to be completed with color based on section
|
|
prefix=Content.from_markup(
|
|
"[$text-primary on $primary-muted] $number", number=f"{i:<3}"
|
|
), # Prefix showing rank, styled with Textual markup!
|
|
)
|
|
for i, header in enumerate(headers)
|
|
]
|
|
|
|
|
|
class TwoColumnAutoCompleteExample(App[None]):
|
|
def compose(self) -> ComposeResult:
|
|
yield Label("Start typing an HTTP header name:")
|
|
text_input = Input(placeholder="Type here...")
|
|
yield text_input
|
|
|
|
yield AutoComplete(
|
|
target=text_input, # The widget to attach autocomplete to
|
|
candidates=CANDIDATES, # The list of completion candidates
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app = TwoColumnAutoCompleteExample()
|
|
app.run()
|