Asciifarm/asciifarm/client/display/field.py

71 lines
2.1 KiB
Python

import curses
from .widimp import WidImp
class Field(WidImp):
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.redraw = False
def resize(self, width, height):
self.size = (width, height)
self.pad.resize(height+1, width*self.charSize)
self.redraw = True
self.change()
def changeCell(self, x, y, sprites):
""" sprites must always have at least one element """
char, colour, bgcolour = sprites[0]
if bgcolour is None:
for (ch, co, bg) in sprites:
if bg is not None:
bgcolour = bg
break
else:
bgcolour = 0
if colour is not None and self.colours:
self.pad.addstr(y, x*self.charSize, " "*self.charSize, self.colours.get(7, 0))
self.pad.addstr(y, x*self.charSize, char, self.colours.get(colour, bgcolour))
else:
self.pad.addstr(y, x*self.charSize, char)
self.change()
def setCenter(self, pos):
self.center = pos
self.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):
if self.redraw:
win.erase()
win.noutrefresh()
self.redraw = False
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)