77 lines
1.8 KiB
Python
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)
|