Procházet zdrojové kódy

avoid page updates by default

Falko Schindler před 2 roky
rodič
revize
92da80f801

+ 7 - 1
nicegui/elements/color_input.py

@@ -2,6 +2,7 @@ from typing import Callable, Optional
 
 import justpy as jp
 
+from ..task_logger import create_task
 from .string_element import StringElement
 
 
@@ -20,7 +21,8 @@ class ColorInput(StringElement):
             label=label,
             placeholder=placeholder,
             value=value,
-            input=self.handle_change,
+            change=self.handle_change,
+            disable_input_event=True,
             temp=False,
         )
 
@@ -32,5 +34,9 @@ class ColorInput(StringElement):
             </q-icon>''')
         view.add_scoped_slot('append', icon_button)
         icon_button.name_dict['color_input'].on('change', self.handle_change)
+        icon_button.name_dict['color_input'].disable_input_event = True
+        icon_button.name_dict['popup'].on('input', lambda *_: create_task(view.update()) or False)
+        icon_button.name_dict['popup'].on('show', lambda *_: create_task(view.update()) or False)
+        icon_button.name_dict['popup'].on('hide', lambda *_: create_task(view.update()) or False)
 
         super().__init__(view, value=value, on_change=on_change)

+ 5 - 0
nicegui/elements/color_picker.py

@@ -3,6 +3,7 @@ from typing import Callable, Dict
 import justpy as jp
 from nicegui.events import ColorPickEventArguments, handle_event
 
+from ..task_logger import create_task
 from .element import Element
 
 
@@ -23,7 +24,11 @@ class ColorPicker(Element):
         def handle_pick(sender, msg: Dict):
             return handle_event(on_pick, ColorPickEventArguments(sender=self, color=msg.value), update=self.parent_view)
         view.name_dict['color_input'].on('change', handle_pick)
+        view.name_dict['color_input'].disable_input_event = True
         view.name_dict['popup'].value = value
+        view.name_dict['popup'].on('input', lambda *_: create_task(view.update()) or False)
+        view.name_dict['popup'].on('show', lambda *_: create_task(view.update()) or False)
+        view.name_dict['popup'].on('hide', lambda *_: create_task(view.update()) or False)
 
         super().__init__(view)
 

+ 6 - 0
nicegui/elements/colors.py

@@ -1,3 +1,6 @@
+import asyncio
+
+from ..task_logger import create_task
 from .custom_view import CustomView
 from .element import Element
 
@@ -33,3 +36,6 @@ class Colors(Element):
         Sets the main colors (primary, secondary, accent, ...) used by `Quasar <https://quasar.dev/>`_.
         """
         super().__init__(ColorsView(primary, secondary, accent, positive, negative, info, warning))
+
+        if asyncio.get_event_loop().is_running():
+            create_task(self.page.update())

+ 3 - 0
nicegui/elements/dialog.py

@@ -3,6 +3,7 @@ from typing import Any, Optional
 
 import justpy as jp
 
+from ..task_logger import create_task
 from .group import Group
 
 
@@ -24,9 +25,11 @@ class Dialog(Group):
 
     def open(self) -> None:
         self.view.value = True
+        create_task(self.view.update())
 
     def close(self) -> None:
         self.view.value = False
+        create_task(self.view.update())
 
     def __await__(self):
         self._submitted = asyncio.Event()

+ 3 - 3
nicegui/elements/joystick.py

@@ -26,17 +26,17 @@ class JoystickView(CustomView):
 
     def handle_start(self, msg):
         if self.on_start is not None:
-            return self.on_start(msg)
+            return self.on_start(msg) or False
         return False
 
     def handle_move(self, msg):
         if self.on_move is not None:
-            return self.on_move(msg)
+            return self.on_move(msg) or False
         return False
 
     def handle_end(self, msg):
         if self.on_end is not None:
-            return self.on_end(msg)
+            return self.on_end(msg) or False
         return False
 
 

+ 2 - 0
nicegui/elements/menu.py

@@ -1,5 +1,6 @@
 import justpy as jp
 
+from ..task_logger import create_task
 from .group import Group
 
 
@@ -13,6 +14,7 @@ class Menu(Group):
         :param value: whether the menu is already opened (default: `False`)
         """
         view = jp.QMenu(value=value, temp=False)
+        view.on('input', lambda *_: create_task(view.update()) or False)
 
         super().__init__(view)
 

+ 2 - 0
nicegui/elements/menu_item.py

@@ -3,6 +3,7 @@ from typing import Callable, Optional
 import justpy as jp
 
 from ..events import ClickEventArguments, handle_event
+from ..task_logger import create_task
 from .element import Element
 
 
@@ -25,6 +26,7 @@ class MenuItem(Element):
             if auto_close:
                 assert isinstance(self.parent_view, jp.QMenu)
                 self.parent_view.value = False
+                create_task(self.parent_view.update())
             return result
 
         view.on('click', handle_click)

+ 3 - 0
nicegui/elements/tree.py

@@ -2,6 +2,7 @@ from typing import Callable, Optional
 
 import justpy as jp
 from nicegui.events import ValueChangeEventArguments, handle_event
+from nicegui.task_logger import create_task
 
 from .element import Element
 
@@ -29,3 +30,5 @@ class Tree(Element):
             return handle_event(on_select, arguments, update=self.parent_view)
 
         view.on('update:selected', process_event)
+        view.on('update:expanded', lambda *_: create_task(view.update()))
+        view.on('update:ticked', lambda *_: create_task(view.update()))

+ 2 - 2
nicegui/elements/upload.py

@@ -23,7 +23,7 @@ class Upload(Element):
             submit=lambda sender, msg: self.submit(sender, msg),
             temp=False,
         )
-        jp.Input(type='file', multiple=multiple, a=view, temp=False)
+        jp.Input(type='file', multiple=multiple, change=lambda *_: False, a=view, temp=False)
         jp.QBtn(type='submit', text='Upload', color='primary', a=view, temp=False)
 
         super().__init__(view)
@@ -35,7 +35,7 @@ class Upload(Element):
                 if form_data.type == 'file':
                     files = [base64.b64decode(f.file_content) for f in form_data.files]
                     arguments = UploadEventArguments(sender=self, files=files)
-                    if handle_event(self.upload_handler, arguments, update=self.parent_view) is None:
+                    if handle_event(self.upload_handler, arguments, update=self.parent_view):
                         page_update = None
             return page_update
         except Exception:

+ 1 - 3
nicegui/events.py

@@ -235,8 +235,6 @@ def handle_event(handler: Optional[Callable], arguments: EventArguments, *,
                 except Exception:
                     traceback.print_exc()
             create_task(async_handler(), name=str(handler))
-            return False
-        else:
-            return False if result == False else None
+        return False
     except Exception:
         traceback.print_exc()