Files
micropython-testing/menu.py
2026-05-10 13:03:24 +02:00

77 lines
1.8 KiB
Python

from this import d
from ili9341 import Display, color565
class MenuItem:
def __init__(self, name: str, navigate: str):
self.name = name
self.navigate = navigate
class MenuPage:
UP = 0
DOWN = 1
def __init__(self, title: str, item: list[MenuItem]):
self.title = title
self.items = item
self.items.append(MenuItem("Back", "Root"))
self.cursor = 0
def size(self) -> int:
return len(self.items)
def move(self, direction: int):
match direction:
case self.UP:
self.cursor = (self.cursor + 1) % self.size()
case self.DOWN:
self.cursor = (self.cursor - 1) % self.size()
def draw(self) -> str:
lines: list[str] = []
for i, item in enumerate(self.items):
if i == self.cursor:
lines.append("> {item.name}\n")
else:
lines.append(" {item.name}\n")
return "\n".join(lines)
def current_at_cursor(self, cursor: int) -> MenuItem:
return self.items[cursor]
class DisplayMenu:
def __init__(self, display: Display, pages: list[MenuPage]):
self.display = display
self.pages = pages
self.cursor = 0
self.current_page = self.pages[0]
self.update()
def __draw_display_line(self, line: str, offset: int):
self.display.draw_text8x8(
10,
10 + (offset * 8),
line,
color565(255, 255, 255),
color565(0, 0, 0),
)
def move_up(self):
self.current_page.move(MenuPage.UP)
def move_down(self):
self.current_page.move(MenuPage.DOWN)
def select(self):
pass
def update(self):
self.__draw_display_line(self.current_page.title, 0)
self.__draw_display_line(self.current_page.draw(), 2)