1 from Polyline import Polyline
2 from Circle import Circle
5 class GraphicsView( QGraphicsView ) :
7 moved = pyqtSignal(QPointF)
8 released = pyqtSignal(QPointF)
10 def __init__( self, scene ) :
11 QGraphicsView.__init__( self, scene )
12 self.setMouseTracking( True )
13 self._selectedItem = None
14 self.moved[QPointF].connect(self.execMouseMoveEvent)
15 self.released[QPointF].connect(self.execMouseReleaseEvent)
18 def mousePressEvent( self, mouseEvent ) :
19 QGraphicsView.mousePressEvent( self, mouseEvent )
20 if self.scene() is None : return
21 self._selectedItem = self.scene().mouseGrabberItem()
24 def mouseMoveEvent( self, mouseEvent ) :
25 QGraphicsView.mouseMoveEvent( self, mouseEvent )
27 currentPos = self.mapToScene( pt )
28 self.moved.emit(currentPos)
31 def mouseReleaseEvent( self, mouseEvent ) :
32 QGraphicsView.mouseReleaseEvent( self, mouseEvent )
33 if mouseEvent.button() == Qt.LeftButton :
35 newPos = self.mapToScene( pt )
36 self.released.emit(newPos)
37 self._selectedItem = None
41 def execMouseMoveEvent( self, currentPos ) :
42 if self._selectedItem is None : return
43 selectedIndex = self._selectedItem.getIndex()
47 model = self.scene().getModel()
48 pen = QPen( QColor("red") )
49 if isinstance( model, Polyline ) :
51 if selectedIndex == 0 :
52 nextPoint = model.getPoints()[ selectedIndex+1 ]
55 self.scene().addLine( newX, newY, xNext, yNext, pen )
57 elif selectedIndex == len( model.getPoints()) - 1 :
58 previousPoint = model.getPoints()[ selectedIndex-1 ]
59 xPrevious = previousPoint[0]
60 yPrevious = previousPoint[1]
61 self.scene().addLine( xPrevious, yPrevious, newX, newY, pen )
64 previousPoint = model.getPoints()[ selectedIndex-1 ]
65 xPrevious = previousPoint[0]
66 yPrevious = previousPoint[1]
67 self.scene().addLine( xPrevious, yPrevious, newX, newY, pen )
68 nextPoint = model.getPoints()[ selectedIndex+1 ]
71 self.scene().addLine( newX, newY, xNext, yNext, pen )
74 elif isinstance( model, Circle ) :
76 radius = float( model.getRadius() )
77 rect = QRectF( newX-radius, newY-radius, 2*radius, 2*radius )
78 circleItem = QGraphicsEllipseItem()
79 circleItem.setPen( pen )
80 circleItem.setRect( rect )
81 self.scene().addItem( circleItem )
85 def execMouseReleaseEvent( self, newPos ) :
86 if self._selectedItem is None : return
87 selectedIndex = self._selectedItem.getIndex()
91 model = self.scene().getModel()
92 if isinstance( model, Polyline ) :
93 self.scene().getController().editPoint( model, newPoint, selectedIndex )
95 elif isinstance( model, Circle ) :
96 self.scene().getController().editCenter( model, newPoint )