From: Christian Heller Date: Mon, 4 Aug 2025 13:51:07 +0000 (+0200) Subject: Further simplify TuiEvents. X-Git-Url: https://plomlompom.com/repos/booking/%7B%7Bprefix%7D%7D/error?a=commitdiff_plain;h=refs%2Fheads%2Fmaster;p=ircplom Further simplify TuiEvents. --- diff --git a/ircplom/client_tui.py b/ircplom/client_tui.py index 32deae0..fca8100 100644 --- a/ircplom/client_tui.py +++ b/ircplom/client_tui.py @@ -107,7 +107,7 @@ class _ClientLogEvent(_ClientWindowEvent, PayloadMixin): else: target.client_win(self.client_id, self.chat ).log.append(self.payload) - super().affect(target) + target.redraw_affected() @dataclass @@ -121,7 +121,7 @@ class _ClientPromptEvent(_ClientWindowEvent, PayloadMixin): prompt = win.prompt prompt.prefix = new_prefix prompt.tainted = True - super().affect(target) + target.redraw_affected() class _ClientKnowingTui(Client): diff --git a/ircplom/tui_base.py b/ircplom/tui_base.py index 124b026..cf95132 100644 --- a/ircplom/tui_base.py +++ b/ircplom/tui_base.py @@ -43,15 +43,6 @@ _KEYBINDINGS = { 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 @@ -353,6 +344,11 @@ class Window(_Widget): widget.draw() +@dataclass +class TuiEvent(AffectiveEvent): + 'To affect TUI.' + + @dataclass class _KeyboardEvent(TuiEvent, PayloadMixin): payload: str @@ -383,7 +379,7 @@ class _KeyboardEvent(TuiEvent, PayloadMixin): 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): @@ -400,13 +396,17 @@ 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.'