Skip to content

Commit 8277cd1

Browse files
committed
child widgets!
1 parent 024e2af commit 8277cd1

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

system/ui/widgets/__init__.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import abc
44
import pyray as rl
55
from enum import IntEnum
6+
from typing import TypeVar
67
from collections.abc import Callable
78
from openpilot.system.ui.lib.application import gui_app, MousePos, MAX_TOUCH_SLOTS, MouseEvent
89

@@ -14,6 +15,9 @@ class Device:
1415
device = Device()
1516

1617

18+
W = TypeVar('W', bound='Widget')
19+
20+
1721
class DialogResult(IntEnum):
1822
CANCEL = 0
1923
CONFIRM = 1
@@ -22,6 +26,7 @@ class DialogResult(IntEnum):
2226

2327
class Widget(abc.ABC):
2428
def __init__(self):
29+
self._children: list[Widget] = []
2530
self._rect: rl.Rectangle = rl.Rectangle(0, 0, 0, 0)
2631
self._parent_rect: rl.Rectangle | None = None
2732
self.__is_pressed = [False] * MAX_TOUCH_SLOTS
@@ -197,12 +202,24 @@ def _handle_mouse_event(self, mouse_event: MouseEvent) -> None:
197202
"""Optionally handle mouse events. This is called before rendering."""
198203
# Default implementation does nothing, can be overridden by subclasses
199204

205+
def _child(self, widget: W) -> W:
206+
"""Register a widget as a child. Lifecycle events (show/hide) propagate to registered children."""
207+
self._children.append(widget)
208+
return widget
209+
200210
def show_event(self):
201-
"""Optionally handle show event. Parent must manually call this"""
202-
# TODO: iterate through all child objects, check for subclassing from Widget/Layout (Scroller)
211+
"""Called when widget becomes visible. Propagates to registered children."""
212+
print(f"show_event: {type(self).__name__}")
213+
for child in self._children:
214+
print(f" show_event: {type(self).__name__} -> {type(child).__name__}")
215+
child.show_event()
203216

204217
def hide_event(self):
205-
"""Optionally handle hide event. Parent must manually call this"""
218+
"""Called when widget is hidden. Propagates to registered children."""
219+
print(f"hide_event: {type(self).__name__}")
220+
for child in self._children:
221+
print(f" hide_event: {type(self).__name__} -> {type(child).__name__}")
222+
child.hide_event()
206223

207224
def dismiss(self, callback: Callable[[], None] | None = None):
208225
"""Immediately dismiss the widget, firing the callback after."""

system/ui/widgets/nav_widget.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def __init__(self):
6969
self._shown_callback: Callable[[], None] | None = None # transient callback fired after show animation completes
7070

7171
# TODO: move this state into NavBar
72-
self._nav_bar = NavBar()
72+
self._nav_bar = self._child(NavBar())
7373
self._nav_bar_show_time = 0.0
7474
self._nav_bar_y_filter = FirstOrderFilter(0.0, 0.1, 1 / gui_app.target_fps)
7575

@@ -214,7 +214,6 @@ def dismiss(self, callback: Callable[[], None] | None = None):
214214

215215
def show_event(self):
216216
super().show_event()
217-
self._nav_bar.show_event()
218217

219218
# Reset state
220219
self._drag_start_pos = None

system/ui/widgets/scroller.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -422,18 +422,10 @@ class Scroller(Widget):
422422
"""Wrapper for _Scroller so that children do not need to call events or pass down enabled for nav stack."""
423423
def __init__(self, **kwargs):
424424
super().__init__()
425-
self._scroller = _Scroller([], **kwargs)
425+
self._scroller = self._child(_Scroller([], **kwargs))
426426
# pass down enabled to child widget for nav stack
427427
self._scroller.set_enabled(lambda: self.enabled)
428428

429-
def show_event(self):
430-
super().show_event()
431-
self._scroller.show_event()
432-
433-
def hide_event(self):
434-
super().hide_event()
435-
self._scroller.hide_event()
436-
437429
def _render(self, _):
438430
self._scroller.render(self._rect)
439431

0 commit comments

Comments
 (0)