#include "ConnectionGeometry.hpp" #include #include "StyleCollection.hpp" using QtNodes::ConnectionGeometry; using QtNodes::PortType; ConnectionGeometry:: ConnectionGeometry() : _in(0, 0) , _out(0, 0) //, _animationPhase(0) , _lineWidth(3.0) , _hovered(false) { } QPointF const& ConnectionGeometry:: getEndPoint(PortType portType) const { Q_ASSERT(portType != PortType::None); return (portType == PortType::Out ? _out : _in); } void ConnectionGeometry:: setEndPoint(PortType portType, QPointF const& point) { switch (portType) { case PortType::Out: _out = point; break; case PortType::In: _in = point; break; default: break; } } void ConnectionGeometry:: moveEndPoint(PortType portType, QPointF const &offset) { switch (portType) { case PortType::Out: _out += offset; break; case PortType::In: _in += offset; break; default: break; } } QRectF ConnectionGeometry:: boundingRect() const { auto points = pointsC1C2(); QRectF basicRect = QRectF(_out, _in).normalized(); QRectF c1c2Rect = QRectF(points.first, points.second).normalized(); auto const &connectionStyle = StyleCollection::connectionStyle(); float const diam = connectionStyle.pointDiameter(); QRectF commonRect = basicRect.united(c1c2Rect); QPointF const cornerOffset(diam, diam); commonRect.setTopLeft(commonRect.topLeft() - cornerOffset); commonRect.setBottomRight(commonRect.bottomRight() + 2 * cornerOffset); return commonRect; } std::pair ConnectionGeometry:: pointsC1C2() const { const double defaultOffset = 200; double xDistance = _in.x() - _out.x(); double horizontalOffset = qMin(defaultOffset, std::abs(xDistance)); double verticalOffset = 0; double ratioX = 0.5; if (xDistance <= 0) { double yDistance = _in.y() - _out.y() + 20; double vector = yDistance < 0 ? -1.0 : 1.0; verticalOffset = qMin(defaultOffset, std::abs(yDistance)) * vector; ratioX = 1.0; } horizontalOffset *= ratioX; QPointF c1(_out.x() + horizontalOffset, _out.y() + verticalOffset); QPointF c2(_in.x() - horizontalOffset, _in.y() - verticalOffset); return std::make_pair(c1, c2); }