-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnode_graphics_view.py
More file actions
117 lines (78 loc) · 4.25 KB
/
node_graphics_view.py
File metadata and controls
117 lines (78 loc) · 4.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from PyQt5.QtWidgets import QGraphicsView
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtGui import QPainter, QMouseEvent, QWheelEvent
class customgraphics_view(QGraphicsView):
def __init__(self, graphicScene, parent=None):
super().__init__(parent)
self.graphicScene = graphicScene
self.initUI()
self.setScene(self.graphicScene)
self.zoomInFactor = 1.25 # 25%
self.zoomClamp = True
self.zoom = 10
self.zoomStep = 1
self.zoomRange = [0, 10]
def initUI(self):
# These things can be turned off for performance issues? --------------------------------------------------------------------------------
self.setRenderHints(QPainter.Antialiasing | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing | QPainter.SmoothPixmapTransform)
self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate)
# ---------------------------------------------------------------------------------------------------------------------------------------
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) # Zooms under the current mouse pos | Default is scene center
def mousePressEvent(self, event: QMouseEvent | None):
if event.button() == Qt.MiddleButton:
self.middleMouseButtonPress(event)
elif event.button() == Qt.LeftButton:
self.leftMouseButtonPress(event)
elif event.button() == Qt.RightButton:
self.rightMouseButtonPress(event)
else:
super().mousePressEvent(event)
def mouseReleaseEvent(self, event: QMouseEvent | None) -> None:
if event.button() == Qt.MiddleButton:
self.middleMouseButtonRelease(event)
elif event.button() == Qt.LeftButton:
self.leftMouseButtonRelease(event)
elif event.button() == Qt.RightButton:
self.rightMouseButtonRelease(event)
else:
super().mouseReleaseEvent(event)
def middleMouseButtonPress(self, event):
releaseEvent = QMouseEvent(QEvent.MouseButtonRelease, event.localPos(), event.screenPos(),
Qt.LeftButton, Qt.NoButton, event.modifiers())
super().mouseReleaseEvent(releaseEvent)
self.setDragMode(QGraphicsView.ScrollHandDrag)
fakeEvent = QMouseEvent(event.type(), event.localPos(), event.screenPos(),
Qt.LeftButton, event.buttons() | Qt.LeftButton, event.modifiers())
super().mousePressEvent(fakeEvent)
def middleMouseButtonRelease(self, event):
fakeEvent = QMouseEvent(event.type(), event.localPos(), event.screenPos(),
Qt.LeftButton, event.buttons() & ~Qt.LeftButton, event.modifiers())
super().mouseReleaseEvent(fakeEvent)
self.setDragMode(QGraphicsView.NoDrag)
def leftMouseButtonPress(self, event):
return super().mousePressEvent(event)
def leftMouseButtonRelease(self, event):
return super().mouseReleaseEvent(event)
def rightMouseButtonPress(self, event):
return super().mousePressEvent(event)
def rightMouseButtonRelease(self, event):
return super().mouseReleaseEvent(event)
# Over right wheel to zoom from scroll
def wheelEvent(self, event: QWheelEvent | None):
# Calculate our zoom factor
zoomOutFactor = 1 / self.zoomInFactor
# Calculate zoom
if event.angleDelta().y() > 0: # ZOOM IN
zoomFactor = self.zoomInFactor
self.zoom += self.zoomStep
else: # ZOOM OUT
zoomFactor = zoomOutFactor
self.zoom -= self.zoomStep
clamped = False
if self.zoom < self.zoomRange[0]: self.zoom, clamped = self.zoomRange[0], True # clamps the zoom out?
if self.zoom > self.zoomRange[1]: self.zoom, clamped = self.zoomRange[1], True # clamps the zoom in?
# set scene scale
if not clamped or self.zoomClamp is False:
self.scale(zoomFactor, zoomFactor)