From 0b7a8bc66c44bff645e5309684b508f5332bcc06 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak <dos@dosowisko.net> Date: Sun, 10 Sep 2023 14:21:36 +0200 Subject: [PATCH] py,st3m: ViewManager: Stop the transition after fully drawn This ensures that the last frame of the transition actually gets drawn on the screen before reporting it, which helps applications that want to transition into loading screens. --- python_payload/st3m/ui/view.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/python_payload/st3m/ui/view.py b/python_payload/st3m/ui/view.py index db791cdc9b..36772015b8 100644 --- a/python_payload/st3m/ui/view.py +++ b/python_payload/st3m/ui/view.py @@ -191,6 +191,16 @@ class ViewManager(Responder): self._input = InputController() self._first_think = False + self._fully_drawn = 0 + + def _end_transition(self) -> None: + self._transitioning = False + + if self._incoming is not None: + self._incoming.on_enter_done() + if self._outgoing is not None: + self._outgoing.on_exit_done() + self._outgoing = None def think(self, ins: InputState, delta_ms: int) -> None: self._input.think(ins, delta_ms) @@ -207,15 +217,11 @@ class ViewManager(Responder): self._transition += (delta_ms / 1000.0) * (1000 / self._time_ms) else: self._first_think = False - if self._transition >= 1.0: - self._transition = 0 - self._transitioning = False - if self._incoming is not None: - self._incoming.on_enter_done() - if self._outgoing is not None: - self._outgoing.on_exit_done() - self._outgoing = None + if self._transition >= 1.0: + self._transition = 1.0 + if self._fully_drawn > 3: # TODO: use actual pipeline depth + self._end_transition() if self._outgoing is not None: self._outgoing.think(ins, delta_ms) @@ -224,6 +230,9 @@ class ViewManager(Responder): def draw(self, ctx: Context) -> None: if self._transitioning: + if self._transition >= 1.0: + self._fully_drawn += 1 + vt = self._default_vt if self._overriden_vt is not None: vt = self._overriden_vt @@ -238,7 +247,6 @@ class ViewManager(Responder): self._incoming.draw(ctx) ctx.restore() - def replace( self, r: View, @@ -255,6 +263,7 @@ class ViewManager(Responder): self._transition = 0.0 self._direction = direction self._first_think = True + self._fully_drawn = 0 self._outgoing = self._incoming if self._outgoing is not None: -- GitLab