57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
|
|
import textwrap
|
|
|
|
from .widimp import WidImp
|
|
|
|
class Messages(WidImp):
|
|
|
|
def __init__(self, colours):
|
|
self.changed = False
|
|
self.messages = []
|
|
self.scrolledBack = 0
|
|
self.colours = colours
|
|
|
|
def addMessage(self, message, type=None):
|
|
self.messages.append([message, type])
|
|
if self.scrolledBack:
|
|
self.scrolledBack += 1
|
|
self.change()
|
|
|
|
def scroll(self, amount, relative=True):
|
|
if relative:
|
|
self.scrolledBack += amount
|
|
else:
|
|
self.scrolledBack = amount
|
|
self.scrolledBack = max(self.scrolledBack, 0)
|
|
self.change()
|
|
|
|
def update(self, win):
|
|
width, height = win.getSize()
|
|
if height < 1:
|
|
return
|
|
lines = []
|
|
messages = self.messages
|
|
for message, type in messages:
|
|
colour = self.colours.get(type, (7,0))
|
|
for line in textwrap.wrap(message, width):
|
|
lines.append((line, colour))
|
|
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()
|