99 lines
2.9 KiB
Python
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)
|