import contextlib import sys from typing import Callable, NoReturn import pygame from .screen import Screen from ..controller import Controller, KeyboardController, JoystickController, Input from ..misc import UnPause def handle_input_pressed(controller: Controller, event: pygame.event.Event): if controller.get_input_down(event) == Input.PAUSE: raise UnPause() class Pause(Screen): def __init__(self, screen: pygame.surface.Surface): self.event_handler: dict[int, Callable[[pygame.event.Event], None]] = {} def exit(_) -> NoReturn: sys.exit() self.event_handler[pygame.QUIT] = exit self.event_handler[pygame.JOYBUTTONDOWN] = lambda evt: handle_input_pressed(JoystickController(evt.joy), evt) self.event_handler[pygame.KEYDOWN] = lambda evt: handle_input_pressed(KeyboardController(pygame.key), evt) def refresh(self) -> None: pass def oneframe(self) -> None: try: for event in pygame.event.get(): with contextlib.suppress(KeyError): self.event_handler[event.type](event) except UnPause: pygame.event.clear() raise