summaryrefslogtreecommitdiff
path: root/asciifarm/client/display/fieldpad.py
blob: 6619c1f80900006f8fd0bcb8a2616262fd2525ea (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

import curses


class FieldPad:
    
    
    def __init__(self, size=(1,1), charSize=1, colours=False):
        self.pad = curses.newpad(size[1]+1, (size[0]+1)*charSize)
        self.size = size
        self.charSize = charSize
        self.center = (0, 0)
        self.colours = colours
        self.changed = False
        self.widget = None
    
    def setWidget(self, widget):
        self.widget = widget
    
    def resize(self, width, height):
        self.size = (width, height)
        self.pad.resize(height+1, width*self.charSize)
        self.widget.change()
        win = self.widget.getWin()
        if win:
            win.erase()
            win.noutrefresh()
    
    def changeCell(self, x, y, sprites):
        """ sprites must always have at least one element """
        char, colour, bgcolour = sprites[0]
        if bgcolour == None:
            for (ch, co, bg) in sprites:
                if bg != None:
                    bgcolour = bg
                    break
            else:
                bgcolour = 0
        if colour != None and self.colours:
            self.pad.addstr(y, x*self.charSize, char, self.colours.get(colour, bgcolour))
        else:
            self.pad.addstr(y, x*self.charSize, char)
        self.widget.change()
    
    def setCenter(self, pos):
        self.center = pos
        self.widget.change()
    
    def getWidth(self):
        return self.size[0]*self.charSize
    
    def getHeight(self):
        return self.size[1]
    
    def _roundWidth(self, x):
        return x // self.charSize * self.charSize
    
    def update(self):
        win = self.widget.getWin()
        width, height = win.getSize()
        x, y = win.getPos()
        xmax = x + width
        ymax = y + height
        self.pad.noutrefresh(
            max(0, min(self.getHeight()-height, self.center[1] - int(height/2))),
            max(0, min(
                self._roundWidth(self.getWidth()-width),
                self._roundWidth(self.center[0]*self.charSize - int(width/2)))),
            y,
            x + max(0, (width - self.getWidth()) // 2),
            ymax,
            xmax)