Ankerseite: Werte über Tastatur änderbar

This commit is contained in:
2025-07-22 13:12:00 +02:00
parent 986d222a98
commit dafcfaca6b
3 changed files with 151 additions and 72 deletions

View File

@@ -5,44 +5,94 @@ Menüsystem für Konfiguration(en)
class MenuItem():
def __init__(self, itmname):
self.name = itmname
self.label = None
self.value = None
self.steps = (1,)
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):
self.value = 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 = None
x = 0
y = 0
w = 100
h = 20
items = []
itm_active = -1 # nothing activated
self._index = -1
def addItem(self, label):
itm = MenuItem(label)
items.append(itm)
class MenuIter():
def __init__(self, menu):
self._items = menu.items
self._class_size = len(self._items)
self._index = 0
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._index < self._class_size:
itm = items[self._index]
self._index += 1
if self._iter_index < len(self.items):
itm = self.items[self._index[self._iter_index]]
self._iter_index += 1
return itm
raise StopIteration
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)