47 lines
1.2 KiB
Python
47 lines
1.2 KiB
Python
import pygame
|
|
|
|
class MenuManager:
|
|
def __init__(self, display, bg_colour, menus=None):
|
|
self.display = display
|
|
self.bg_colour = bg_colour
|
|
self.menus = menus or {}
|
|
self.current_menu = None
|
|
|
|
def change_menu(self, name):
|
|
if name not in self.menus:
|
|
raise ValueError(f"Menu '{name}' not registered")
|
|
self.current_menu = name
|
|
|
|
def register_menu(self, name, buttons=None, draw=None):
|
|
self.menus[name] = {
|
|
"buttons": buttons or [],
|
|
"draw": draw
|
|
}
|
|
|
|
def handle_event(self, event):
|
|
if not self.current_menu:
|
|
return
|
|
buttons = self.menus[self.current_menu]["buttons"]
|
|
|
|
# handle dynamic buttons (function returning list)
|
|
if callable(buttons):
|
|
buttons = buttons()
|
|
|
|
for b in buttons:
|
|
b.handle_event(event)
|
|
|
|
def draw(self):
|
|
if not self.current_menu:
|
|
return
|
|
buttons = self.menus[self.current_menu]["buttons"]
|
|
draw_callback = self.menus[self.current_menu]["draw"]
|
|
|
|
if callable(buttons):
|
|
buttons = buttons()
|
|
|
|
for b in buttons:
|
|
b.draw(self.display)
|
|
|
|
if draw_callback:
|
|
draw_callback(self.display)
|