Source code for neural_data_simulator.tasks.center_out_reach.input_events
"""Module for handling events such as key presses."""
from enum import Enum
from typing import Callable, Tuple
import pygame
from neural_data_simulator.tasks.center_out_reach.joystick import JoystickInput
[docs]class InputEvent(Enum):
"""An enumeration of the possible input events."""
NONE = 0
EXIT = 1
RESET = 2
TOGGLE_CURSOR = 3
CLEAR_METRICS = 4
MOUSE_BUTTON_PRESSED = 5
[docs]class InputHandler:
"""Listeners for input event handling."""
[docs] def __init__(self):
"""Create a new instance."""
self.event_handlers = dict()
self.joystick_input = JoystickInput()
@property
def input_device_name(self):
"""Get the name of the input device."""
return "joystick" if self.joystick_input.joystick else "mouse"
[docs] def set_handler_for_event(self, event: InputEvent, handler: Callable):
"""Set a function as a handler for a specific input event."""
self.event_handlers[event] = handler
[docs] def get_cursor_relative_position(self) -> Tuple[int, int]:
"""Get the relative position of the joystick or mouse cursor.
The position is relative to the previous position when this
function was last called. If a joystick was detected at the start
of the GUI, the joystick position is returned. Otherwise, the
mouse position is returned.
Returns:
The relative position of the cursor as a tuple.
"""
if joystick_rel_position := self.joystick_input.relative_position:
return joystick_rel_position
return pygame.mouse.get_rel()
[docs] def poll(self):
"""Poll for input events and call the appropriate handler.
This method should be called once per iteration of the main loop.
"""
event = self._get_next_event()
handler = self.event_handlers.get(event)
if handler is not None:
handler()
def _get_next_event(self) -> InputEvent:
for event in pygame.event.get():
self.joystick_input.process_event(event)
if event.type == pygame.MOUSEBUTTONUP:
return InputEvent.MOUSE_BUTTON_PRESSED
if (event.type == pygame.QUIT) or (
event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE
):
return InputEvent.EXIT
if (event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE) or (
event.type == pygame.JOYBUTTONDOWN and event.button == 3
):
return InputEvent.RESET
if (event.type == pygame.KEYDOWN and event.key == pygame.K_c) or (
event.type == pygame.JOYBUTTONDOWN and event.button == 2
):
return InputEvent.TOGGLE_CURSOR
if event.type == pygame.KEYDOWN and event.key == pygame.K_k:
return InputEvent.CLEAR_METRICS
return InputEvent.NONE