From 07d317c87e6e2424f3b275f751430c12e9900bf3 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 4 Aug 2025 15:51:07 +0200 Subject: [PATCH] Further simplify TuiEvents. --- ircplom/client_tui.py | 4 ++-- ircplom/tui_base.py | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) 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.' -- 2.30.2