Ejemplo n.º 1
0
 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)))
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 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)))
Ejemplo n.º 7
0
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))