home · contact · privacy
Add basic scrolling.
authorChristian Heller <c.heller@plomlompom.de>
Fri, 30 May 2025 15:12:23 +0000 (17:12 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Fri, 30 May 2025 15:12:23 +0000 (17:12 +0200)
ircplom.py

index 2c551177885cf2928bfa63b3133a904f4a76b5a9..e35af9a44a1f557bacddebb7b300dcfcb97e0d7e 100755 (executable)
@@ -23,7 +23,9 @@ INPUT_PROMPT = ':'
 
 KEYBINDINGS = {
     'KEY_BACKSPACE': 'prompt_backspace',
-    'KEY_ENTER': 'prompt_enter'
+    'KEY_ENTER': 'prompt_enter',
+    'KEY_UP': 'scroll_up',
+    'KEY_DOWN': 'scroll_down',
 }
 
 IRCSPEC_LINE_SEPARATOR = b'\r\n'
@@ -356,6 +358,7 @@ class TuiLoop(Loop):
         self._term = term
         self._prompt = ''
         self._log_buffer: list[str] = []
+        self._upscroll = 0
         self._calc_and_draw_all()
         self._term.flush()
         super().__init__(*args, **kwargs)
@@ -394,6 +397,16 @@ class TuiLoop(Loop):
         self._prompt = ''
         self._draw_prompt()
 
+    def _kb__scroll_up(self) -> None:
+        if len(self._log_buffer) > self._upscroll:
+            self._upscroll += 1
+        self._draw_log()
+
+    def _kb__scroll_down(self) -> None:
+        if self._upscroll > 1:
+            self._upscroll -= 1
+        self._draw_log()
+
     def _calc_and_draw_all(self) -> None:
         self._term.clear()
         self._term.calc_geometry()
@@ -409,7 +422,8 @@ class TuiLoop(Loop):
 
     def _draw_log(self) -> None:
         temp_buffer = [''] * self._term.size.y
-        for line in self._log_buffer:
+        for line in self._log_buffer[:(-self._upscroll if self._upscroll
+                                       else None)]:
             temp_buffer += self._term.wrap(line)
         for i, line in enumerate(temp_buffer[-self._y_separator:]):
             self._term.write_yx(YX(i, 0), line)