keyboard.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from pathlib import Path
  2. from typing import Any, Callable, List
  3. from typing_extensions import Literal
  4. from ..binding import BindableProperty
  5. from ..dependencies import register_vue_component
  6. from ..element import Element
  7. from ..events import (GenericEventArguments, KeyboardAction, KeyboardKey, KeyboardModifiers, KeyEventArguments,
  8. handle_event)
  9. component = register_vue_component(Path('keyboard.js'))
  10. class Keyboard(Element):
  11. active = BindableProperty()
  12. def __init__(self,
  13. on_key: Callable[..., Any], *,
  14. active: bool = True,
  15. repeating: bool = True,
  16. ignore: List[Literal['input', 'select', 'button', 'textarea']] = ['input', 'select', 'button', 'textarea'],
  17. ) -> None:
  18. """Keyboard
  19. Adds global keyboard event tracking.
  20. :param on_key: callback to be executed when keyboard events occur.
  21. :param active: boolean flag indicating whether the callback should be executed or not (default: `True`)
  22. :param repeating: boolean flag indicating whether held keys should be sent repeatedly (default: `True`)
  23. :param ignore: ignore keys when one of these element types is focussed (default: `['input', 'select', 'button', 'textarea']`)
  24. """
  25. super().__init__(component.tag)
  26. self.key_handler = on_key
  27. self.active = active
  28. self._props['events'] = ['keydown', 'keyup']
  29. self._props['repeating'] = repeating
  30. self._props['ignore'] = ignore
  31. self.on('key', self.handle_key)
  32. self.use_component(component)
  33. def handle_key(self, e: GenericEventArguments) -> None:
  34. if not self.active:
  35. return
  36. action = KeyboardAction(
  37. keydown=e.args['action'] == 'keydown',
  38. keyup=e.args['action'] == 'keyup',
  39. repeat=e.args['repeat'],
  40. )
  41. modifiers = KeyboardModifiers(
  42. alt=e.args['altKey'],
  43. ctrl=e.args['ctrlKey'],
  44. meta=e.args['metaKey'],
  45. shift=e.args['shiftKey'],
  46. )
  47. key = KeyboardKey(
  48. name=e.args['key'],
  49. code=e.args['code'],
  50. location=e.args['location'],
  51. )
  52. arguments = KeyEventArguments(
  53. sender=self,
  54. client=self.client,
  55. action=action,
  56. modifiers=modifiers,
  57. key=key,
  58. )
  59. return handle_event(self.key_handler, arguments)