Skip to content

Commit 362ddfc

Browse files
authored
ui: replace qt text window with raylib (#35064)
* remove qt text window * use wrapper, render text window in thread * add wait_for_exit method * update imports
1 parent 7eb1c31 commit 362ddfc

File tree

10 files changed

+54
-153
lines changed

10 files changed

+54
-153
lines changed

.gitattributes

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
selfdrive/car/tests/test_models_segs.txt filter=lfs diff=lfs merge=lfs -text
1313
system/hardware/tici/updater filter=lfs diff=lfs merge=lfs -text
14-
selfdrive/ui/qt/text_larch64 filter=lfs diff=lfs merge=lfs -text
1514
third_party/**/*.a filter=lfs diff=lfs merge=lfs -text
1615
third_party/**/*.so filter=lfs diff=lfs merge=lfs -text
1716
third_party/**/*.so.* filter=lfs diff=lfs merge=lfs -text

common/text_window.py

Lines changed: 0 additions & 63 deletions
This file was deleted.

selfdrive/ui/.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ moc_*
33

44
translations/main_test_en.*
55

6-
_text
7-
86
ui
97
mui
108
watch3

selfdrive/ui/SConscript

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ if GetOption('extras'):
6666

6767
qt_env.SharedLibrary("qt/python_helpers", ["qt/qt_window.cc"], LIBS=qt_libs)
6868

69-
# text window
70-
qt_env.Program("_text", ["qt/text.cc"], LIBS=qt_libs)
71-
7269
# setup and factory resetter
7370
qt_env.Program("qt/setup/reset", ["qt/setup/reset.cc"], LIBS=qt_libs)
7471
qt_env.Program("qt/setup/setup", ["qt/setup/setup.cc", asset_obj],

selfdrive/ui/qt/text.cc

Lines changed: 0 additions & 64 deletions
This file was deleted.

selfdrive/ui/qt/text_larch64

Lines changed: 0 additions & 3 deletions
This file was deleted.

selfdrive/ui/text

Lines changed: 0 additions & 7 deletions
This file was deleted.

system/manager/build.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55

66
# NOTE: Do NOT import anything here that needs be built (e.g. params)
77
from openpilot.common.basedir import BASEDIR
8-
from openpilot.common.text_window import TextWindow
98
from openpilot.common.swaglog import cloudlog, add_file_handler
109
from openpilot.system.hardware import HARDWARE, AGNOS
1110
from openpilot.system.ui.spinner import Spinner
11+
from openpilot.system.ui.text import TextWindow
1212
from openpilot.system.version import get_build_metadata
1313

1414
MAX_CACHE_SIZE = 4e9 if "CI" in os.environ else 2e9

system/manager/manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import cereal.messaging as messaging
1010
import openpilot.system.sentry as sentry
1111
from openpilot.common.params import Params, ParamKeyType
12-
from openpilot.common.text_window import TextWindow
1312
from openpilot.system.hardware import HARDWARE
1413
from openpilot.system.manager.helpers import unblock_stdout, write_onroad_params, save_bootlog
1514
from openpilot.system.manager.process import ensure_running
@@ -18,6 +17,7 @@
1817
from openpilot.common.swaglog import cloudlog, add_file_handler
1918
from openpilot.system.version import get_build_metadata, terms_version, training_version
2019
from openpilot.system.hardware.hw import Paths
20+
from openpilot.system.ui.text import TextWindow
2121

2222

2323
def manager_init() -> None:

system/ui/text.py

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#!/usr/bin/env python3
2+
import os
23
import re
4+
import threading
5+
import time
36
import pyray as rl
47
from openpilot.system.hardware import HARDWARE, PC
58
from openpilot.system.ui.lib.button import gui_button, ButtonStyle
@@ -42,7 +45,8 @@ def wrap_text(text, font_size, max_width):
4245

4346
return lines
4447

45-
class TextWindow:
48+
49+
class TextWindowRenderer:
4650
def __init__(self, text: str):
4751
self._textarea_rect = rl.Rectangle(MARGIN, MARGIN, gui_app.width - MARGIN * 2, gui_app.height - MARGIN * 2)
4852
self._wrapped_lines = wrap_text(text, FONT_SIZE, self._textarea_rect.width - 20)
@@ -70,13 +74,53 @@ def render(self):
7074
return ret
7175

7276

73-
def show_text_in_window(text: str):
74-
gui_app.init_window("Text")
75-
text_window = TextWindow(text)
76-
for _ in gui_app.render():
77-
text_window.render()
78-
gui_app.close()
77+
class TextWindow:
78+
def __init__(self, text: str):
79+
self._text = text
80+
81+
self._renderer: TextWindowRenderer | None = None
82+
self._stop_event = threading.Event()
83+
self._thread = threading.Thread(target=self._run)
84+
self._thread.start()
85+
86+
# wait for the renderer to be initialized
87+
while self._renderer is None and self._thread.is_alive():
88+
time.sleep(0.01)
89+
90+
def wait_for_exit(self):
91+
while self._thread.is_alive():
92+
time.sleep(0.01)
93+
94+
def _run(self):
95+
if os.getenv("CI") is not None:
96+
return
97+
gui_app.init_window("Text")
98+
self._renderer = renderer = TextWindowRenderer(self._text)
99+
try:
100+
for _ in gui_app.render():
101+
if self._stop_event.is_set():
102+
break
103+
renderer.render()
104+
finally:
105+
gui_app.close()
106+
107+
def __enter__(self):
108+
return self
109+
110+
def close(self):
111+
if self._thread.is_alive():
112+
self._stop_event.set()
113+
self._thread.join(timeout=2.0)
114+
if self._thread.is_alive():
115+
print("WARNING: failed to join text window thread")
116+
117+
def __del__(self):
118+
self.close()
119+
120+
def __exit__(self, exc_type, exc_val, exc_tb):
121+
self.close()
79122

80123

81124
if __name__ == "__main__":
82-
show_text_in_window(DEMO_TEXT)
125+
with TextWindow(DEMO_TEXT):
126+
time.sleep(5)

0 commit comments

Comments
 (0)