Browse Source

update ui.dialog

Falko Schindler 2 năm trước cách đây
mục cha
commit
1c2402c42c
4 tập tin đã thay đổi với 48 bổ sung57 xóa
  1. 2 2
      api_docs_and_examples.py
  2. 45 0
      nicegui/elements/dialog.py
  3. 0 55
      nicegui/elements/old/dialog.py
  4. 1 0
      nicegui/ui.py

+ 2 - 2
api_docs_and_examples.py

@@ -465,7 +465,7 @@ For more artistic control you can nest tooltip elements and apply props, classes
     def notify_example():
         ui.button('Say hi!', on_click=lambda: ui.notify('Hi!', close_button='OK'))
 
-    # @example(ui.dialog)
+    @example(ui.dialog, skip=False)
     def dialog_example():
         with ui.dialog() as dialog, ui.card():
             ui.label('Hello world!')
@@ -478,7 +478,7 @@ For more artistic control you can nest tooltip elements and apply props, classes
 Dialogs can be awaited.
 Use the `submit` method to close the dialog and return a result.
 Canceling the dialog by clicking in the background or pressing the escape key yields `None`.
-''')
+''', skip=False)
     def async_dialog_example():
         with ui.dialog() as dialog, ui.card():
             ui.label('Are you sure?')

+ 45 - 0
nicegui/elements/dialog.py

@@ -0,0 +1,45 @@
+import asyncio
+from typing import Any
+
+from .mixins.value_element import ValueElement
+
+
+class Dialog(ValueElement):
+
+    def __init__(self, *, value: bool = False) -> None:
+        """Dialog
+
+        Creates a dialog.
+        By default it is non-modal.
+        To make it modal, set `.props('persistent')` on the dialog element.
+
+        :param value: whether the dialog is already opened (default: `False`)
+        """
+        super().__init__(tag='q-dialog', value=value, on_value_change=None)
+        self._result: Any = None
+        self._submitted = asyncio.Event()
+
+    def open(self) -> None:
+        self.value = True
+
+    def close(self) -> None:
+        self.value = False
+
+    def __await__(self):
+        self._result = None
+        self._submitted.clear()
+        self.open()
+        yield from self._submitted.wait().__await__()
+        result = self._result
+        self.close()
+        return result
+
+    def submit(self, result: Any) -> None:
+        self._result = result
+        self._submitted.set()
+
+    def on_value_change(self, value: Any) -> None:
+        super().on_value_change(value)
+        if not self.value:
+            self._result = None
+            self._submitted.set()

+ 0 - 55
nicegui/elements/old/dialog.py

@@ -1,55 +0,0 @@
-import asyncio
-from typing import Any, Optional
-
-import justpy as jp
-
-from .group import Group
-
-
-class Dialog(Group):
-
-    def __init__(self, *, value: bool = False):
-        """Dialog
-
-        Creates a dialog.
-        By default it is non-modal.
-        To make it modal, set `.props('persistent')` on the dialog element.
-
-        :param value: whether the dialog is already opened (default: `False`)
-        """
-        view = jp.QDialog(value=value, input=self._on_input, temp=False)
-
-        self._submitted: Optional[asyncio.Event] = None
-        self._result: Any = None
-
-        super().__init__(view)
-
-    def open(self) -> None:
-        self.view.value = True
-        self.update()
-
-    def close(self) -> None:
-        self.view.value = False
-        self.update()
-
-    def __await__(self):
-        self._submitted = asyncio.Event()
-        self._submitted.clear()
-        self._result = None
-        self.open()
-        yield from self.view.update().__await__()
-        yield from self._submitted.wait().__await__()
-        self.close()
-        return self._result
-
-    def submit(self, result: Any) -> bool:
-        self._result = result
-        self._submitted.set()
-        return False
-
-    def _on_input(self, *_) -> bool:
-        self._result = None
-        if self._submitted is not None:
-            self._submitted.set()
-        self.update()
-        return False

+ 1 - 0
nicegui/ui.py

@@ -6,6 +6,7 @@ from .elements.card import CardSection as card_section
 from .elements.checkbox import Checkbox as checkbox
 from .elements.colors import Colors as colors
 from .elements.column import Column as column
+from .elements.dialog import Dialog as dialog
 from .elements.expansion import Expansion as expansion
 from .elements.html import Html as html
 from .elements.icon import Icon as icon