Skip to content

Commit 7841ca7

Browse files
authored
Fix updating right_clicked and right_clicked_item for Qt ListStrEditor (#1115)
* Fix right clicking item for Qt ListStrEditor not doing anything, as well as edge case for when the index is out-of-bound * Revert an orthogonal fix.
1 parent b855634 commit 7841ca7

File tree

2 files changed

+73
-7
lines changed

2 files changed

+73
-7
lines changed

traitsui/qt4/list_str_editor.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,8 @@ def _on_activate(self, mi):
388388
self.activated_index = index = mi.row()
389389
self.activated = self.adapter.get_item(self.object, self.name, index)
390390

391-
def _on_context_menu(self, point):
392-
""" Handle a context menu request.
391+
def _on_mouse_right_click(self, point):
392+
""" Handle a mouse right click event
393393
"""
394394
mi = self.list_view.indexAt(point)
395395
if mi.isValid():
@@ -528,6 +528,13 @@ def _dispose(self):
528528
"""
529529
self.setModel(None)
530530

531+
def mouseReleaseEvent(self, event):
532+
""" Reimplemented to support listening to right clicked item."""
533+
if event.button() == QtCore.Qt.RightButton:
534+
event.accept()
535+
self._editor._on_mouse_right_click(event.pos())
536+
super(_ListView, self).mouseReleaseEvent(event)
537+
531538
def keyPressEvent(self, event):
532539
""" Reimplemented to support edit, insert, and delete by keyboard.
533540
"""

traitsui/tests/editors/test_liststr_editor_selection.py

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,23 +180,61 @@ def clear_selection(editor):
180180
raise unittest.SkipTest("Test not implemented for this toolkit")
181181

182182

183-
def right_click_item(control, index):
183+
def right_click_item(editor, index):
184184
""" Right clicks on the specified item.
185185
"""
186186

187187
if is_wx():
188188
import wx
189189

190+
control = editor.control
190191
event = wx.ListEvent(
191192
wx.EVT_LIST_ITEM_RIGHT_CLICK.typeId, control.GetId()
192193
)
193194
event.SetIndex(index)
194195
wx.PostEvent(control, event)
195196

196197
elif is_qt():
197-
# Couldn't figure out how to close the context menu programatically
198+
from pyface.qt import QtCore
199+
from pyface.qt.QtTest import QTest
200+
view = editor.list_view
201+
q_model_index = view.model().index(index, 0)
202+
view.scrollTo(q_model_index)
203+
rect = view.visualRect(q_model_index)
204+
QTest.mouseClick(
205+
view.viewport(),
206+
QtCore.Qt.RightButton,
207+
QtCore.Qt.NoModifier,
208+
rect.center(),
209+
)
210+
else:
198211
raise unittest.SkipTest("Test not implemented for this toolkit")
199212

213+
214+
def right_click_center(editor):
215+
""" Right click the middle of the widget.
216+
"""
217+
218+
if is_wx():
219+
import wx
220+
221+
control = editor.control
222+
event = wx.ListEvent(
223+
wx.EVT_LIST_ITEM_RIGHT_CLICK.typeId, control.GetId()
224+
)
225+
wx.PostEvent(control, event)
226+
227+
elif is_qt():
228+
from pyface.qt import QtCore
229+
from pyface.qt.QtTest import QTest
230+
view = editor.list_view
231+
rect = view.rect()
232+
QTest.mouseClick(
233+
view.viewport(),
234+
QtCore.Qt.RightButton,
235+
QtCore.Qt.NoModifier,
236+
rect.center(),
237+
)
200238
else:
201239
raise unittest.SkipTest("Test not implemented for this toolkit")
202240

@@ -608,8 +646,6 @@ def test_list_str_editor_title(self):
608646
self.setup_gui(ListStrModel(), get_view(title="testing")):
609647
pass
610648

611-
# see `right_click_item` and issue enthought/traitsui#868
612-
@requires_toolkit([ToolkitName.wx])
613649
def test_list_str_editor_right_click(self):
614650
class ListStrModelRightClick(HasTraits):
615651
value = List(["one", "two", "three"])
@@ -628,12 +664,35 @@ class ListStrModelRightClick(HasTraits):
628664
self.assertEqual(model.right_clicked, "")
629665
self.assertEqual(model.right_clicked_index, 0)
630666

631-
right_click_item(editor.control, 1)
667+
right_click_item(editor, 1)
632668
process_cascade_events()
633669

634670
self.assertEqual(model.right_clicked, "two")
635671
self.assertEqual(model.right_clicked_index, 1)
636672

673+
def test_list_str_editor_right_click_out_of_bound(self):
674+
class ListStrModelRightClick(HasTraits):
675+
value = List([])
676+
right_clicked = Str()
677+
right_clicked_index = Int()
678+
679+
model = ListStrModelRightClick()
680+
view = get_view(
681+
right_clicked="object.right_clicked",
682+
right_clicked_index="object.right_clicked_index",
683+
)
684+
with reraise_exceptions(), \
685+
self.setup_gui(model, view) as editor:
686+
687+
self.assertEqual(model.right_clicked, "")
688+
self.assertEqual(model.right_clicked_index, 0)
689+
690+
right_click_center(editor)
691+
process_cascade_events()
692+
693+
self.assertEqual(model.right_clicked, "")
694+
self.assertEqual(model.right_clicked_index, 0)
695+
637696

638697
class TestListStrEditorSelection(BaseTestMixin, unittest.TestCase):
639698

0 commit comments

Comments
 (0)