diff --git a/system/ui/lib/window.py b/system/ui/lib/window.py index 4907b85d79..81e6455abb 100644 --- a/system/ui/lib/window.py +++ b/system/ui/lib/window.py @@ -1,14 +1,23 @@ import threading import time import os +from typing import Generic, Protocol, TypeVar from openpilot.system.ui.lib.application import gui_app -class BaseWindow: +class RendererProtocol(Protocol): + def render(self): + ... + + +R = TypeVar("R", bound=RendererProtocol) + + +class BaseWindow(Generic[R]): def __init__(self, title: str): self._title = title - self._renderer = None + self._renderer: R | None = None self._stop_event = threading.Event() self._thread = threading.Thread(target=self._run) self._thread.start() @@ -17,7 +26,7 @@ class BaseWindow: while self._renderer is None and self._thread.is_alive(): time.sleep(0.01) - def _create_renderer(self): + def _create_renderer(self) -> R: raise NotImplementedError("Subclasses of BaseWindow must implement _create_renderer()") def _run(self): diff --git a/system/ui/spinner.py b/system/ui/spinner.py index 37582511b0..119bdba3e7 100755 --- a/system/ui/spinner.py +++ b/system/ui/spinner.py @@ -86,7 +86,7 @@ class SpinnerRenderer: FONT_SIZE, 0.0, rl.WHITE) -class Spinner(BaseWindow): +class Spinner(BaseWindow[SpinnerRenderer]): def __init__(self): super().__init__("Spinner") diff --git a/system/ui/text.py b/system/ui/text.py index 56f642dfca..33e8167c64 100755 --- a/system/ui/text.py +++ b/system/ui/text.py @@ -73,7 +73,7 @@ class TextWindowRenderer: return ret -class TextWindow(BaseWindow): +class TextWindow(BaseWindow[TextWindowRenderer]): def __init__(self, text: str): self._text = text super().__init__("Text")