home · contact · privacy
Further simplify TuiEvents.
authorChristian Heller <c.heller@plomlompom.de>
Mon, 4 Aug 2025 13:51:07 +0000 (15:51 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 4 Aug 2025 13:51:07 +0000 (15:51 +0200)
ircplom/client_tui.py
ircplom/tui_base.py

index 32deae0b708d2dcdf726474a65a239a6f5d98df0..fca810007f9ff7629421a27873945dad757c3b35 100644 (file)
@@ -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):
index 124b026fa5d71bf2ed642fdd37986fc92617adf0..cf9513270436550973cb59119405ce8aac95975e 100644 (file)
@@ -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.'