Skip to content

Commit 3fbd928

Browse files
committed
Revert "ui: generic hold gesture (#36893)"
This reverts commit 9768109.
1 parent d2125aa commit 3fbd928

File tree

2 files changed

+27
-36
lines changed

2 files changed

+27
-36
lines changed

selfdrive/ui/mici/layouts/home.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import time
2+
13
from cereal import log
24
import pyray as rl
35
from collections.abc import Callable
@@ -81,6 +83,9 @@ def __init__(self):
8183
self._on_settings_click: Callable | None = None
8284

8385
self._last_refresh = 0
86+
self._mouse_down_t: None | float = None
87+
self._did_long_press = False
88+
self._is_pressed_prev = False
8489

8590
self._version_text = None
8691
self._experimental_mode = False
@@ -119,13 +124,23 @@ def show_event(self):
119124
def _update_params(self):
120125
self._experimental_mode = ui_state.params.get_bool("ExperimentalMode")
121126

122-
def _handle_long_press(self, _):
123-
# long gating for experimental mode - only allow toggle if longitudinal control is available
124-
if ui_state.has_longitudinal_control:
125-
self._experimental_mode = not self._experimental_mode
126-
ui_state.params.put("ExperimentalMode", self._experimental_mode)
127-
128127
def _update_state(self):
128+
if self.is_pressed and not self._is_pressed_prev:
129+
self._mouse_down_t = time.monotonic()
130+
elif not self.is_pressed and self._is_pressed_prev:
131+
self._mouse_down_t = None
132+
self._did_long_press = False
133+
self._is_pressed_prev = self.is_pressed
134+
135+
if self._mouse_down_t is not None:
136+
if time.monotonic() - self._mouse_down_t > 0.5:
137+
# long gating for experimental mode - only allow toggle if longitudinal control is available
138+
if ui_state.has_longitudinal_control:
139+
self._experimental_mode = not self._experimental_mode
140+
ui_state.params.put("ExperimentalMode", self._experimental_mode)
141+
self._mouse_down_t = None
142+
self._did_long_press = True
143+
129144
if rl.get_time() - self._last_refresh > 5.0:
130145
device_state = ui_state.sm['deviceState']
131146
self._update_network_status(device_state)
@@ -144,8 +159,10 @@ def set_callbacks(self, on_settings: Callable | None = None):
144159
self._on_settings_click = on_settings
145160

146161
def _handle_mouse_release(self, mouse_pos: MousePos):
147-
if self._on_settings_click:
148-
self._on_settings_click()
162+
if not self._did_long_press:
163+
if self._on_settings_click:
164+
self._on_settings_click()
165+
self._did_long_press = False
149166

150167
def _get_version_text(self) -> tuple[str, str, str, str] | None:
151168
description = ui_state.params.get("UpdaterCurrentDescription")

system/ui/widgets/__init__.py

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ class DialogResult(IntEnum):
2020

2121

2222
class Widget(abc.ABC):
23-
LONG_PRESS_TIME = 0.5
24-
2523
def __init__(self):
2624
self._rect: rl.Rectangle = rl.Rectangle(0, 0, 0, 0)
2725
self._parent_rect: rl.Rectangle | None = None
@@ -35,10 +33,6 @@ def __init__(self):
3533
self._multi_touch = False
3634
self.__was_awake = True
3735

38-
# Long press state (single touch only, slot 0)
39-
self._long_press_start_t: float | None = None
40-
self._long_press_fired: bool = False
41-
4236
@property
4337
def rect(self) -> rl.Rectangle:
4438
return self._rect
@@ -133,28 +127,19 @@ def _process_mouse_events(self) -> None:
133127
self._handle_mouse_press(mouse_event.pos)
134128
self.__is_pressed[mouse_event.slot] = True
135129
self.__tracking_is_pressed[mouse_event.slot] = True
136-
if mouse_event.slot == 0:
137-
self._long_press_start_t = rl.get_time()
138-
self._long_press_fired = False
139130
self._handle_mouse_event(mouse_event)
140131

141132
# Callback such as scroll panel signifies user is scrolling
142133
elif not touch_valid:
143134
self.__is_pressed[mouse_event.slot] = False
144135
self.__tracking_is_pressed[mouse_event.slot] = False
145-
if mouse_event.slot == 0:
146-
self._long_press_start_t = None
147-
self._long_press_fired = False
148136

149137
elif mouse_event.left_released:
150138
self._handle_mouse_event(mouse_event)
151-
if self.__is_pressed[mouse_event.slot] and mouse_in_rect and not (mouse_event.slot == 0 and self._long_press_fired):
139+
if self.__is_pressed[mouse_event.slot] and mouse_in_rect:
152140
self._handle_mouse_release(mouse_event.pos)
153141
self.__is_pressed[mouse_event.slot] = False
154142
self.__tracking_is_pressed[mouse_event.slot] = False
155-
if mouse_event.slot == 0:
156-
self._long_press_start_t = None
157-
self._long_press_fired = False
158143

159144
# Mouse/touch is still within our rect
160145
elif mouse_in_rect:
@@ -165,17 +150,8 @@ def _process_mouse_events(self) -> None:
165150
# Mouse/touch left our rect but may come back into focus later
166151
elif not mouse_in_rect:
167152
self.__is_pressed[mouse_event.slot] = False
168-
if mouse_event.slot == 0:
169-
self._long_press_start_t = None
170-
self._long_press_fired = False
171153
self._handle_mouse_event(mouse_event)
172154

173-
# Long press detection
174-
if self._long_press_start_t is not None and not self._long_press_fired:
175-
if (rl.get_time() - self._long_press_start_t) >= self.LONG_PRESS_TIME:
176-
self._long_press_fired = True
177-
self._handle_long_press(gui_app.last_mouse_event.pos)
178-
179155
def _layout(self) -> None:
180156
"""Optionally lay out child widgets separately. This is called before rendering."""
181157

@@ -199,11 +175,9 @@ def _handle_mouse_release(self, mouse_pos: MousePos) -> bool:
199175
self._click_callback()
200176
return False
201177

202-
def _handle_long_press(self, mouse_pos: MousePos) -> None:
203-
"""Optionally handle a long-press gesture."""
204-
205178
def _handle_mouse_event(self, mouse_event: MouseEvent) -> None:
206179
"""Optionally handle mouse events. This is called before rendering."""
180+
# Default implementation does nothing, can be overridden by subclasses
207181

208182
def show_event(self):
209183
"""Optionally handle show event. Parent must manually call this"""

0 commit comments

Comments
 (0)