diff --git a/selfdrive/ui/mici/widgets/dialog.py b/selfdrive/ui/mici/widgets/dialog.py index 9ccc37e25..6cfb6455b 100644 --- a/selfdrive/ui/mici/widgets/dialog.py +++ b/selfdrive/ui/mici/widgets/dialog.py @@ -77,7 +77,7 @@ class BigConfirmationDialogV2(BigDialogBase): self._slider = RedBigSlider(title, icon_txt, confirm_callback=self._on_confirm) else: self._slider = BigSlider(title, icon_txt, confirm_callback=self._on_confirm) - self._slider.set_enabled(lambda: self.enabled and not self._dragging_down) # self.enabled for nav stack + self._slider.set_enabled(lambda: self.enabled and not self.is_dismissing) # for nav stack + NavWidget def _on_confirm(self): if self._exit_on_confirm: @@ -87,7 +87,7 @@ class BigConfirmationDialogV2(BigDialogBase): def _update_state(self): super()._update_state() - if self._dragging_down and not self._slider.confirmed: + if self.is_dismissing and not self._slider.confirmed: self._slider.reset() def _render(self, _): @@ -109,7 +109,7 @@ class BigInputDialog(BigDialogBase): font_weight=FontWeight.MEDIUM) self._keyboard = MiciKeyboard() self._keyboard.set_text(default_text) - self._keyboard.set_enabled(lambda: self.enabled) # for nav stack + self._keyboard.set_enabled(lambda: self.enabled and not self.is_dismissing) # for nav stack + NavWidget self._minimum_length = minimum_length self._backspace_held_time: float | None = None @@ -135,6 +135,10 @@ class BigInputDialog(BigDialogBase): def _update_state(self): super()._update_state() + if self.is_dismissing: + self._backspace_held_time = None + return + last_mouse_event = gui_app.last_mouse_event if last_mouse_event.left_down and rl.check_collision_point_rec(last_mouse_event.pos, self._top_right_button_rect) and self._backspace_img_alpha.x > 1: if self._backspace_held_time is None: @@ -229,6 +233,10 @@ class BigInputDialog(BigDialogBase): super()._handle_mouse_press(mouse_pos) # TODO: need to track where press was so enter and back can activate on release rather than press # or turn into icon widgets :eyes_open: + + if self.is_dismissing: + return + # handle backspace icon click if rl.check_collision_point_rec(mouse_pos, self._top_right_button_rect) and self._backspace_img_alpha.x > 254: self._keyboard.backspace() diff --git a/system/ui/widgets/mici_keyboard.py b/system/ui/widgets/mici_keyboard.py index 59a245138..18384fd90 100644 --- a/system/ui/widgets/mici_keyboard.py +++ b/system/ui/widgets/mici_keyboard.py @@ -322,7 +322,7 @@ class MiciKeyboard(Widget): self._selected_key_filter.update(self._closest_key[0] is not None) # unselect key after animation plays - if self._unselect_key_t is not None and rl.get_time() > self._unselect_key_t: + if (self._unselect_key_t is not None and rl.get_time() > self._unselect_key_t) or not self.enabled: self._closest_key = (None, float('inf')) self._unselect_key_t = None self._selected_key_t = None diff --git a/system/ui/widgets/nav_widget.py b/system/ui/widgets/nav_widget.py index acbec5eb6..fb680a0b5 100644 --- a/system/ui/widgets/nav_widget.py +++ b/system/ui/widgets/nav_widget.py @@ -172,6 +172,10 @@ class NavWidget(Widget, abc.ABC): return ret + @property + def is_dismissing(self) -> bool: + return self._dragging_down or self._playing_dismiss_animation + def show_event(self): super().show_event() self._nav_bar.show_event() @@ -179,6 +183,7 @@ class NavWidget(Widget, abc.ABC): # Reset state self._drag_start_pos = None self._dragging_down = False + self._playing_dismiss_animation = False # Start NavWidget off-screen, no matter how tall it is self._y_pos_filter.update_alpha(0.1) self._y_pos_filter.x = gui_app.height diff --git a/system/ui/widgets/scroller.py b/system/ui/widgets/scroller.py index fb47f690b..c48be6b80 100644 --- a/system/ui/widgets/scroller.py +++ b/system/ui/widgets/scroller.py @@ -443,7 +443,7 @@ class NavScroller(NavWidget, Scroller): def __init__(self, **kwargs): super().__init__(**kwargs) # pass down enabled to child widget for nav stack + disable while swiping away NavWidget - self._scroller.set_enabled(lambda: self.enabled and not self._dragging_down) + self._scroller.set_enabled(lambda: self.enabled and not self.is_dismissing) def _back_enabled(self) -> bool: # Vertical scrollers need to be at the top to swipe away to prevent erroneous swipes @@ -459,7 +459,7 @@ class NavRawScrollPanel(NavWidget): def __init__(self): super().__init__() self._scroll_panel = GuiScrollPanel2(horizontal=False) - self._scroll_panel.set_enabled(lambda: self.enabled and not self._dragging_down) + self._scroll_panel.set_enabled(lambda: self.enabled and not self.is_dismissing) def show_event(self): super().show_event()