Skip to content

Commit 1e5cc26

Browse files
committed
select rows only after completed clicks
Require a left-button press and release inside the same Shortcut Reference row before selecting it. Ignore release-only, drag-out, right-click, and middle-click interactions, with regression coverage for each case.
1 parent eae58fe commit 1e5cc26

2 files changed

Lines changed: 104 additions & 5 deletions

File tree

‎MeadowPy/dev/tests/test_ui_panels_and_dialogs.py‎

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from types import SimpleNamespace
66

77
from PyQt6.QtCore import QEvent, QPoint, QPointF, Qt
8-
from PyQt6.QtGui import QAction, QColor, QFont, QKeyEvent, QPalette
8+
from PyQt6.QtGui import QAction, QColor, QFont, QKeyEvent, QMouseEvent, QPalette
99
from PyQt6.QtTest import QTest
1010
from PyQt6.QtWidgets import (
1111
QFontComboBox,
@@ -118,6 +118,93 @@ def test_shortcut_confirmation_dialogs_expose_choices_and_actions(qapp):
118118
reset_dialog.deleteLater()
119119

120120

121+
def test_shortcut_row_selects_only_after_completed_left_click(qapp):
122+
definition = ShortcutDefinition(
123+
"test.row",
124+
"Test",
125+
"Select row",
126+
"Ctrl+R",
127+
"Select a shortcut row.",
128+
)
129+
row = shortcut_reference_module._ShortcutRow(definition, "Ctrl+R")
130+
row.resize(240, 40)
131+
selected = Recorder()
132+
row.selected.connect(selected)
133+
inside = QPointF(row.rect().center())
134+
outside = QPointF(-1, -1)
135+
136+
def mouse_event(event_type, position, button, buttons):
137+
return QMouseEvent(
138+
event_type,
139+
position,
140+
button,
141+
buttons,
142+
Qt.KeyboardModifier.NoModifier,
143+
)
144+
145+
row.mouseReleaseEvent(
146+
mouse_event(
147+
QEvent.Type.MouseButtonRelease,
148+
inside,
149+
Qt.MouseButton.LeftButton,
150+
Qt.MouseButton.NoButton,
151+
)
152+
)
153+
assert selected.calls == []
154+
155+
row.mousePressEvent(
156+
mouse_event(
157+
QEvent.Type.MouseButtonPress,
158+
inside,
159+
Qt.MouseButton.LeftButton,
160+
Qt.MouseButton.LeftButton,
161+
)
162+
)
163+
assert selected.calls == []
164+
row.mouseReleaseEvent(
165+
mouse_event(
166+
QEvent.Type.MouseButtonRelease,
167+
outside,
168+
Qt.MouseButton.LeftButton,
169+
Qt.MouseButton.NoButton,
170+
)
171+
)
172+
assert selected.calls == []
173+
174+
for button in (Qt.MouseButton.RightButton, Qt.MouseButton.MiddleButton):
175+
row.mousePressEvent(
176+
mouse_event(QEvent.Type.MouseButtonPress, inside, button, button)
177+
)
178+
row.mouseReleaseEvent(
179+
mouse_event(
180+
QEvent.Type.MouseButtonRelease,
181+
inside,
182+
button,
183+
Qt.MouseButton.NoButton,
184+
)
185+
)
186+
assert selected.calls == []
187+
188+
row.mousePressEvent(
189+
mouse_event(
190+
QEvent.Type.MouseButtonPress,
191+
inside,
192+
Qt.MouseButton.LeftButton,
193+
Qt.MouseButton.LeftButton,
194+
)
195+
)
196+
row.mouseReleaseEvent(
197+
mouse_event(
198+
QEvent.Type.MouseButtonRelease,
199+
inside,
200+
Qt.MouseButton.LeftButton,
201+
Qt.MouseButton.NoButton,
202+
)
203+
)
204+
assert selected.calls == [(definition.id,)]
205+
row.deleteLater()
206+
207+
121208
def test_shortcut_capture_escape_clear_and_memory_settings(qapp):
122209
definition = ShortcutDefinition(
123210
"test.capture",

‎MeadowPy/meadowpy/ui/dialogs/shortcut_reference_dialog.py‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ class _ShortcutRow(QFrame):
175175
def __init__(self, definition: ShortcutDefinition, shortcut: str, parent=None):
176176
super().__init__(parent)
177177
self.definition = definition
178+
self._left_button_pressed = False
178179
self.setObjectName("shortcutRow")
179180
self.setCursor(Qt.CursorShape.PointingHandCursor)
180181
self._shortcut_text = ""
@@ -219,12 +220,23 @@ def matches_filter(self, text: str) -> bool:
219220
)
220221

221222
def mousePressEvent(self, event) -> None: # noqa: N802
222-
if event.button() == Qt.MouseButton.LeftButton:
223-
self.selected.emit(self.definition.id)
224-
event.accept()
225-
return
223+
self._left_button_pressed = (
224+
event.button() == Qt.MouseButton.LeftButton
225+
and self.rect().contains(event.position().toPoint())
226+
)
226227
super().mousePressEvent(event)
227228

229+
def mouseReleaseEvent(self, event) -> None: # noqa: N802
230+
should_select = (
231+
self._left_button_pressed
232+
and event.button() == Qt.MouseButton.LeftButton
233+
and self.rect().contains(event.position().toPoint())
234+
)
235+
self._left_button_pressed = False
236+
super().mouseReleaseEvent(event)
237+
if should_select:
238+
self.selected.emit(self.definition.id)
239+
228240

229241
class _ShortcutListSection(QFrame):
230242
"""A category section in the left shortcut list."""

0 commit comments

Comments
 (0)