def test_midpoint(self): self.assertEqual(QPointF(5, 0), midpoint(QPointF(0, 0), QPointF(10, 0))) self.assertEqual(QPointF(0, 5), midpoint(QPointF(0, 0), QPointF(0, 10))) self.assertEqual(QPointF(5, 5), midpoint(QPointF(0, 0), QPointF(10, 10)))
def viewportEvent(self, viewportEvent): """ Perform pinch to zoom feature to scale the viewport. :type viewportEvent: QTouchEvent """ if viewportEvent.type() in {QtCore.QEvent.TouchBegin, QtCore.QEvent.TouchUpdate, QtCore.QEvent.TouchEnd}: if viewportEvent.type() in {QtCore.QEvent.TouchBegin, QtCore.QEvent.TouchEnd}: self.pinchFactor = 1.0 pts = viewportEvent.touchPoints() if len(pts) == 2: p0 = pts[0] p1 = pts[1] p2 = midpoint(p0.pos(), p1.pos()) pinchFactor = QtCore.QLineF(p0.pos(), p1.pos()).length() / QtCore.QLineF(p0.startPos(), p1.startPos()).length() pinchFactor = snapF(pinchFactor, DiagramView.PinchSize) if pinchFactor < DiagramView.PinchGuard[0] or pinchFactor > DiagramView.PinchGuard[1]: if pinchFactor != self.pinchFactor: zoom = self.zoom zoom += +DiagramView.ZoomStep if pinchFactor > self.pinchFactor else -DiagramView.ZoomStep zoom = clamp(zoom, DiagramView.ZoomMin, DiagramView.ZoomMax) self.pinchFactor = pinchFactor if zoom != self.zoom: self.scaleViewOnPoint(zoom, p2.toPoint()) return super().viewportEvent(viewportEvent)
def updatePos(self, points): """ Update the current text position with respect to the shape. :type points: T <= tuple | list """ if not points: return if self.isCentered(): # Here the label should be centered in the edge path. # In this case we need to handle 2 different situations: # 1. when the edge path is composed of an even number of points (odd subpaths) # 2. when the edge path is composed of an odd number of points (even subpaths) if len(points) % 2 == 0: # If we have an even number of points, compute the position of the label # according to the midpoint of the subpath connecting the middle points. p1 = points[int(len(points) / 2) - 1] p2 = points[int(len(points) / 2)] mid = midpoint(p1, p2) rad = angle(p1, p2) spaceX = -40 spaceY = -16 self.setPos( QtCore.QPointF(mid.x() + spaceX * sin(rad), mid.y() + spaceY * cos(rad))) else: # If we have an odd number of points compute the position # of the label according the point in the middle of the edge. mid = points[int(len(points) / 2)] rad1 = angle(points[int(len(points) / 2) - 1], mid) rad2 = angle(mid, points[int(len(points) / 2) + 1]) diff = rad2 - rad1 spaceX1 = 0 spaceX2 = 0 spaceY = -16 if 0 < diff < M_PI: spaceX1 = -80 * sin(rad1) spaceX2 = -80 * sin(rad2) spaceY += spaceY * sin(diff) * 1.8 self.setPos( QtCore.QPointF(mid.x() + spaceX1 + spaceX2, mid.y() + spaceY)) else: # Here instead we will place the label near the intersection with # the target shape: this is mostly used for input edges connecting # role chain nodes and property assertion nodes, so we can inspect # visually the partecipation order of connected nodes without having # to scroll the diagram. rad = angle(points[-2], points[-1]) pos = points[-1] - QtCore.QPointF( sin(rad + M_PI / 3.0) * 20, cos(rad + M_PI / 3.0) * 20) self.setPos(pos)
def updatePos(self, points): """ Update the current text position with respect to the shape. :type points: T <= tuple | list """ if not points: return if self.isCentered(): # Here the label should be centered in the edge path. # In this case we need to handle 2 different situations: # 1. when the edge path is composed of an even number of points (odd subpaths) # 2. when the edge path is composed of an odd number of points (even subpaths) if len(points) % 2 == 0: # If we have an even number of points, compute the position of the label # according to the midpoint of the subpath connecting the middle points. p1 = points[int(len(points) / 2) - 1] p2 = points[int(len(points) / 2)] mid = midpoint(p1, p2) rad = angle(p1, p2) spaceX = -40 spaceY = -16 self.setPos(QtCore.QPointF(mid.x() + spaceX * sin(rad), mid.y() + spaceY * cos(rad))) else: # If we have an odd number of points compute the position # of the label according the point in the middle of the edge. mid = points[int(len(points) / 2)] rad1 = angle(points[int(len(points) / 2) - 1], mid) rad2 = angle(mid, points[int(len(points) / 2) + 1]) diff = rad2 - rad1 spaceX1 = 0 spaceX2 = 0 spaceY = -16 if 0 < diff < M_PI: spaceX1 = -80 * sin(rad1) spaceX2 = -80 * sin(rad2) spaceY += spaceY * sin(diff) * 1.8 self.setPos(QtCore.QPointF(mid.x() + spaceX1 + spaceX2, mid.y() + spaceY)) else: # Here instead we will place the label near the intersection with # the target shape: this is mostly used for input edges connecting # role chain nodes and property assertion nodes, so we can inspect # visually the partecipation order of connected nodes without having # to scroll the diagram. rad = angle(points[-2], points[-1]) pos = points[-1] - QtCore.QPointF(sin(rad + M_PI / 3.0) * 20, cos(rad + M_PI / 3.0) * 20) self.setPos(pos)
def viewportEvent(self, viewportEvent): """ Perform pinch to zoom feature to scale the viewport. :type viewportEvent: QTouchEvent """ if viewportEvent.type() in { QtCore.QEvent.TouchBegin, QtCore.QEvent.TouchUpdate, QtCore.QEvent.TouchEnd }: if viewportEvent.type() in { QtCore.QEvent.TouchBegin, QtCore.QEvent.TouchEnd }: self.pinchFactor = 1.0 pts = viewportEvent.touchPoints() if len(pts) == 2: p0 = pts[0] p1 = pts[1] p2 = midpoint(p0.pos(), p1.pos()) pinchFactor = QtCore.QLineF( p0.pos(), p1.pos()).length() / QtCore.QLineF( p0.startPos(), p1.startPos()).length() pinchFactor = snapF(pinchFactor, DiagramView.PinchSize) if pinchFactor < DiagramView.PinchGuard[ 0] or pinchFactor > DiagramView.PinchGuard[1]: if pinchFactor != self.pinchFactor: zoom = self.zoom zoom += +DiagramView.ZoomStep if pinchFactor > self.pinchFactor else -DiagramView.ZoomStep zoom = clamp(zoom, DiagramView.ZoomMin, DiagramView.ZoomMax) self.pinchFactor = pinchFactor if zoom != self.zoom: self.scaleViewOnPoint(zoom, p2.toPoint()) return super().viewportEvent(viewportEvent)
def test_midpoint(self): self.assertEqual(QtCore.QPointF(5, 0), midpoint(QtCore.QPointF(0, 0), QtCore.QPointF(10, 0))) self.assertEqual(QtCore.QPointF(0, 5), midpoint(QtCore.QPointF(0, 0), QtCore.QPointF(0, 10))) self.assertEqual(QtCore.QPointF(5, 5), midpoint(QtCore.QPointF(0, 0), QtCore.QPointF(10, 10)))
def test_midpoint(): assert QtCore.QPointF(5, 0) == midpoint(QtCore.QPointF(0, 0), QtCore.QPointF(10, 0)) assert QtCore.QPointF(0, 5) == midpoint(QtCore.QPointF(0, 0), QtCore.QPointF(0, 10)) assert QtCore.QPointF(5, 5) == midpoint(QtCore.QPointF(0, 0), QtCore.QPointF(10, 10))