| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """ |
| This file contains utilities for handling input from the user and registering specific keys to specific functions, |
| based on https://github.com/bchao1/bullet |
| """ |
|
|
| from .keymap import KEYMAP, get_character |
|
|
|
|
| def mark(key: str): |
| """ |
| Mark the function with the key code so it can be handled in the register |
| """ |
|
|
| def decorator(func): |
| handle = getattr(func, "handle_key", []) |
| handle += [key] |
| func.handle_key = handle |
| return func |
|
|
| return decorator |
|
|
|
|
| def mark_multiple(*keys: list[str]): |
| """ |
| Mark the function with the key codes so it can be handled in the register |
| """ |
|
|
| def decorator(func): |
| handle = getattr(func, "handle_key", []) |
| handle += keys |
| func.handle_key = handle |
| return func |
|
|
| return decorator |
|
|
|
|
| class KeyHandler(type): |
| """ |
| Metaclass that adds the key handlers to the class |
| """ |
|
|
| def __new__(cls, name, bases, attrs): |
| new_cls = super().__new__(cls, name, bases, attrs) |
| if not hasattr(new_cls, "key_handler"): |
| new_cls.key_handler = {} |
| new_cls.handle_input = KeyHandler.handle_input |
|
|
| for value in attrs.values(): |
| handled_keys = getattr(value, "handle_key", []) |
| for key in handled_keys: |
| new_cls.key_handler[key] = value |
| return new_cls |
|
|
| @staticmethod |
| def handle_input(cls): |
| "Finds and returns the selected character if it exists in the handler" |
| char = get_character() |
| if char != KEYMAP["undefined"]: |
| char = ord(char) |
| handler = cls.key_handler.get(char) |
| if handler: |
| cls.current_selection = char |
| return handler(cls) |
| else: |
| return None |
|
|
|
|
| def register(cls): |
| """Adds KeyHandler metaclass to the class""" |
| return KeyHandler(cls.__name__, cls.__bases__, cls.__dict__.copy()) |
|
|