|
from traitlets import (Unicode, Instance, Union, List, Any, Dict)
|
|
from ipywidgets import DOMWidget
|
|
from ipywidgets.widgets.widget import (widget_serialization, CallbackDispatcher)
|
|
from ._version import semver
|
|
from .ForceLoad import force_load_instance
|
|
|
|
|
|
class Events(object):
|
|
def __init__(self, **kwargs):
|
|
self._event_handlers_map = {}
|
|
self.on_msg(self._handle_event)
|
|
|
|
def on_event(self, event_and_modifiers, callback, remove=False):
|
|
new_event = event_and_modifiers.split('.')[0]
|
|
for existing_event in [event for event in self._event_handlers_map.keys()
|
|
if event == new_event or event.startswith(new_event + '.')]:
|
|
del self._event_handlers_map[existing_event]
|
|
|
|
self._event_handlers_map[event_and_modifiers] = CallbackDispatcher()
|
|
|
|
self._event_handlers_map[event_and_modifiers].register_callback(callback, remove=remove)
|
|
|
|
if remove and not self._event_handlers_map[event_and_modifiers].callbacks:
|
|
del self._event_handlers_map[event_and_modifiers]
|
|
|
|
difference = set(self._event_handlers_map.keys()) ^ set(self._events)
|
|
if len(difference) != 0:
|
|
self._events = list(self._event_handlers_map.keys())
|
|
|
|
def fire_event(self, event, data):
|
|
self._event_handlers_map[event](self, event, data)
|
|
|
|
def _handle_event(self, _, content, buffers):
|
|
event = content.get("event", "")
|
|
data = content.get("data", {})
|
|
self.fire_event(event, data)
|
|
|
|
|
|
class VueWidget(DOMWidget, Events):
|
|
|
|
# Force the loading of jupyter-vue before dependent extensions when in a static context (embed,
|
|
# voila)
|
|
_jupyter_vue = Any(force_load_instance, read_only=True).tag(sync=True, **widget_serialization)
|
|
|
|
_model_name = Unicode('VueModel').tag(sync=True)
|
|
|
|
_view_name = Unicode('VueView').tag(sync=True)
|
|
|
|
_view_module = Unicode('jupyter-vue').tag(sync=True)
|
|
|
|
_model_module = Unicode('jupyter-vue').tag(sync=True)
|
|
|
|
_view_module_version = Unicode(semver).tag(sync=True)
|
|
|
|
_model_module_version = Unicode(semver).tag(sync=True)
|
|
|
|
children = List(Union([
|
|
Instance(DOMWidget),
|
|
Unicode()
|
|
], default_value=None)).tag(sync=True, **widget_serialization)
|
|
|
|
slot = Unicode(None, allow_none=True).tag(sync=True)
|
|
|
|
_events = List(Unicode(), default_value=None, allow_none=True).tag(sync=True)
|
|
|
|
v_model = Any('!!disabled!!', allow_none=True).tag(sync=True)
|
|
|
|
style_ = Unicode(None, allow_none=True).tag(sync=True)
|
|
|
|
class_ = Unicode(None, allow_none=True).tag(sync=True)
|
|
|
|
attributes = Dict(None, allow_none=True).tag(sync=True)
|
|
|
|
v_slots = List(Dict()).tag(sync=True, **widget_serialization)
|
|
|
|
v_on = Unicode(None, allow_none=True).tag(sync=True)
|
|
|
|
|
|
__all__ = ['VueWidget']
|