|
@@ -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
|