else:
target.client_win(self.client_id, self.chat
).log.append(self.payload)
- super().affect(target)
+ target.redraw_affected()
@dataclass
prompt = win.prompt
prompt.prefix = new_prefix
prompt.tainted = True
- super().affect(target)
+ target.redraw_affected()
class _ClientKnowingTui(Client):
CMD_SHORTCUTS: dict[str, str] = {}
-@dataclass
-class TuiEvent(AffectiveEvent):
- 'To affect TUI, and trigger flushed .draw_tainted on it.'
-
- def affect(self, target) -> None:
- target.window.draw_tainted()
- target.term.flush()
-
-
class _YX(NamedTuple):
y: int
x: int
widget.draw()
+@dataclass
+class TuiEvent(AffectiveEvent):
+ 'To affect TUI.'
+
+
@dataclass
class _KeyboardEvent(TuiEvent, PayloadMixin):
payload: str
target.window.prompt.insert(self.payload)
else:
target.log.alert(f'unknown keyboard input: {self.payload}')
- super().affect(target)
+ target.redraw_affected()
class BaseTui(QueueMixin):
self.set_screen()
signal(SIGWINCH, lambda *_: self.set_screen())
+ def redraw_affected(self) -> None:
+ 'On focused window call .draw_tainted, then flush screen.'
+ self.window.draw_tainted()
+ self.term.flush()
+
def set_screen(self) -> None:
- 'Calc screen geometry into .windows, fully draw front one and flush.'
+ 'Calc screen geometry into .windows, then call .redraw_affected.'
self.term.calc_geometry()
for window in self.windows:
window.set_geometry()
- self.window.draw()
- self.term.flush()
+ self.redraw_affected()
def cmd_name_to_cmd(self, cmd_name: str) -> Optional[Callable]:
'Map cmd_name to executable TUI element method.'