|
@@ -21,12 +21,14 @@ CURSOR_GRAB = QtCore.Qt.OpenHandCursor
|
|
|
|
|
|
|
|
|
class Canvas(QtWidgets.QWidget):
|
|
|
+
|
|
|
zoomRequest = QtCore.Signal(int, QtCore.QPoint)
|
|
|
scrollRequest = QtCore.Signal(int, int)
|
|
|
newShape = QtCore.Signal()
|
|
|
selectionChanged = QtCore.Signal(bool)
|
|
|
shapeMoved = QtCore.Signal()
|
|
|
drawingPolygon = QtCore.Signal(bool)
|
|
|
+ edgeSelected = QtCore.Signal(bool)
|
|
|
|
|
|
CREATE, EDIT = 0, 1
|
|
|
|
|
@@ -44,6 +46,7 @@ class Canvas(QtWidgets.QWidget):
|
|
|
self.lineColor = QtGui.QColor(0, 0, 255)
|
|
|
self.line = Shape(line_color=self.lineColor)
|
|
|
self.prevPoint = QtCore.QPointF()
|
|
|
+ self.prevMovePoint = QtCore.QPointF()
|
|
|
self.offsets = QtCore.QPointF(), QtCore.QPointF()
|
|
|
self.scale = 1.0
|
|
|
self.pixmap = QtGui.QPixmap()
|
|
@@ -52,7 +55,7 @@ class Canvas(QtWidgets.QWidget):
|
|
|
self.hideBackround = False
|
|
|
self.hShape = None
|
|
|
self.hVertex = None
|
|
|
- self.addVertex = None
|
|
|
+ self.hEdge = None
|
|
|
self.movingShape = False
|
|
|
self._painter = QtGui.QPainter()
|
|
|
self._cursor = CURSOR_DEFAULT
|
|
@@ -117,9 +120,6 @@ class Canvas(QtWidgets.QWidget):
|
|
|
def selectedVertex(self):
|
|
|
return self.hVertex is not None
|
|
|
|
|
|
- def addedVertex(self):
|
|
|
- return self.addVertex is not None
|
|
|
-
|
|
|
def mouseMoveEvent(self, ev):
|
|
|
"""Update line with last point and current coordinates."""
|
|
|
if QT5:
|
|
@@ -127,6 +127,7 @@ class Canvas(QtWidgets.QWidget):
|
|
|
else:
|
|
|
pos = self.transformPos(ev.posF())
|
|
|
|
|
|
+ self.prevMovePoint = pos
|
|
|
self.restoreCursor()
|
|
|
|
|
|
# Polygon drawing.
|
|
@@ -187,31 +188,25 @@ class Canvas(QtWidgets.QWidget):
|
|
|
# Look for a nearby vertex to highlight. If that fails,
|
|
|
# check if we happen to be inside a shape.
|
|
|
index = shape.nearestVertex(pos, self.epsilon)
|
|
|
- index2 = shape.nearestEdge(pos, self.epsilon)
|
|
|
+ index_edge = shape.nearestEdge(pos, self.epsilon)
|
|
|
if index is not None:
|
|
|
if self.selectedVertex():
|
|
|
self.hShape.highlightClear()
|
|
|
- self.hVertex, self.hShape = index, shape
|
|
|
+ self.hVertex = index
|
|
|
+ self.hShape = shape
|
|
|
+ self.hEdge = index_edge
|
|
|
shape.highlightVertex(index, shape.MOVE_VERTEX)
|
|
|
self.overrideCursor(CURSOR_POINT)
|
|
|
self.setToolTip("Click & drag to move point")
|
|
|
self.setStatusTip(self.toolTip())
|
|
|
self.update()
|
|
|
break
|
|
|
- elif index2 is not None:
|
|
|
- if self.selectedVertex():
|
|
|
- self.hShape.highlightClear()
|
|
|
- self.addVertex, self.hShape = index2, shape
|
|
|
- self.hVertex = None
|
|
|
- self.overrideCursor(CURSOR_DRAW)
|
|
|
- self.setToolTip("Click & drag to add point")
|
|
|
- self.setStatusTip(self.toolTip())
|
|
|
- self.update()
|
|
|
- break
|
|
|
elif shape.containsPoint(pos):
|
|
|
if self.selectedVertex():
|
|
|
self.hShape.highlightClear()
|
|
|
- self.hVertex, self.addVertex, self.hShape = None, None, shape
|
|
|
+ self.hVertex = None
|
|
|
+ self.hShape = shape
|
|
|
+ self.hEdge = index_edge
|
|
|
self.setToolTip(
|
|
|
"Click & drag to move shape '%s'" % shape.label)
|
|
|
self.setStatusTip(self.toolTip())
|
|
@@ -222,7 +217,22 @@ class Canvas(QtWidgets.QWidget):
|
|
|
if self.hShape:
|
|
|
self.hShape.highlightClear()
|
|
|
self.update()
|
|
|
- self.hVertex, self.hShape = None, None
|
|
|
+ self.hVertex, self.hShape, self.hEdge = None, None, None
|
|
|
+ self.edgeSelected.emit(self.hEdge is not None)
|
|
|
+
|
|
|
+ def addPointToEdge(self):
|
|
|
+ if (self.hShape is None and
|
|
|
+ self.hEdge is None and
|
|
|
+ self.prevMovePoint is None):
|
|
|
+ return
|
|
|
+ shape = self.hShape
|
|
|
+ index = self.hEdge
|
|
|
+ point = self.prevMovePoint
|
|
|
+ shape.insertPoint(index, point)
|
|
|
+ shape.highlightVertex(index, shape.MOVE_VERTEX)
|
|
|
+ self.hShape = shape
|
|
|
+ self.hVertex = index
|
|
|
+ self.hEdge = None
|
|
|
|
|
|
def mousePressEvent(self, ev):
|
|
|
if QT5:
|
|
@@ -320,13 +330,6 @@ class Canvas(QtWidgets.QWidget):
|
|
|
index, shape = self.hVertex, self.hShape
|
|
|
shape.highlightVertex(index, shape.MOVE_VERTEX)
|
|
|
return
|
|
|
- if self.addedVertex() and self.hShape is not None:
|
|
|
- index2, shape = self.addVertex, self.hShape
|
|
|
- shape.insertPoint(index2, point)
|
|
|
- shape.highlightVertex(index2, shape.MOVE_VERTEX)
|
|
|
- self.addVertex = None
|
|
|
- self.hVertex = index2
|
|
|
- return
|
|
|
for shape in reversed(self.shapes):
|
|
|
if self.isVisible(shape) and shape.containsPoint(point):
|
|
|
shape.selected = True
|