diff libervia/web/pages/_browser/dialog.py @ 1549:e47c24204449

browser (calls): update call to handle search, control buttons, and better UI/UX: - adapt to backend changes - UI and WebRTC parts are not separated - users can now be searched - add mute/fullscreen buttons - ring - cancellable dialog when a call is received - status of the call - animations - various UI/UX improvments rel 423
author Goffi <goffi@goffi.org>
date Wed, 09 Aug 2023 00:22:18 +0200
parents eb00d593801d
children 7228fc3c4744
line wrap: on
line diff
--- a/libervia/web/pages/_browser/dialog.py	Wed Aug 09 00:22:16 2023 +0200
+++ b/libervia/web/pages/_browser/dialog.py	Wed Aug 09 00:22:18 2023 +0200
@@ -6,6 +6,10 @@
 log.warning = log.warn
 
 
+class CancelError(Exception):
+    """Dialog is cancelled"""
+
+
 class Confirm:
 
     def __init__(self, message, ok_label="", cancel_label="", ok_color="success"):
@@ -15,26 +19,63 @@
         assert ok_color in ("success", "danger")
         self.ok_color = ok_color
         self.cancel_label = cancel_label
+        self.reset()
 
-    def cancel_cb(self, evt, notif_elt):
+    def reset(self):
+        """Reset values of callbacks and notif element"""
+        self._ok_cb = None
+        self._cancel_cb = None
+        self._reject_cb = None
+        self._notif_elt = None
+
+    def _default_cancel_cb(self, evt, notif_elt):
         notif_elt.remove()
 
-    def show(self, ok_cb, cancel_cb=None):
+    def cancel(self):
+        """Cancel the dialog, without calling any callback
+
+        will raise a CancelError
+        """
+        if self._notif_elt is None:
+            log.warning("calling cancel on an unshown dialog")
+        else:
+            self._notif_elt.remove()
+            if self._reject_cb is not None:
+                self._reject_cb(CancelError)
+            else:
+                log.warning("no reject callback set")
+        self.reset()
+
+    def on_ok_click(self, evt):
+        assert self._ok_cb is not None
+        self._ok_cb(evt, self._notif_elt)
+        self.reset()
+
+    def on_cancel_click(self, evt) -> None:
+        assert self._cancel_cb is not None
+        self._cancel_cb(evt, self._notif_elt)
+        self.reset()
+
+    def show(self, ok_cb, cancel_cb=None, reject_cb=None):
         if cancel_cb is None:
-            cancel_cb = self.cancel_cb
+            cancel_cb = self._default_cancel_cb
+        self._ok_cb = ok_cb
+        self._cancel_cb = cancel_cb
+        self._reject_cb = reject_cb
         notif_elt = self._tpl.get_elt({
             "message": self.message,
             "ok_label": self.ok_label,
             "ok_color": self.ok_color,
             "cancel_label": self.cancel_label,
         })
+        self._notif_elt = notif_elt
 
         document['notifs_area'] <= notif_elt
         timer.set_timeout(lambda: notif_elt.classList.add('state_appended'), 0)
-        for cancel_elt in notif_elt.select(".click_to_cancel"):
-            cancel_elt.bind("click", lambda evt: cancel_cb(evt, notif_elt))
-        for cancel_elt in notif_elt.select(".click_to_ok"):
-            cancel_elt.bind("click", lambda evt: ok_cb(evt, notif_elt))
+        for ok_elt in notif_elt.select(".click_to_ok"):
+            ok_elt.bind("click", self.on_ok_click)
+        for ok_elt in notif_elt.select(".click_to_cancel"):
+            ok_elt.bind("click", self.on_cancel_click)
 
     def _ashow_cb(self, evt, notif_elt, resolve_cb, confirmed):
         evt.stopPropagation()
@@ -46,7 +87,8 @@
             lambda resolve_cb, reject_cb:
             self.show(
                 lambda evt, notif_elt: self._ashow_cb(evt, notif_elt, resolve_cb, True),
-                lambda evt, notif_elt: self._ashow_cb(evt, notif_elt, resolve_cb, False)
+                lambda evt, notif_elt: self._ashow_cb(evt, notif_elt, resolve_cb, False),
+                reject_cb
             )
         )