void QNEConnection::updatePath() { QPainterPath p; //QPointF pos1(m_port1->scenePos()); //QPointF pos2(m_port2->scenePos()); p.moveTo(pos1); qreal dx = pos2.x() - pos1.x(); qreal dy = pos2.y() - pos1.y(); QPointF ctr1(pos1.x() + dx * 0.33, pos1.y() + dy * 0.1); QPointF ctr2(pos1.x() + dx * 0.66, pos1.y() + dy * 0.9); p.cubicTo(ctr1, ctr2, pos2); setPath(p); }
/**************************************************************************** ** ** Copyright (C) 2016 - 2017 ** ** This file is generated by the Magus toolkit ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ****************************************************************************/ // Include #include <QMessageBox> #include <QStyleOptionGraphicsItem> #include <QPen> #include <QBrush> #include <QColor> #include "node_connection.h" #include "node_port.h" #include "node_node.h" namespace Magus { //****************************************************************************/ QtConnection::QtConnection(QtPort* basePort, QGraphicsPathItem* parent) : QGraphicsPathItem(parent) { setPen(QPen(Qt::black, 3)); setBrush(Qt::NoBrush); mTargetPort = 0; mBasePort = basePort; mColor = Qt::black; } //****************************************************************************/ QtConnection::~QtConnection(void) { } //****************************************************************************/ void QtConnection::setSelected(bool selected) { if (selected) { setPen(QPen(QColor("#cc7800"), 3)); } else { setPen(QPen(mColor, 3)); } } //****************************************************************************/ void QtConnection::setBasePort(QtPort* basePort) { mBasePort = basePort; } //****************************************************************************/ QtPort* QtConnection::getBasePort(void) { return mBasePort; } //****************************************************************************/ void QtConnection::setTargetPort(QtPort* targetPort) { mTargetPort = targetPort; } //****************************************************************************/ QtPort* QtConnection::getTargetPort(void) { return mTargetPort; } //****************************************************************************/ void QtConnection::updatePath(const QPointF& altTargetPos) { QPointF basePos = mBasePort->scenePos(); QPointF targetPos; if (mTargetPort) { targetPos = mTargetPort->scenePos(); //QMessageBox::information(0, "test", "test"); // Test } else targetPos = altTargetPos; QPainterPath p; p.moveTo(basePos); qreal dx = targetPos.x() - basePos.x(); qreal dy = targetPos.y() - basePos.y(); QPointF ctr1(basePos.x() + dx * 0.45, basePos.y() + dy * 0.1); QPointF ctr2(basePos.x() + dx * 0.55, basePos.y() + dy * 0.9); p.cubicTo(ctr1, ctr2, targetPos); setPath(p); }
void QNEConnection::updatePath() { if(!m_port1 || !m_port2) { QPainterPath p; //QPointF pos1(m_port1->scenePos()); //QPointF pos2(m_port2->scenePos()); p.moveTo(pos1); qreal dx = pos2.x() - pos1.x(); qreal dy = pos2.y() - pos1.y(); QPointF ctr1(pos1.x() + dx * 0.25, pos1.y() + dy * 0.1); QPointF ctr2(pos1.x() + dx * 0.75, pos1.y() + dy * 0.9); p.cubicTo(ctr1, ctr2, pos2); setPath(p); return; } QPointF a(mapFromItem(m_port1, 0, 0)); QPointF b(mapFromItem(m_port2, 0, 0)); qreal dist = QLineF(a, b).length(); qreal diffx = abs(a.x() - b.x()); qreal diffy = abs(a.y() - b.y()); QPointF left; QPointF right; QNEPort* leftConn; QNEPort* rightConn; if (a.x() < b.x()) { left = a; leftConn = m_port1; right = b; rightConn = m_port2; } else { left = b; leftConn = m_port2; right = a; rightConn = m_port1; } QPointF bottom; QPointF top; QNEPort* bottomConn; QNEPort* topConn; if (a.y() < b.y()) { top = a; topConn = m_port1; bottom = b; bottomConn = m_port2; } else { top = b; topConn = m_port2; bottom = a; bottomConn = m_port1; } QPointF controlPoint1 = a; QPointF controlPoint2 = b; //how much to move control point from start or end point, default as used for simple case qreal moveX = 0.45 * diffx; qreal moveY = 0.45 * diffy; QSizeF combinedSize(30,30); if (leftConn->parentItem() != NULL) { combinedSize.setWidth(leftConn->parentItem()->boundingRect().width()); combinedSize.setHeight(leftConn->parentItem()->boundingRect().height()); } else { combinedSize.setWidth(5 * leftConn->radius()); combinedSize.setWidth(5 * leftConn->radius()); } if (rightConn->parentItem() != NULL) { combinedSize.setWidth(combinedSize.width() + rightConn->parentItem()->boundingRect().width()); combinedSize.setHeight(combinedSize.height() + rightConn->parentItem()->boundingRect().height()); } else { combinedSize.setWidth(combinedSize.width() + 5 * rightConn->radius()); combinedSize.setHeight(combinedSize.height() + 5 * rightConn->radius()); } if (leftConn->position() == rightConn->position() && leftConn->position() == QNEPort::LeftPosition && right.x() - left.x() < combinedSize.width()/2.0) { controlPoint1.setX(controlPoint1.x() - moveY/2.0 /*- combinedSize.width()/2.0*/); controlPoint2.setX(controlPoint2.x() - moveY/2.0 /*- combinedSize.width()/2.0*/); } else if (leftConn->position() == rightConn->position() && leftConn->position() == QNEPort::RightPosition && right.x() - left.x() < combinedSize.width()/2.0) { controlPoint1.setX(controlPoint1.x() + moveY/2.0 /*+ combinedSize.width()/2.0*/); controlPoint2.setX(controlPoint2.x() + moveY/2.0 /*+ combinedSize.width()/2.0*/); } else if (leftConn->position() == rightConn->position() && leftConn->position() == QNEPort::TopPosition && bottom.y() - top.y() < combinedSize.height()/2.0) { controlPoint1.setY(controlPoint1.y() - moveX/2.0 /*- combinedSize.height()/2.0*/); controlPoint2.setY(controlPoint2.y() - moveX/2.0 /*- combinedSize.height()/2.0*/); } else if (leftConn->position() == rightConn->position() && leftConn->position() == QNEPort::BottomPosition && bottom.y() - top.y() < combinedSize.height()/2.0) { controlPoint1.setY(controlPoint1.y() + moveX/2.0 /*+ combinedSize.height()/2.0*/); controlPoint2.setY(controlPoint2.y() + moveX/2.0 /*+ combinedSize.height()/2.0*/); } else //the simple case, they face each other the "good" way if (leftConn->position() != QNEPort::LeftPosition && rightConn->position() != QNEPort::RightPosition && topConn->position() != QNEPort::TopPosition && bottomConn->position() != QNEPort::BottomPosition) { //very simple: straight line //controlPoint1 = a + 0.3 * (b-a); //controlPoint2 = a + 0.7 * (b-a); controlPoint1 = a; controlPoint2 = b; //how much to move control point from start or end point qreal moveX = 0.45 * diffx; qreal moveY = 0.45 * diffy; if (dist > 5 * (m_port1->radius() + arrowSize)) { /* does mess up good case because moves there too if (abs(diffx-diffy) > 0.3 * dist) { moveX += abs(diffx-diffy); moveY += abs(diffx-diffy); } */ if (moveX < 3 * (m_port1->radius() + arrowSize)) { moveX = 3 * (m_port1->radius() + arrowSize); } if (moveY < 3 * (m_port1->radius() + arrowSize)) { moveY = 3 * (m_port1->radius() + arrowSize); } } if (m_port1->position() == QNEPort::LeftPosition) { controlPoint1.setX(controlPoint1.x() - moveX); } else if (m_port1->position() == QNEPort::RightPosition) { controlPoint1.setX(controlPoint1.x() + moveX); } else if (m_port1->position() == QNEPort::BottomPosition) { controlPoint1.setY(controlPoint1.y() + moveY); } else if (m_port1->position() == QNEPort::TopPosition) { controlPoint1.setY(controlPoint1.y() - moveY); } if (m_port2->position() == QNEPort::LeftPosition) { controlPoint2.setX(controlPoint2.x() - moveX); } else if (m_port2->position() == QNEPort::RightPosition) { controlPoint2.setX(controlPoint2.x() + moveX); } else if (m_port2->position() == QNEPort::BottomPosition) { controlPoint2.setY(controlPoint2.y() + moveY); } else if (m_port2->position() == QNEPort::TopPosition) { controlPoint2.setY(controlPoint2.y() - moveY); } } //the bad case, method needs cleanup else { controlPoint1 = a; controlPoint2 = b; qreal maxMove = 0.5 * dist; moveX = 0.5 * dist; moveY = 0.5 * dist; if (m_port1->parentItem() != NULL) { maxMove = 1 * (m_port1->parentItem()->boundingRect().width() + m_port1->parentItem()->boundingRect().height()); } else if (m_port2->parentItem() != NULL) { maxMove = 1 * (m_port2->parentItem()->boundingRect().width() + m_port2->parentItem()->boundingRect().height()); } if (moveX > maxMove) { moveX = maxMove + 0.1 * (moveX-maxMove); } if (moveY > maxMove) { moveY = maxMove + 0.1 * (moveY-maxMove); } if (m_port1->position() == QNEPort::LeftPosition) { moveX *= -1; if ((m_port1 == topConn) == (m_port1 == rightConn)) { moveY *= -1;//relevantHeight; } } else if (m_port1->position() == QNEPort::RightPosition) { //moveX *= 1; if ((m_port1 == topConn) == (m_port1 == leftConn)) { moveY *= -1;//relevantHeight; } } else if (m_port1->position() == QNEPort::BottomPosition) { //moveY *= 1; if ((m_port1 == leftConn) == (m_port1 == topConn)) { moveX *= -1; } } else if (m_port1->position() == QNEPort::TopPosition) { moveY *= -1; if ((m_port1 == leftConn) == (m_port1 == bottomConn)) { moveX *= -1; } } /* if (m_port1->connectorAlignment() == m_port2->connectorAlignment()) { moveX *= 2; moveY *= 2; } */ //ugly shit: handle some cases that don't look nice if (m_port2 == topConn && topConn->position() == QNEPort::TopPosition && (bottomConn->position() == QNEPort::LeftPosition || bottomConn->position() == QNEPort::RightPosition)) { moveY *= -1; //moveY = 0; } else if (m_port2 == bottomConn && bottomConn->position() == QNEPort::BottomPosition && (topConn->position() == QNEPort::LeftPosition || topConn->position() == QNEPort::RightPosition)) { moveY *= -1; //moveY = 0; } else if (m_port2 == leftConn && leftConn->position() == QNEPort::LeftPosition && (rightConn->position() == QNEPort::TopPosition || rightConn->position() == QNEPort::BottomPosition)) { moveX *= -1; //moveX = 0; } else if (m_port2 == rightConn && rightConn->position() == QNEPort::RightPosition && (leftConn->position() == QNEPort::TopPosition || leftConn->position() == QNEPort::BottomPosition)) { moveX *= -1; //moveX = 0; } controlPoint1.setX(controlPoint1.x() + moveX); controlPoint1.setY(controlPoint1.y() + moveY); moveX = 0.5 * dist; moveY = 0.5 * dist; // if start was null, then it was already set to end. if (m_port1->parentItem() != NULL && m_port2->parentItem() != NULL) { maxMove = 1 * (m_port2->parentItem()->boundingRect().width() + m_port2->parentItem()->boundingRect().height()); } if (moveX > maxMove) { moveX = maxMove + 0.1 * (moveX-maxMove); } if (moveY > maxMove) { moveY = maxMove + 0.1 * (moveY-maxMove); } if (m_port2->position() == QNEPort::LeftPosition) { moveX *= -1; if ((m_port2 == topConn) == (m_port2 == rightConn)) { moveY *= -1;//relevantHeight; } } else if (m_port2->position() == QNEPort::RightPosition) { //moveX *= 1; if ((m_port2 == topConn) == (m_port2 == leftConn)) { moveY *= -1;//relevantHeight; } } else if (m_port2->position() == QNEPort::BottomPosition) { //moveY *= 1; if ((m_port1 == leftConn) == (m_port1 == topConn)) { moveX *= -1; } } else if (m_port2->position() == QNEPort::TopPosition) { moveY *= -1; if ((m_port1 == leftConn) == (m_port1 == bottomConn)) { moveX *= -1; } } /* if (m_port1->connectorAlignment() == m_port2->connectorAlignment()) { moveX *= 2; moveY *= 2; }*/ //ugly shit: handle some cases that don't look nice if (m_port1 == topConn && topConn->position() == QNEPort::TopPosition && (bottomConn->position() == QNEPort::LeftPosition || bottomConn->position() == QNEPort::RightPosition)) { moveY *= -1; //moveY = 0; } else if (m_port1 == bottomConn && bottomConn->position() == QNEPort::BottomPosition && (topConn->position() == QNEPort::LeftPosition || topConn->position() == QNEPort::RightPosition)) { moveY *= -1; //moveY = 0; } else if (m_port1 == leftConn && leftConn->position() == QNEPort::LeftPosition && (rightConn->position() == QNEPort::TopPosition || rightConn->position() == QNEPort::BottomPosition)) { moveX *= -1; //moveX = 0; } else if (m_port1 == rightConn && rightConn->position() == QNEPort::RightPosition && (leftConn->position() == QNEPort::TopPosition || leftConn->position() == QNEPort::BottomPosition)) { moveX *= -1; //moveX = 0; } controlPoint2.setX(controlPoint2.x() + moveX); controlPoint2.setY(controlPoint2.y() + moveY); } QPainterPath p(a); p.cubicTo(controlPoint1, controlPoint2, b); if(m_port1->isOutput()) p.addPolygon(createArrowPoly(p, m_port1)); if(m_port2->isOutput()) p.addPolygon(createArrowPoly(p, m_port2)); this->setPath(p); if(scene()) { QPalette palette = scene()->palette(); setPen(QPen(palette.dark().color(), 2)); setBrush(Qt::NoBrush); } }