OBP60v/cfgmenu.py

99 lines
2.9 KiB
Python

"""
Menüsystem für Konfiguration(en)
"""
class MenuItem():
def __init__(self, valtype, label, value=None, unit=''):
validtypes = ('int', 'bool')
valtype = valtype.lower() # Groß- und Kleinschreibung lassen wir gemischt zu
if valtype not in validtypes:
raise TypeError(f"Invalid value type: '{valtype}'. Only supported: {validtypes}")
self.label = label # Anzeigetext des Menüeintrag
self.value = value # Zugeordneter Wert für diesen Eintrag
self.unit = unit
self._type = valtype
self._min = 0
self._max = 99999
self.steps = (1, 10, 100, 1000) # Sprungmöglichkeiten für +/- Tasten
self.step = 0 # index into tuple above
self.position = None # Menüposition gezählt von 0 an
def setRange(self, valmin, valmax, steps):
self.min = valmin
self.max = valmax
self.steps = steps
def setValue(self, val):
if self._type == 'int':
if val >= self._min and val <= self._max:
self.value = val
return True
elif self.type == 'bool':
self.value = val
return True
return False
class Menu():
def __init__(self, title, x, y):
self.title = title
self.items = {} # Items über Schlüssel zugreifbar
self.activeitem = -1 # Noch nichts aktiv
self._x = x
self._y = y
self._w = 100
self._h = 20
self._index = [] # Mapping zwischen Index(Position) und Schlüssel
self._iter_index = 0
def __iter__(self):
return self
def __next__(self):
if self._iter_index < len(self.items):
itm = self.items[self._index[self._iter_index]]
self._iter_index += 1
return itm
self._iter_index = 0
raise StopIteration
def addItem(self, key, label, valtype, value=None, unit=''):
if key in self.items.keys():
raise KeyError(f"Duplicate menu item key: '{key}'")
itm = MenuItem(valtype, label, value, unit)
self.items[key] = itm
self._index.append(key)
itm.position = self._index.index(key)
return itm
def setItemActive(self, key):
self.activeitem = self._index.index(key)
def getActiveItem(self):
return self.items[self._index[self.activeitem]]
def getItemByIndex(self, index):
return self.items[self._index[index]]
def getItemByKey(self, key):
return self.items[key]
def getItemCount(self):
return len(self.items)
def setItemDimension(self, w, h):
self._w = w
self._h = h
def getXY(self):
return (self._x, self._y)
def getRect(self):
return (self._x, self._y, self._w, self._h * len(self.items))
def getItemRect(self, index):
y = self._y + index * self._h
return (self._x, y, self._w, self._h)