1+ from __future__ import annotations
2+
13import asyncio
24from functools import wraps
35from threading import Thread
46from queue import Queue as SyncQueue
7+ from idom .core .proto import ComponentType
58
69import ipywidgets as widgets
710from IPython .display import display as ipython_display
811from traitlets import Unicode
9- from idom import Module
10- from idom .config import IDOM_CLIENT_IMPORT_SOURCE_URL
1112from idom .core .layout import Layout , LayoutEvent , LayoutUpdate
12-
13- from .jupyter_server_extension import import_source_url_prefix
13+ from idom .core .dispatcher import VdomJsonPatch , render_json_patch
1414
1515
1616_JUPYTER_SERVER_BASE_URL = ""
17- IDOM_CLIENT_IMPORT_SOURCE_URL .set (f"./{ import_source_url_prefix } " )
1817
1918
2019def set_jupyter_server_base_url (base_url ):
@@ -62,29 +61,26 @@ class LayoutWidget(widgets.DOMWidget):
6261 _model_module_version = Unicode ("^0.4.0" ).tag (sync = True )
6362
6463 _jupyter_server_base_url = Unicode ().tag (sync = True )
65- _client_module_url = Unicode (default_value = Module ("idom-client-react" ).url ).tag (
66- sync = True
67- )
6864
69- def __init__ (self , element ):
65+ def __init__ (self , component : ComponentType ):
7066 super ().__init__ (_jupyter_server_base_url = _JUPYTER_SERVER_BASE_URL )
7167 self ._idom_model = {}
7268 self ._idom_views = set ()
73- self ._idom_layout = Layout (element )
69+ self ._idom_layout = Layout (component )
7470 self ._idom_loop = _spawn_threaded_event_loop (self ._idom_layout_render_loop ())
75- self .on_msg (self ._idom_on_msg )
71+ self .on_msg (lambda _ , * args , ** kwargs : self ._idom_on_msg ( * args , ** kwargs ) )
7672
77- @staticmethod
7873 def _idom_on_msg (self , message , buffers ):
7974 m_type = message .get ("type" )
8075 if m_type == "client-ready" :
8176 v_id = message ["viewID" ]
8277 self ._idom_views .add (v_id )
83- update = LayoutUpdate .create_from ({}, self ._idom_model )
84- self .send ({"viewID" : v_id , "data" : update })
78+ update = LayoutUpdate ("" , None , self ._idom_model )
79+ diff = VdomJsonPatch .create_from (update )
80+ self .send ({"viewID" : v_id , "data" : diff })
8581 elif m_type == "dom-event" :
8682 asyncio .run_coroutine_threadsafe (
87- self ._idom_layout .dispatch (LayoutEvent (** message ["data" ])),
83+ self ._idom_layout .deliver (LayoutEvent (** message ["data" ])),
8884 loop = self ._idom_loop ,
8985 )
9086 elif m_type == "client-removed" :
@@ -93,13 +89,15 @@ def _idom_on_msg(self, message, buffers):
9389 self ._idom_views .remove (message ["viewID" ])
9490
9591 async def _idom_layout_render_loop (self ):
96- async with self ._idom_layout :
92+ with self ._idom_layout :
9793 while True :
98- update = await self ._idom_layout .render ()
99-
100- self ._idom_model = update .apply_to (self ._idom_model )
94+ diff = await render_json_patch (self ._idom_layout )
95+ self ._idom_model = diff .apply_to (self ._idom_model )
10196 for v_id in self ._idom_views :
102- self .send ({"viewID" : v_id , "data" : update })
97+ self .send ({"viewID" : v_id , "data" : diff })
98+
99+ def __repr__ (self ) -> str :
100+ return f"LayoutWidget({ self ._idom_layout } )"
103101
104102
105103def _spawn_threaded_event_loop (coro ):
0 commit comments