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.

79 lines
2.7 KiB

4 years ago
  1. from traitlets import (Unicode, Instance, Union, List, Any, Dict)
  2. from ipywidgets import DOMWidget
  3. from ipywidgets.widgets.widget import (widget_serialization, CallbackDispatcher)
  4. from ._version import semver
  5. from .ForceLoad import force_load_instance
  6. class Events(object):
  7. def __init__(self, **kwargs):
  8. self._event_handlers_map = {}
  9. self.on_msg(self._handle_event)
  10. def on_event(self, event_and_modifiers, callback, remove=False):
  11. new_event = event_and_modifiers.split('.')[0]
  12. for existing_event in [event for event in self._event_handlers_map.keys()
  13. if event == new_event or event.startswith(new_event + '.')]:
  14. del self._event_handlers_map[existing_event]
  15. self._event_handlers_map[event_and_modifiers] = CallbackDispatcher()
  16. self._event_handlers_map[event_and_modifiers].register_callback(callback, remove=remove)
  17. if remove and not self._event_handlers_map[event_and_modifiers].callbacks:
  18. del self._event_handlers_map[event_and_modifiers]
  19. difference = set(self._event_handlers_map.keys()) ^ set(self._events)
  20. if len(difference) != 0:
  21. self._events = list(self._event_handlers_map.keys())
  22. def fire_event(self, event, data):
  23. self._event_handlers_map[event](self, event, data)
  24. def _handle_event(self, _, content, buffers):
  25. event = content.get("event", "")
  26. data = content.get("data", {})
  27. self.fire_event(event, data)
  28. class VueWidget(DOMWidget, Events):
  29. # Force the loading of jupyter-vue before dependent extensions when in a static context (embed,
  30. # voila)
  31. _jupyter_vue = Any(force_load_instance, read_only=True).tag(sync=True, **widget_serialization)
  32. _model_name = Unicode('VueModel').tag(sync=True)
  33. _view_name = Unicode('VueView').tag(sync=True)
  34. _view_module = Unicode('jupyter-vue').tag(sync=True)
  35. _model_module = Unicode('jupyter-vue').tag(sync=True)
  36. _view_module_version = Unicode(semver).tag(sync=True)
  37. _model_module_version = Unicode(semver).tag(sync=True)
  38. children = List(Union([
  39. Instance(DOMWidget),
  40. Unicode()
  41. ], default_value=None)).tag(sync=True, **widget_serialization)
  42. slot = Unicode(None, allow_none=True).tag(sync=True)
  43. _events = List(Unicode(), default_value=None, allow_none=True).tag(sync=True)
  44. v_model = Any('!!disabled!!', allow_none=True).tag(sync=True)
  45. style_ = Unicode(None, allow_none=True).tag(sync=True)
  46. class_ = Unicode(None, allow_none=True).tag(sync=True)
  47. attributes = Dict(None, allow_none=True).tag(sync=True)
  48. v_slots = List(Dict()).tag(sync=True, **widget_serialization)
  49. v_on = Unicode(None, allow_none=True).tag(sync=True)
  50. __all__ = ['VueWidget']