1 from Polyline import Polyline
2 from Circle import Circle
6 class GraphicsView(QGraphicsView):
8 moved = pyqtSignal(QPointF)
9 released = pyqtSignal(QPointF)
11 def __init__(self, scene):
12 QGraphicsView.__init__(self, scene)
13 self.setMouseTracking(True)
14 self._selectedItem = None
15 self.moved[QPointF].connect(self.execMouseMoveEvent)
16 self.released[QPointF].connect(self.execMouseReleaseEvent)
19 def mousePressEvent(self, mouseEvent):
20 QGraphicsView.mousePressEvent(self, mouseEvent)
21 if self.scene() is None:
23 self._selectedItem = self.scene().mouseGrabberItem()
26 def mouseMoveEvent(self, mouseEvent):
27 QGraphicsView.mouseMoveEvent(self, mouseEvent)
29 currentPos = self.mapToScene(pt)
30 self.moved.emit(currentPos)
33 def mouseReleaseEvent(self, mouseEvent):
34 QGraphicsView.mouseReleaseEvent(self, mouseEvent)
35 if mouseEvent.button() == Qt.LeftButton:
37 newPos = self.mapToScene(pt)
38 self.released.emit(newPos)
39 self._selectedItem = None
43 def execMouseMoveEvent(self, currentPos):
44 if self._selectedItem is None:
46 selectedIndex = self._selectedItem.getIndex()
50 model = self.scene().getModel()
51 pen = QPen(QColor("red"))
52 if isinstance(model, Polyline):
54 if selectedIndex == 0:
55 nextPoint = model.getPoints()[selectedIndex + 1]
58 self.scene().addLine(newX, newY, xNext, yNext, pen)
60 elif selectedIndex == len(model.getPoints()) - 1:
61 previousPoint = model.getPoints()[selectedIndex - 1]
62 xPrevious = previousPoint[0]
63 yPrevious = previousPoint[1]
64 self.scene().addLine(xPrevious, yPrevious, newX, newY, pen)
67 previousPoint = model.getPoints()[selectedIndex - 1]
68 xPrevious = previousPoint[0]
69 yPrevious = previousPoint[1]
70 self.scene().addLine(xPrevious, yPrevious, newX, newY, pen)
71 nextPoint = model.getPoints()[selectedIndex + 1]
74 self.scene().addLine(newX, newY, xNext, yNext, pen)
77 elif isinstance(model, Circle):
79 radius = float(model.getRadius())
80 rect = QRectF(newX - radius, newY - radius, 2 * radius, 2 * radius)
81 circleItem = QGraphicsEllipseItem()
82 circleItem.setPen(pen)
83 circleItem.setRect(rect)
84 self.scene().addItem(circleItem)
88 def execMouseReleaseEvent(self, newPos):
89 if self._selectedItem is None:
91 selectedIndex = self._selectedItem.getIndex()
95 model = self.scene().getModel()
96 if isinstance(model, Polyline):
97 self.scene().getController().editPoint(model, newPoint, selectedIndex)
99 elif isinstance(model, Circle):
100 self.scene().getController().editCenter(model, newPoint)