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.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):
         self.text = text

+ 2 - 1
nicegui/elements/keyboard.py

@@ -55,6 +55,7 @@ class Keyboard(Element):
                 code=msg.key_data.code,
                 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:
             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.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)

+ 1 - 1
nicegui/elements/scene.py

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

+ 2 - 1
nicegui/elements/upload.py

@@ -31,6 +31,7 @@ class Upload(Element):
             for form_data in msg.form_data:
                 if form_data.type == 'file':
                     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:
             traceback.print_exc()

+ 2 - 1
nicegui/elements/value_element.py

@@ -25,7 +25,8 @@ class ValueElement(Element):
 
     def handle_change(self, msg):
         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):
         bind_to(self, 'value', target_object, target_name, forward=forward)

+ 7 - 1
nicegui/events.py

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