From 2213f8f8a4002745ae67557ee518a8d374a9d701 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Dec 2025 17:10:12 -0800 Subject: [PATCH] MultiOptionDialog: tap activates current option (#36911) * works * clean up --- .../mici/layouts/settings/network/wifi_ui.py | 11 ++++----- selfdrive/ui/mici/widgets/dialog.py | 24 +++++++++++-------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py b/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py index 374539c4ce..06347b5657 100644 --- a/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py +++ b/selfdrive/ui/mici/layouts/settings/network/wifi_ui.py @@ -388,7 +388,7 @@ class WifiUIMici(BigMultiOptionDialog): else: network_button = WifiItem(network) - self.add_button(network_button) + self._scroller.add_widget(network_button) # remove networks no longer present self._scroller._items[:] = [btn for btn in self._scroller._items if btn.option in self._networks] @@ -402,11 +402,10 @@ class WifiUIMici(BigMultiOptionDialog): self._wifi_manager.connect_to_network(ssid, password) self._update_buttons() - def _on_option_selected(self, option: str, smooth_scroll: bool = True): - super()._on_option_selected(option, smooth_scroll) + def _on_option_selected(self, option: str): + super()._on_option_selected(option) - # only open if button is already selected - if option in self._networks and option == self._selected_option: + if option in self._networks: self._network_info_page.set_current_network(self._networks[option]) self._open_network_manage_page() @@ -453,7 +452,7 @@ class WifiUIMici(BigMultiOptionDialog): current_selection = self.get_selected_option() if self._restore_selection and current_selection in self._networks: self._scroller._layout() - BigMultiOptionDialog._on_option_selected(self, current_selection, smooth_scroll=False) + BigMultiOptionDialog._on_option_selected(self, current_selection) self._restore_selection = None super()._render(_) diff --git a/selfdrive/ui/mici/widgets/dialog.py b/selfdrive/ui/mici/widgets/dialog.py index 3cd9f8b2c2..eb36494ad4 100644 --- a/selfdrive/ui/mici/widgets/dialog.py +++ b/selfdrive/ui/mici/widgets/dialog.py @@ -328,18 +328,12 @@ class BigMultiOptionDialog(BigDialogBase): self._last_selected_option: str = self._selected_option self._scroller = Scroller([], horizontal=False, pad_start=100, pad_end=100, spacing=0, snap_items=True) + self.set_touch_valid_callback(self._scroller.scroll_panel.is_touch_valid) if self._right_btn is not None: self._scroller.set_enabled(lambda: not cast(Widget, self._right_btn).is_pressed) for option in options: - self.add_button(BigDialogOptionButton(option)) - - def add_button(self, button: BigDialogOptionButton): - def click_callback(_btn=button): - self._on_option_selected(_btn.option) - - button.set_click_callback(click_callback) - self._scroller.add_widget(button) + self._scroller.add_widget(BigDialogOptionButton(option)) def show_event(self): super().show_event() @@ -350,7 +344,7 @@ class BigMultiOptionDialog(BigDialogBase): def get_selected_option(self) -> str: return self._selected_option - def _on_option_selected(self, option: str, smooth_scroll: bool = True): + def _on_option_selected(self, option: str): y_pos = 0.0 for btn in self._scroller._items: btn = cast(BigDialogOptionButton, btn) @@ -366,11 +360,21 @@ class BigMultiOptionDialog(BigDialogBase): y_pos = rect_center_y - (btn.rect.y + height / 2) break - self._scroller.scroll_to(-y_pos, smooth=smooth_scroll) + self._scroller.scroll_to(-y_pos) def _selected_option_changed(self): pass + def _handle_mouse_release(self, mouse_pos: MousePos): + super()._handle_mouse_release(mouse_pos) + + # select current option + for btn in self._scroller._items: + btn = cast(BigDialogOptionButton, btn) + if btn.option == self._selected_option: + self._on_option_selected(btn.option) + break + def _update_state(self): super()._update_state()