Skip to content

External

Embed external widgets in a prompt, for example a slider from TomJGooding/textual-slider.

Example

Example

from textual import on, events
from textual.app import ComposeResult
from textual.containers import HorizontalGroup, VerticalGroup
from textual.widgets import Label
from textual_slider import Slider

from inquirer_textual import prompts
from inquirer_textual.common.PromptMessage import PromptMessage
from inquirer_textual.widgets.InquirerWidget import InquirerWidget


class InquirerSlider(InquirerWidget):
    DEFAULT_CSS = """
    InquirerSlider {
        height: auto;
    }
    """

    def __init__(self, message: str, min_val: int, max_val: int, step: int):
        super().__init__()
        self.message = message
        self.slider = Slider(min=min_val, max=max_val, step=step, id="slider")

    def current_value(self):
        return self.slider.value

    def compose(self) -> ComposeResult:
        with VerticalGroup():
            with HorizontalGroup():
                yield PromptMessage(self.message)
                yield Label(id="slider-value")
            yield self.slider

    def on_mount(self) -> None:
        value_label = self.query_one("#slider-value", Label)
        value_label.update(str(self.slider.value))

    @on(Slider.Changed, "#slider")
    def on_slider_changed(self, event: Slider.Changed) -> None:
        value_label = self.query_one("#slider-value", Label)
        value_label.update(str(event.value))

    def on_key(self, event: events.Key):
        if event.key == 'enter':
            event.stop()
            self.submit_current_value()


if __name__ == '__main__':
    answer = prompts.external(InquirerSlider('Memory:', 0, 1024, 16))
    print(answer)