Skip to content

Commit 0e04b5e

Browse files
committed
test _GraphicsViewport
1 parent 6659ba5 commit 0e04b5e

File tree

1 file changed

+142
-5
lines changed

1 file changed

+142
-5
lines changed

tests/test_views.py

Lines changed: 142 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from grill import cook, usd, names
1212
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
1414

1515

1616
class TestPrivate(unittest.TestCase):
@@ -109,6 +109,7 @@ def tearDown(self) -> None:
109109
self.nested = None
110110
self.sibling = None
111111
shutil.rmtree(self._tmpf)
112+
self._app.quit()
112113

113114
def test_connection_view(self):
114115
for graph_viewer in _graph.GraphView, description._GraphSVGViewer:
@@ -195,7 +196,7 @@ def _sub_test_scenegraph_composition(self):
195196

196197
widget.deleteLater()
197198

198-
def _sub_test_layer_stack_bidirectionality(self):
199+
def test_layer_stack_bidirectionality(self):
199200
"""Confirm that bidirectionality between layer stacks completes.
200201
201202
Bidirectionality in the composition graph is achieved by:
@@ -220,9 +221,35 @@ def _sub_test_layer_stack_bidirectionality(self):
220221
graph_view = widget._graph_view
221222
if isinstance(graph_view, _graph.GraphView):
222223
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
226253

227254
def test_prim_composition(self):
228255
for pixmap_enabled in True, False:
@@ -591,3 +618,113 @@ def test_stats(self):
591618
del _qt.QtCharts
592619
stats.StageStats(stage=self.world)
593620
_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

Comments
 (0)