Source code for upsies.uis.tui.jobwidgets.dialog
import functools
from prompt_toolkit.filters import Condition
from prompt_toolkit.layout.containers import ConditionalContainer, HSplit
from .. import widgets
from . import JobWidgetBase
import logging # isort:skip
_log = logging.getLogger(__name__)
[docs]
class ChoiceJobWidget(JobWidgetBase):
is_interactive = True
[docs]
def setup(self):
if self.job.multichoice:
self._list_widget = widgets.CheckList(
question=self.job.question,
options=self.job.options,
focused=self.job.focused,
autodetected_indexes=self.job.autodetected_indexes,
on_accepted=self._handle_accepted,
)
else:
self._list_widget = widgets.RadioList(
question=self.job.question,
options=self.job.options,
focused=self.job.focused,
autodetected_index=(
self.job.autodetected_indexes[0]
if self.job.autodetected_indexes else
None
),
on_accepted=self._handle_accepted,
)
self._activity_indicator = widgets.ActivityIndicator()
self.job.signal.register('dialog_updated', self._handle_dialog_updated)
self.job.signal.register('autodetecting', self._handle_autodetecting)
self.job.signal.register('autodetected', self._handle_autodetected)
# Immediately hide the radiolist. Otherwise it flashes into view when
# the job is started only to become hidden when the autodetect function
# is called a few milliseconds later.
self.job.signal.register('running', lambda _: self._activity_indicator.enable())
def _handle_dialog_updated(self):
self._list_widget.options = self.job.options
self._list_widget.focused_index = self.job.focused_index
if isinstance(self._list_widget, widgets.CheckList):
self._list_widget.autodetected_indexes = self.job.autodetected_indexes
self._list_widget.marked_indexes.update(self.job.autodetected_indexes)
else:
self._list_widget.autodetected_index = (
self.job.autodetected_indexes[0]
if self.job.autodetected_indexes else
None
)
self.invalidate()
def _handle_autodetecting(self):
self._activity_indicator.enable()
self.invalidate()
def _handle_autodetected(self):
self._activity_indicator.disable()
self.invalidate()
def _handle_accepted(self, choice):
self.job.make_choice(choice)
@functools.cached_property
def runtime_widget(self):
return HSplit(
children=[
ConditionalContainer(
content=self._activity_indicator,
filter=Condition(lambda: self._activity_indicator.active),
),
ConditionalContainer(
content=self._list_widget,
filter=Condition(lambda: not self._activity_indicator.active),
),
],
)
[docs]
class TextFieldJobWidget(JobWidgetBase):
is_interactive = True
[docs]
def setup(self):
self._input_field = widgets.InputField(
text=self.job.text,
read_only=self.job.read_only,
style='class:dialog.text',
on_accepted=self._on_accepted,
)
self.job.signal.register('is_loading', self._handle_is_loading)
self.job.signal.register('read_only', self._handle_read_only)
self.job.signal.register('text', self._handle_text)
def _handle_is_loading(self, is_loading):
self._input_field.is_loading = is_loading
self.invalidate()
def _handle_read_only(self, read_only):
self._input_field.read_only = read_only
self.invalidate()
def _handle_text(self, text):
self._input_field.text = text
self.invalidate()
def _on_accepted(self, buffer):
self.job.add_output(buffer.text)
@functools.cached_property
def runtime_widget(self):
return self._input_field