diff --git a/selfdrive/ui/mici/layouts/main.py b/selfdrive/ui/mici/layouts/main.py index e39a228da..1a0c6bc09 100644 --- a/selfdrive/ui/mici/layouts/main.py +++ b/selfdrive/ui/mici/layouts/main.py @@ -49,6 +49,7 @@ class MiciMainLayout(Scroller): # Set callbacks self._setup_callbacks() + gui_app.add_nav_stack_tick(self._handle_transitions) gui_app.push_widget(self) # Start onboarding if terms or training not completed, make sure to push after self @@ -76,8 +77,6 @@ class MiciMainLayout(Scroller): # Render super()._render(self._rect) - self._handle_transitions() - def _handle_transitions(self): # Don't pop if onboarding if gui_app.get_active_widget() == self._onboarding_window: diff --git a/selfdrive/ui/mici/layouts/settings/network/__init__.py b/selfdrive/ui/mici/layouts/settings/network/__init__.py index ce3f1a817..ae7d085e0 100644 --- a/selfdrive/ui/mici/layouts/settings/network/__init__.py +++ b/selfdrive/ui/mici/layouts/settings/network/__init__.py @@ -166,13 +166,13 @@ class NetworkLayoutMici(NavScroller): self._wifi_manager.set_active(True) # Process wifi callbacks while at any point in the nav stack - gui_app.set_nav_stack_tick(self._wifi_manager.process_callbacks) + gui_app.add_nav_stack_tick(self._wifi_manager.process_callbacks) def hide_event(self): super().hide_event() self._wifi_manager.set_active(False) - gui_app.set_nav_stack_tick(None) + gui_app.remove_nav_stack_tick(self._wifi_manager.process_callbacks) def _toggle_roaming(self, checked: bool): self._wifi_manager.update_gsm_settings(checked, ui_state.params.get("GsmApn") or "", ui_state.params.get_bool("GsmMetered")) diff --git a/system/ui/lib/application.py b/system/ui/lib/application.py index 1640b0d07..34aed4f6a 100644 --- a/system/ui/lib/application.py +++ b/system/ui/lib/application.py @@ -220,7 +220,7 @@ class GuiApplication: self._frame = 0 self._window_close_requested = False self._nav_stack: list[object] = [] - self._nav_stack_tick: Callable[[], None] | None = None + self._nav_stack_ticks: list[Callable[[], None]] = [] self._nav_stack_widgets_to_render = 1 if self.big_ui() else 2 self._mouse = MouseState(self._scale) @@ -411,8 +411,13 @@ class GuiApplication: return self._nav_stack[-1] return None - def set_nav_stack_tick(self, tick_function: Callable | None): - self._nav_stack_tick = tick_function + def add_nav_stack_tick(self, tick_function: Callable[[], None]): + if tick_function not in self._nav_stack_ticks: + self._nav_stack_ticks.append(tick_function) + + def remove_nav_stack_tick(self, tick_function: Callable[[], None]): + if tick_function in self._nav_stack_ticks: + self._nav_stack_ticks.remove(tick_function) def set_should_render(self, should_render: bool): self._should_render = should_render @@ -561,8 +566,8 @@ class GuiApplication: rl.clear_background(rl.BLACK) # Allow a Widget to still run a function regardless of the stack depth - if self._nav_stack_tick is not None: - self._nav_stack_tick() + for tick in self._nav_stack_ticks: + tick() # Only render top widgets for widget in self._nav_stack[-self._nav_stack_widgets_to_render:]: diff --git a/system/ui/mici_setup.py b/system/ui/mici_setup.py index 6c73f14e3..ca6354443 100755 --- a/system/ui/mici_setup.py +++ b/system/ui/mici_setup.py @@ -508,7 +508,7 @@ class Setup(Widget): self._network_monitor = NetworkConnectivityMonitor() self._network_monitor.start() self._prev_has_internet = False - gui_app.set_nav_stack_tick(self._nav_stack_tick) + gui_app.add_nav_stack_tick(self._nav_stack_tick) self._start_page = StartPage() self._start_page.set_click_callback(self._getting_started_button_callback)