Asciifarm/asciifarm/client/display/inventory.py

74 lines
2.0 KiB
Python

from asciifarm.common import utils
from .widimp import WidImp
class Inventory(WidImp):
def __init__(self, title, titlebar="{}:", selectorChar="*"):
self.title = title
self.titlebar = titlebar
self.selectorChar = selectorChar
self.items = []
self.selector = 0
def getSelected(self):
return self.selector
def select(self, value, relative=False, modular=False):
invLen = len(self.items)
if relative:
value += self.selector
if modular and invLen:
value %= invLen
if value < 0:
value = 0
if value >= invLen:
value = invLen-1
if value in range(invLen):
self.doSelect(value)
def doSelect(self, value):
self.selector = value
self.change()
def setInventory(self, items):
self.items = items
self.selector = utils.clamp(self.selector, 0, len(items)-1)
self.change()
def getItem(self, num):
return self.items[num]
def getSelectedItem(self):
return self.getItem(self.getSelected())
def setTitle(self, title):
self.title = title
def getNumItems(self):
return len(self.items)
def itemName(self, item):
return item
def update(self, win):
width, height = win.getSize()
height -= 1
selected = self.selector
start = min(selected - height//2, len(self.items)-height)
start = max(start, 0)
end = start + height
win.erase()
win.addLine((0,0), (self.titlebar.format(self.title))[:width])
for i, item in enumerate(self.items[start:end]):
if i + start == selected:
win.addLine((0, i+1), self.selectorChar)
win.addLine((1, i+1), self.itemName(item))
if end < len(self.items):
win.addLine((width-1, height), "+")
if start > 0:
win.addLine((width-1, 1), "-")
win.noutrefresh()