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