Browse Source

update parent view after async event handlers

Falko Schindler 3 years ago
parent
commit
c17f289504

+ 1 - 1
nicegui/elements/button.py

@@ -25,7 +25,7 @@ class Button(Element):
         self.text = text
         self.text = text
         self.bind_text_to(self.view, 'label')
         self.bind_text_to(self.view, 'label')
 
 
-        view.on('click', lambda *_: handle_event(on_click, ClickEventArguments(sender=self)))
+        view.on('click', lambda *_: handle_event(on_click, ClickEventArguments(sender=self), update=self.parent_view))
 
 
     def set_text(self, text: str):
     def set_text(self, text: str):
         self.text = text
         self.text = text

+ 2 - 1
nicegui/elements/keyboard.py

@@ -55,6 +55,7 @@ class Keyboard(Element):
                 code=msg.key_data.code,
                 code=msg.key_data.code,
                 location=msg.key_data.location,
                 location=msg.key_data.location,
             )
             )
-            handle_event(self.key_handler, KeyEventArguments(sender=self, action=action, modifiers=modifiers, key=key))
+            arguments = KeyEventArguments(sender=self, action=action, modifiers=modifiers, key=key)
+            handle_event(self.key_handler, arguments, update=self.parent_view)
         except Exception:
         except Exception:
             traceback.print_exc()
             traceback.print_exc()

+ 1 - 1
nicegui/elements/menu_item.py

@@ -20,6 +20,6 @@ class MenuItem(Element):
         """
         """
         view = jp.QItem(text=text, clickable=True)
         view = jp.QItem(text=text, clickable=True)
 
 
-        view.on('click', lambda *_: handle_event(on_click, ClickEventArguments(sender=self)))
+        view.on('click', lambda *_: handle_event(on_click, ClickEventArguments(sender=self), update=self.parent_view))
 
 
         super().__init__(view)
         super().__init__(view)

+ 1 - 1
nicegui/elements/scene.py

@@ -29,7 +29,7 @@ class SceneView(CustomView):
         try:
         try:
             for hit in msg.hits:
             for hit in msg.hits:
                 hit.object = self.objects.get(hit.object_id)
                 hit.object = self.objects.get(hit.object_id)
-            handle_event(self.on_click, msg)
+            handle_event(self.on_click, msg, update=self)
             return False
             return False
         except:
         except:
             traceback.print_exc()
             traceback.print_exc()

+ 2 - 1
nicegui/elements/upload.py

@@ -31,6 +31,7 @@ class Upload(Element):
             for form_data in msg.form_data:
             for form_data in msg.form_data:
                 if form_data.type == 'file':
                 if form_data.type == 'file':
                     files = [base64.b64decode(f.file_content) for f in form_data.files]
                     files = [base64.b64decode(f.file_content) for f in form_data.files]
-                    handle_event(self.upload_handler, UploadEventArguments(sender=self, files=files))
+                    arguments = UploadEventArguments(sender=self, files=files)
+                    handle_event(self.upload_handler, arguments, update=self.parent_view)
         except Exception:
         except Exception:
             traceback.print_exc()
             traceback.print_exc()

+ 2 - 1
nicegui/elements/value_element.py

@@ -25,7 +25,8 @@ class ValueElement(Element):
 
 
     def handle_change(self, msg):
     def handle_change(self, msg):
         self.value = msg['value']
         self.value = msg['value']
-        handle_event(self.change_handler, ValueChangeEventArguments(sender=self, value=self.value))
+        arguments = ValueChangeEventArguments(sender=self, value=self.value)
+        handle_event(self.change_handler, arguments, update=self.parent_view)
 
 
     def bind_value_to(self, target_object, target_name, *, forward=lambda x: x):
     def bind_value_to(self, target_object, target_name, *, forward=lambda x: x):
         bind_to(self, 'value', target_object, target_name, forward=forward)
         bind_to(self, 'value', target_object, target_name, forward=forward)

+ 7 - 1
nicegui/events.py

@@ -1,5 +1,6 @@
 import asyncio
 import asyncio
 from inspect import signature
 from inspect import signature
+from justpy.htmlcomponents import HTMLBaseComponent
 from pydantic import BaseModel
 from pydantic import BaseModel
 import traceback
 import traceback
 from typing import Any, Awaitable, Callable, List, Optional, Union
 from typing import Any, Awaitable, Callable, List, Optional, Union
@@ -196,7 +197,10 @@ class KeyEventArguments(EventArguments):
     modifiers: KeyboardModifiers
     modifiers: KeyboardModifiers
 
 
 
 
-def handle_event(handler: Optional[Union[Callable, Awaitable]], arguments: EventArguments):
+def handle_event(handler: Optional[Union[Callable, Awaitable]],
+                 arguments: EventArguments,
+                 *,
+                 update: Optional[HTMLBaseComponent] = None):
     try:
     try:
         if handler is None:
         if handler is None:
             return
             return
@@ -206,6 +210,8 @@ def handle_event(handler: Optional[Union[Callable, Awaitable]], arguments: Event
             async def async_handler():
             async def async_handler():
                 try:
                 try:
                     await result
                     await result
+                    if update is not None:
+                        await update.update()
                 except Exception:
                 except Exception:
                     traceback.print_exc()
                     traceback.print_exc()
             asyncio.get_event_loop().create_task(async_handler())
             asyncio.get_event_loop().create_task(async_handler())