home · contact · privacy
Refactor client curses code.
[plomrogue2] / plomrogue_client / tui.py
1 #!/usr/bin/env python3
2 import curses
3
4
5
6 class CursesScreen:
7
8     def wrap_loop(self, loop):
9         curses.wrapper(self.start_loop, loop)
10
11     def safe_addstr(self, y, x, line, attr=0):
12         if y < self.size.y - 1 or x + len(line) < self.size.x:
13             self.stdscr.addstr(y, x, line, attr)
14         else:  # workaround to <https://stackoverflow.com/q/7063128>
15             cut_i = self.size.x - x - 1
16             cut = line[:cut_i]
17             last_char = line[cut_i]
18             self.stdscr.addstr(y, self.size.x - 2, last_char, attr)
19             self.stdscr.insstr(y, self.size.x - 2, ' ')
20             self.stdscr.addstr(y, x, cut, attr)
21
22     def reset_size(self):
23         from plomrogue.mapping import YX
24         self.size = YX(*self.stdscr.getmaxyx())
25         self.size = self.size - YX(self.size.y % 4, 0)
26         self.size = self.size - YX(0, self.size.x % 4)
27
28     def start_loop(self, stdscr, loop):
29         self.stdscr = stdscr
30         curses.curs_set(0)  # hide cursor
31         stdscr.timeout(10)
32         loop()
33
34
35
36 def msg_into_lines_of_width(msg, width):
37     chunk = ''
38     lines = []
39     x = 0
40     for i in range(len(msg)):
41         if x >= width or msg[i] == "\n":
42             lines += [chunk]
43             chunk = ''
44             x = 0
45             if msg[i] == "\n":
46                 x -= 1
47         if msg[i] != "\n":
48             chunk += msg[i]
49         x += 1
50     lines += [chunk]
51     return lines