浏览代码

make dialog awaitable

Falko Schindler 3 年之前
父节点
当前提交
321ee70fff
共有 1 个文件被更改,包括 30 次插入8 次删除
  1. 30 8
      nicegui/elements/dialog.py

+ 30 - 8
nicegui/elements/dialog.py

@@ -1,3 +1,6 @@
+import asyncio
+from typing import Any, Optional
+
 import justpy as jp
 
 from .group import Group
@@ -12,17 +15,36 @@ class Dialog(Group):
 
         :param value: whether the dialog is already opened (default: `False`)
         """
-        view = jp.QDialog(
-            value=value,
-            classes='row items-start bg-red-400',
-            style='gap: 1em',
-            temp=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):
+    def open(self) -> None:
         self.view.value = True
 
-    def close(self):
+    def close(self) -> None:
         self.view.value = False
+
+    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()
+        return False