/ client_code / utils / _view_transition.py
_view_transition.py
 1  # SPDX-License-Identifier: MIT
 2  #
 3  # Copyright (c) 2021 The Anvil Extras project team members listed at
 4  # https://github.com/anvilistas/anvil-extras/graphs/contributors
 5  #
 6  # This software is published at https://github.com/anvilistas/anvil-extras
 7  
 8  from time import sleep
 9  
10  from anvil.js.window import document, setTimeout
11  
12  from ._deferred import Deferred
13  
14  __version__ = "3.1.0"
15  
16  _transition = None
17  _can_transition = hasattr(document, "startViewTransition")
18  _use_transition = True
19  
20  
21  def use_transitions(can_transition=True):
22      global _use_transition
23      _use_transition = can_transition
24  
25  
26  class ViewTransition:
27      def __init__(self, form):
28          self.deferred = Deferred()
29          self.form = form
30          self.transition = None
31          try:
32              handlers = form.get_event_handlers("show")
33              form.set_event_handler("show", self.show)
34              # make us the first show event handler and re-add existing
35              for handler in handlers:
36                  form.add_event_handler("show", handler)
37          except Exception:
38              pass
39  
40      def resolve(self):
41          global _transition
42          if _transition is self.transition:
43              _transition = None
44          self.deferred.resolve(None)
45  
46      def show(self, **event_args):
47          self.resolve()
48          try:
49              self.form.remove_event_handler("show", self.show)
50          except Exception:
51              pass
52  
53      def __enter__(self):
54          global _transition
55          if _transition is None and _can_transition and _use_transition:
56              self.transition = document.startViewTransition(
57                  lambda: self.deferred.promise
58              )
59              _transition = self.transition
60              sleep(0)
61              setTimeout(self.resolve, 100)
62          return self
63  
64      def __exit__(self, *exc_args):
65          self.resolve()