10
10
11
11
from grill import cook , usd , names
12
12
from grill .views import description , sheets , create , _attributes , stats , _core , _graph , _qt
13
- from grill .views ._qt import QtWidgets , QtCore , QtTest
13
+ from grill .views ._qt import QtWidgets , QtCore , QtGui
14
14
15
15
16
16
class TestPrivate (unittest .TestCase ):
@@ -109,6 +109,7 @@ def tearDown(self) -> None:
109
109
self .nested = None
110
110
self .sibling = None
111
111
shutil .rmtree (self ._tmpf )
112
+ self ._app .quit ()
112
113
113
114
def test_connection_view (self ):
114
115
for graph_viewer in _graph .GraphView , description ._GraphSVGViewer :
@@ -195,7 +196,7 @@ def _sub_test_scenegraph_composition(self):
195
196
196
197
widget .deleteLater ()
197
198
198
- def _sub_test_layer_stack_bidirectionality (self ):
199
+ def test_layer_stack_bidirectionality (self ):
199
200
"""Confirm that bidirectionality between layer stacks completes.
200
201
201
202
Bidirectionality in the composition graph is achieved by:
@@ -220,9 +221,35 @@ def _sub_test_layer_stack_bidirectionality(self):
220
221
graph_view = widget ._graph_view
221
222
if isinstance (graph_view , _graph .GraphView ):
222
223
for item in graph_view .scene ().items ():
223
- if isinstance (item , (_graph ._Node , _graph ._Edge )):
224
- item .boundingRect () # trigger bounding rect logic
225
- QtTest .QTest .mousePress (graph_view .viewport (), QtCore .Qt .LeftButton , pos = item .scenePos ().toPoint ())
224
+ item .boundingRect () # trigger bounding rect logic
225
+ if isinstance (item , _graph ._Node ):
226
+ if not item .isVisible ():
227
+ continue
228
+
229
+ # Test hover with no modifiers
230
+ print (item .textInteractionFlags ())
231
+ event = QtWidgets .QGraphicsSceneHoverEvent (QtCore .QEvent .GraphicsSceneHoverMove )
232
+ event .setScenePos (item .sceneBoundingRect ().center ())
233
+ item .sceneEvent (event )
234
+ self .assertEqual (item .cursor ().shape (), QtGui .Qt .ArrowCursor )
235
+ # self.assertEqual(item.textInteractionFlags(), item._default_text_interaction)
236
+ self .assertEqual (item .textInteractionFlags (), item ._default_text_interaction )
237
+
238
+ # Test hover with Ctrl modifier
239
+ event = QtWidgets .QGraphicsSceneHoverEvent (QtCore .QEvent .GraphicsSceneHoverMove )
240
+ event .setScenePos (item .sceneBoundingRect ().center ())
241
+ event .setModifiers (QtCore .Qt .ControlModifier )
242
+ item .sceneEvent (event )
243
+ self .assertEqual (item .cursor ().shape (), QtGui .Qt .PointingHandCursor )
244
+
245
+ # Test hover with Alt modifier
246
+ event = QtWidgets .QGraphicsSceneHoverEvent (QtCore .QEvent .GraphicsSceneHoverMove )
247
+ event .setScenePos (item .sceneBoundingRect ().center ())
248
+ event .setModifiers (QtCore .Qt .AltModifier )
249
+ item .sceneEvent (event )
250
+ self .assertEqual (item .cursor ().shape (), QtGui .Qt .ClosedHandCursor )
251
+ self .assertEqual (item .textInteractionFlags (), QtCore .Qt .NoTextInteraction )
252
+ break
226
253
227
254
def test_prim_composition (self ):
228
255
for pixmap_enabled in True , False :
@@ -591,3 +618,113 @@ def test_stats(self):
591
618
del _qt .QtCharts
592
619
stats .StageStats (stage = self .world )
593
620
_qt .QtCharts = current
621
+
622
+
623
+ class TestGraphicsViewport (unittest .TestCase ):
624
+ def setUp (self ):
625
+ self ._app = QtWidgets .QApplication .instance () or QtWidgets .QApplication ([])
626
+
627
+ def tearDown (self ):
628
+ self ._app .quit ()
629
+
630
+ def test_zoom (self ):
631
+ """Zoom is triggered by ctrl + mouse wheel"""
632
+ view = _graph ._GraphicsViewport ()
633
+
634
+ initial_scale = view .transform ().m11 ()
635
+
636
+ position = QtCore .QPoint (10 , 10 )
637
+ pixelDelta = QtCore .QPoint (0 , 0 )
638
+ angleDelta_zoomIn = QtCore .QPoint (0 , 120 )
639
+ buttons = QtCore .Qt .NoButton
640
+ modifiers = QtCore .Qt .ControlModifier
641
+ phase = QtCore .Qt .NoScrollPhase
642
+ inverted = False
643
+
644
+ # ZOOM IN
645
+ event = QtGui .QWheelEvent (position , position , pixelDelta , angleDelta_zoomIn , buttons , modifiers , phase , inverted )
646
+ view .wheelEvent (event )
647
+
648
+ zoomed_in_scale = view .transform ().m11 ()
649
+
650
+ # Assert that the scale has changed according to the zoom logic
651
+ self .assertGreater (zoomed_in_scale , initial_scale )
652
+ angleDelta_zoomOut = QtCore .QPoint (- 120 , 0 )
653
+
654
+ # ZOOM OUT
655
+ event = QtGui .QWheelEvent (position , position , pixelDelta , angleDelta_zoomOut , buttons , modifiers , phase , inverted )
656
+ view .wheelEvent (event )
657
+ self .assertGreater (zoomed_in_scale , view .transform ().m11 ())
658
+
659
+ def test_horizontal_scroll (self ):
660
+ """Horizontal scrolling with alt + mouse wheel"""
661
+ view = _graph ._GraphicsViewport ()
662
+ scroll_bar = view .horizontalScrollBar ()
663
+ initial_value = scroll_bar .value ()
664
+ scroll_bar .setMaximum (200 )
665
+ position = QtCore .QPoint (10 , 10 )
666
+ pixelDelta = QtCore .QPoint (0 , 0 )
667
+ angleDelta = QtCore .QPoint (- 120 , 0 )
668
+ buttons = QtCore .Qt .NoButton
669
+ modifiers = QtCore .Qt .AltModifier
670
+ phase = QtCore .Qt .NoScrollPhase
671
+ inverted = False
672
+ event = QtGui .QWheelEvent (position , position , pixelDelta , angleDelta , buttons , modifiers , phase , inverted )
673
+ view .wheelEvent (event )
674
+ final_value = scroll_bar .value ()
675
+ # Assert that the horizontal scroll has changed according to your pan logic
676
+ self .assertGreater (final_value , initial_value )
677
+
678
+ def test_vertical_scroll (self ):
679
+ """Vertical scroll with only mouse wheel"""
680
+ view = _graph ._GraphicsViewport ()
681
+ scroll_bar = view .verticalScrollBar ()
682
+ initial_value = scroll_bar .value ()
683
+ scroll_bar .setMaximum (200 )
684
+ position = QtCore .QPoint (10 , 10 )
685
+ pixelDelta = QtCore .QPoint (0 , 0 )
686
+ angleDelta = QtCore .QPoint (0 , - 120 )
687
+ buttons = QtCore .Qt .NoButton
688
+ modifiers = QtCore .Qt .NoModifier
689
+ phase = QtCore .Qt .NoScrollPhase
690
+ inverted = False
691
+ event = QtGui .QWheelEvent (position , position , pixelDelta , angleDelta , buttons , modifiers , phase , inverted )
692
+ view .wheelEvent (event )
693
+ final_value = scroll_bar .value ()
694
+ # Assert that the horizontal scroll has changed according to your pan logic
695
+ self .assertGreater (final_value , initial_value )
696
+
697
+ def test_pan (self ):
698
+ """Horizontal and vertical pan with mouse middle button"""
699
+ view = _graph ._GraphicsViewport ()
700
+ vertical_scroll_bar = view .verticalScrollBar ()
701
+ vertical_scroll_bar .setMaximum (200 )
702
+ horizontal_scroll_bar = view .horizontalScrollBar ()
703
+ horizontal_scroll_bar .setMaximum (200 )
704
+ start_position = QtCore .QPoint (50 , 50 )
705
+ end_position = QtCore .QPoint (- 5 , - 5 )
706
+
707
+ # 1. Mouse press
708
+ middle_button_event = QtGui .QMouseEvent (QtCore .QEvent .MouseButtonPress , start_position , QtCore .Qt .MiddleButton , QtCore .Qt .MiddleButton , QtCore .Qt .NoModifier )
709
+ vertical_value = vertical_scroll_bar .value ()
710
+ horizontal_value = horizontal_scroll_bar .value ()
711
+ view .mousePressEvent (middle_button_event )
712
+ self .assertEqual (self ._app .overrideCursor ().shape (), QtGui .Qt .ClosedHandCursor )
713
+ self .assertTrue (view ._dragging )
714
+
715
+ # 2. Mouse move
716
+ view ._last_pan_pos = middle_button_event .globalPosition ().toPoint () + QtCore .QPoint (10 ,10 )
717
+ move_event = QtGui .QMouseEvent (QtCore .QEvent .MouseMove , end_position , QtCore .Qt .MiddleButton , QtCore .Qt .MiddleButton , QtCore .Qt .NoModifier )
718
+ view .mouseMoveEvent (move_event )
719
+ last_vertical_scroll_bar = vertical_scroll_bar .value ()
720
+ last_horizontal_scroll_bar = horizontal_scroll_bar .value ()
721
+ self .assertGreater (last_vertical_scroll_bar , vertical_value )
722
+ self .assertGreater (last_horizontal_scroll_bar , horizontal_value )
723
+
724
+ # 3. Release
725
+ view .mouseReleaseEvent (middle_button_event )
726
+ view ._last_pan_pos = middle_button_event .globalPosition ().toPoint () + QtCore .QPoint (20 , 20 )
727
+ view .mouseMoveEvent (move_event )
728
+ # Confirm no further move is performed
729
+ self .assertEqual (last_vertical_scroll_bar , vertical_scroll_bar .value ())
730
+ self .assertEqual (last_horizontal_scroll_bar , horizontal_scroll_bar .value ())
0 commit comments