@@ -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
638697class TestListStrEditorSelection (BaseTestMixin , unittest .TestCase ):
639698
0 commit comments