summaryrefslogtreecommitdiff
path: root/asciifarm/client/display/messages.py
blob: 356b8e285ead234982932caccea657292e1dc923 (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

import textwrap

class Messages():
    
    def __init__(self):
        self.changed = False
        self.messages = []
        self.widget = None
        self.scrolledBack = 0
    
    def setWidget(self, widget):
        self.widget = widget
    
    def addMessage(self, message):
        self.messages.append(message)
        if self.scrolledBack:
            self.scrolledBack += 1
        self.widget.change()
    
    def scroll(self, amount, relative=True):
        if relative:
            self.scrolledBack += amount
        else:
            self.scrolledBack = amount
        self.scrolledBack = max(self.scrolledBack, 0)
        self.widget.update()
        self.widget.doUpdate()
    
    def update(self, win):
        width, height = win.getSize()
        if height < 1:
            return
        lines = []
        messages = self.messages
        for message in messages:
            lines += textwrap.wrap(message, width)
        self.scrolledBack = max(min(self.scrolledBack, len(lines)-height), 0)
        moreDown = False
        if self.scrolledBack > 0:
            lines = lines[:-self.scrolledBack]
            moreDown = True
        moreUp = False
        if len(lines) > height:
            moreUp = True
            lines = lines[len(lines)-height:]
        elif len(lines) < height:
            lines = (height-len(lines)) * [""] + lines
        win.erase()
        for i, line in enumerate(lines):
            win.addLine((0,i),line)
        if moreUp:
            win.addLine((width-1, 0), '-')
        if moreDown:
            win.addLine((width-1, height-1), '+')
        win.noutrefresh()