Procházet zdrojové kódy

replace scene connect handler with ui.on_connect

Falko Schindler před 2 roky
rodič
revize
0c841bd143

+ 6 - 2
nicegui/client.py

@@ -52,6 +52,10 @@ class Client:
     def ip(self) -> Optional[str]:
         return self.environ.get('REMOTE_ADDR') if self.environ else None
 
+    @property
+    def room(self) -> str:
+        return globals._current_socket_ids[-1] if globals._use_current_socket[-1] else self.id
+
     @property
     def has_socket_connection(self) -> bool:
         return self.environ is not None
@@ -98,7 +102,7 @@ class Client:
             'code': code,
             'request_id': request_id if respond else None,
         }
-        create_task(globals.sio.emit('run_javascript', command, room=self.id))
+        create_task(globals.sio.emit('run_javascript', command, room=self.room))
         if not respond:
             return None
         deadline = time.time() + timeout
@@ -110,4 +114,4 @@ class Client:
 
     def open(self, target: Union[Callable, str]) -> None:
         path = target if isinstance(target, str) else globals.page_routes[target]
-        create_task(globals.sio.emit('open', path, room=self.id))
+        create_task(globals.sio.emit('open', path, room=self.room))

+ 2 - 2
nicegui/element.py

@@ -168,13 +168,13 @@ class Element(ABC, Visibility):
             return
         ids = self.collect_descendant_ids()
         elements = {id: self.client.elements[id].to_dict() for id in ids}
-        create_task(globals.sio.emit('update', {'elements': elements}, room=self.client.id))
+        create_task(globals.sio.emit('update', {'elements': elements}, room=self.client.room))
 
     def run_method(self, name: str, *args: Any) -> None:
         if not globals.loop:
             return
         data = {'id': self.id, 'name': name, 'args': args}
-        create_task(globals.sio.emit('run_method', data, room=globals._socketio_id or self.client.id))
+        create_task(globals.sio.emit('run_method', data, room=self.client.room))
 
     def clear(self) -> None:
         descendants = [self.client.elements[id] for id in self.collect_descendant_ids()[1:]]

+ 0 - 12
nicegui/elements/scene.js

@@ -134,21 +134,9 @@ export default {
 
     this.texture_loader = new THREE.TextureLoader();
     this.stl_loader = new THREE.STLLoader();
-
-    this.is_initialized = false;
-    const sendConnectEvent = async () => {
-      if (window.socket.id === undefined) return;
-      if (!this.is_initialized) {
-        this.$emit("connect", window.socket.id);
-      } else clearInterval(connectInterval);
-    };
-    const connectInterval = setInterval(sendConnectEvent, 100);
   },
 
   methods: {
-    init() {
-      this.is_initialized = true;
-    },
     create(type, id, parent_id, ...args) {
       let mesh;
       if (type == "group") {

+ 5 - 8
nicegui/elements/scene.py

@@ -1,10 +1,11 @@
 from dataclasses import dataclass
 from typing import Callable, Dict, List, Optional, Union
 
+from .. import globals
 from ..dependencies import register_component
 from ..element import Element
 from ..events import SceneClickEventArguments, SceneClickHit, handle_event
-from ..globals import socketio_id
+from ..functions.lifecycle import on_connect
 from .scene_object3d import Object3D
 from .scene_objects import Scene as SceneObject
 
@@ -71,18 +72,14 @@ class Scene(Element):
         self.stack: List[Union[Object3D, SceneObject]] = [SceneObject()]
         self.camera: SceneCamera = SceneCamera()
         self.on_click = on_click
-        self.on('connect', self.handle_connect)
         self.on('click3d', self.handle_click)
+        on_connect(self.handle_connect)
 
-    def handle_connect(self, x) -> None:
-        if not 'args' in x:
-            raise Exception('no args')
-        with socketio_id(x['args']):
-            self.run_method('init')
+    def handle_connect(self) -> None:
+        with globals.current_socket():
             self.move_camera(duration=0)
             for object in self.objects.values():
                 object.send()
-        return 'bam2'
 
     def handle_click(self, msg: Dict) -> None:
         arguments = SceneClickEventArguments(

+ 1 - 1
nicegui/functions/notify.py

@@ -24,4 +24,4 @@ def notify(message: str, *,
     Note: You can pass additional keyword arguments according to `Quasar's Notify API <https://quasar.dev/quasar-plugins/notify#notify-api>`_.
     """
     options = {key: value for key, value in locals().items() if not key.startswith('_') and value is not None}
-    create_task(globals.sio.emit('notify', options, room=globals.get_client().id))
+    create_task(globals.sio.emit('notify', options, room=globals.get_client().room))

+ 11 - 4
nicegui/globals.py

@@ -36,11 +36,12 @@ dark: Optional[bool]
 binding_refresh_interval: float
 excludes: List[str]
 socket_io_js_extra_headers: Dict = {}
-_socketio_id: Optional[str] = None
 
 slot_stacks: Dict[int, List['Slot']] = {}
 clients: Dict[str, 'Client'] = {}
 index_client: 'Client'
+_current_socket_ids: List[str] = []
+_use_current_socket: List[bool] = [False]
 
 page_routes: Dict[Callable, str] = {}
 favicons: Dict[str, Optional[str]] = {}
@@ -80,7 +81,13 @@ def get_client() -> 'Client':
 
 @contextmanager
 def socketio_id(id: str) -> None:
-    global _socketio_id
-    _socketio_id = id
+    _current_socket_ids.append(id)
     yield
-    _socketio_id = None
+    _current_socket_ids.pop()
+
+
+@contextmanager
+def current_socket() -> None:
+    _use_current_socket.append(True)
+    yield
+    _use_current_socket.pop()

+ 1 - 1
nicegui/nicegui.py

@@ -94,7 +94,7 @@ async def handle_handshake(sid: str) -> bool:
         return False
     client.environ = sio.get_environ(sid)
     sio.enter_room(sid, client.id)
-    with client:
+    with client, globals.socketio_id(sid):
         for t in client.connect_handlers:
             safe_invoke(t)
     return True