""" game.mainmenu - Let's user choose """ from enum import IntEnum import pygame from sliceitoff.screens import settings_screen from sliceitoff.display import Scaling from sliceitoff.sfx import sfx from .explodeout import ExplodeOutGroup MOUSE_TRESHOLD = 100 class MenuItems(IntEnum): """ Items in the menu. Should match mainmenu_screen """ SFX = 0 MUSIC = 1 BACK = 2 class Settings(ExplodeOutGroup): """ sprite group with imputs to make selection """ def __init__(self): super().__init__() self.add(settings_screen(0)) self.selection = 0 self.mousey = 0 def do_selection(self): """ Actions for manu entries """ match self.selection: case MenuItems.BACK: self.do_fadeout() def update(self, dt = 0, **kwargs): """ Does it all. Reads keyboard and updates screen """ if not super().update(dt = dt, **kwargs) or self.explode: return for event in pygame.event.get(): if event.type == pygame.QUIT: self.selection = MenuItems.BACK self.do_fadeout() break if event.type == pygame.MOUSEBUTTONDOWN and event.button <= 3: self.do_selection() break if event.type == pygame.KEYDOWN: if self.process_key(event.key): break elif event.type == pygame.MOUSEMOTION: self.process_mouse_motion() self.empty() self.add(settings_screen(self.selection)) def process_mouse_motion(self): """ Mouse movement up or down moves menu selection """ self.mousey += pygame.mouse.get_rel()[1] pygame.mouse.set_pos(Scaling.center) if abs(self.mousey) > MOUSE_TRESHOLD: self.selection += 1 if self.mousey > 0 else -1 self.selection %= len(MenuItems) self.mousey = 0 def process_key(self, key): """ Processes known key presses """ match key: case pygame.K_KP_ENTER | pygame.K_RETURN | pygame.K_RIGHT: self.do_selection() return True case pygame.K_ESCAPE | pygame.K_q | pygame.K_LEFT: self.selection = MenuItems.BACK self.do_fadeout() return True case pygame.K_UP: self.selection -= 1 self.selection %= len(MenuItems) case pygame.K_DOWN: self.selection += 1 self.selection %= len(MenuItems) return False