from threading import Thread from asciimatics.exceptions import NextScene from asciimatics.widgets import Frame, Layout, Button, Divider, Label from ..operation_strings import descriptions as op_desc from ..utils import generic_handle_stream_response from .TUIStreamResponseHandler import TUIStreamResponseHandler class TransactionView(Frame): def __init__(self, screen, width, height, model): super().__init__( screen, height, width, can_scroll=False, on_load=self._on_load, title='Running Transaction', ) self._model = model # map operation names to label widgets self._labels = {} # this is an ugly hack to get around the fact that _on_load() # will be called again when we reset() in the TUIStreamResponseHandler self._loaded = False def _add_buttons(self): layout = Layout([100]) self.add_layout(layout) layout.add_widget(Divider()) layout = Layout([1, 1]) self.add_layout(layout) self._next_btn = Button('Next', self._next) self._next_btn.disabled = True layout.add_widget(self._next_btn, 1) def _add_line(self, text: str = ''): layout = Layout([100]) self.add_layout(layout) layout.add_widget(Label(text, align='^')) def _on_load(self): if self._loaded: return self._loaded = True for _ in range(2): self._add_line() for operation in self._model.operations: desc = op_desc[operation] layout = Layout([10, 1, 10]) self.add_layout(layout) layout.add_widget(Label(desc + '...', align='>'), 0) desc_label = Label('', align='<') layout.add_widget(desc_label, 2) self._labels[operation] = desc_label self._add_line() self._msg_layout = Layout([100]) self.add_layout(self._msg_layout) self.add_layout(Layout([100], fill_frame=True)) self._add_buttons() self.fix() Thread(target=self._do_txn).start() def _do_txn(self): resp = self._model.deferred_req() handler = TUIStreamResponseHandler( model=self._model, labels=self._labels, next_btn=self._next_btn, msg_layout=self._msg_layout, frame=self, ) generic_handle_stream_response(resp, self._model.operations, handler) def _next(self): self._model.scene_stack.clear() raise NextScene('Welcome')