summaryrefslogtreecommitdiff
path: root/tui/tui.py
blob: 20817113d57826f3581bd725959058263634b49d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import termios, fcntl, sys, os
fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)


class Tui():
    def __init__(self):
        # https://stackoverflow.com/questions/983354/how-do-i-wait-for-a-pressed-key
        fd = sys.stdin.fileno()
        oldterm = termios.tcgetattr(fd)
        newattr = termios.tcgetattr(fd)
        newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
        termios.tcsetattr(fd, termios.TCSANOW, newattr)
        
    def __del__(self):
        termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
        fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
        
    def set_color(self, color):
        if color>=0 and color<16:
            print(end=f"\033[{'1;' if color//8 else ''}3{color%8}m")

    def set_bg(self, color):
        if color>=0 and color<8:
            print(end=f"\033[4{color}m")

    def cursor_up(self, lines):
        print(end=f"\033[{lines}F")

    def reset_color(self):
        print(end="\033[0m")
        
    def draw_tile(self, tile, hilighted):
        chars_and_colors = (
            (' ', 7, 0), ('1', 10, 0), ('2', 11, 0),
            ('3', 13, 0), ('4', 9, 0), ('5', 9, 0),
            ('6', 9, 0), ('7', 9, 0), ('8', 9, 0),
            ('¤', 15, 1), ('#', 8, 7)
        )

        if hilighted:
            self.set_color(14)
            self.set_bg(6)
        else:
            self.set_color(chars_and_colors[tile][1])
            self.set_bg(chars_and_colors[tile][2])
            
        print(end=f"[{chars_and_colors[tile][0]}]")
        self.reset_color()
        
    def draw_matrix(self, matrix, hx, hy ):
        self.cursor_up(len(matrix[0]))
        for y in range(len(matrix[0])):
            for x in range(len(matrix)):
                self.draw_tile( matrix[x][y], 
                        x == hx and y == hy )
            print()
                
    def matrix_selector(self, matrix, x,y ):
        self.draw_matrix(matrix, x, y)
        while True:
            try:
                c = sys.stdin.read(1)
            except:
                continue
            match c:
                case 'A':
                    y-=1
                case 'B':
                    y+=1
                case 'C':
                    x+=1
                case 'D':
                    x-=1
                case '':
                    continue
                case 'q':
                    return (-1,-1)
                case ' ':
                    return (x,y)
                case _:
                    continue
            x = 0 if x < 0 else x
            y = 0 if y < 0 else y
            x = len(matrix)-1 if x >= len(matrix) else x
            y = len(matrix[0])-1 if y >= len(matrix[0]) else y
            
            self.draw_matrix(matrix, x, y)