_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()