You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.3 KiB
63 lines
2.3 KiB
from typing import Any, Callable, List, Literal |
|
|
|
from ..binding import BindableProperty |
|
from ..element import Element |
|
from ..events import (GenericEventArguments, KeyboardAction, KeyboardKey, KeyboardModifiers, KeyEventArguments, |
|
handle_event) |
|
|
|
|
|
class Keyboard(Element, component='keyboard.js'): |
|
active = BindableProperty() |
|
|
|
def __init__(self, |
|
on_key: Callable[..., Any], *, |
|
active: bool = True, |
|
repeating: bool = True, |
|
ignore: List[Literal['input', 'select', 'button', 'textarea']] = [ |
|
'input', 'select', 'button', 'textarea'], |
|
) -> None: |
|
"""Keyboard |
|
|
|
Adds global keyboard event tracking. |
|
|
|
:param on_key: callback to be executed when keyboard events occur. |
|
:param active: boolean flag indicating whether the callback should be executed or not (default: `True`) |
|
:param repeating: boolean flag indicating whether held keys should be sent repeatedly (default: `True`) |
|
:param ignore: ignore keys when one of these element types is focussed (default: `['input', 'select', 'button', 'textarea']`) |
|
""" |
|
super().__init__() |
|
self.key_handler = on_key |
|
self.active = active |
|
self._props['events'] = ['keydown', 'keyup'] |
|
self._props['repeating'] = repeating |
|
self._props['ignore'] = ignore |
|
self.on('key', self.handle_key) |
|
|
|
def handle_key(self, e: GenericEventArguments) -> None: |
|
if not self.active: |
|
return |
|
|
|
action = KeyboardAction( |
|
keydown=e.args['action'] == 'keydown', |
|
keyup=e.args['action'] == 'keyup', |
|
repeat=e.args['repeat'], |
|
) |
|
modifiers = KeyboardModifiers( |
|
alt=e.args['altKey'], |
|
ctrl=e.args['ctrlKey'], |
|
meta=e.args['metaKey'], |
|
shift=e.args['shiftKey'], |
|
) |
|
key = KeyboardKey( |
|
name=e.args['key'], |
|
code=e.args['code'], |
|
location=e.args['location'], |
|
) |
|
arguments = KeyEventArguments( |
|
sender=self, |
|
client=self.client, |
|
action=action, |
|
modifiers=modifiers, |
|
key=key, |
|
) |
|
handle_event(self.key_handler, arguments)
|
|
|