diff --git a/ui/nodeui.cpp b/ui/nodeui.cpp index aacda3065..ebc3f10bd 100644 --- a/ui/nodeui.cpp +++ b/ui/nodeui.cpp @@ -12,13 +12,14 @@ #include #include "ui/effectui.h" +#include "global/math.h" const int kRoundedRectRadius = 5; const int kNodePlugSize = 10; NodeUI::NodeUI() : central_widget_(nullptr), - clicked_socket_(false) + clicked_socket_(-1) { setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); @@ -94,17 +95,20 @@ void NodeUI::mousePressEvent(QGraphicsSceneMouseEvent *event) { QVector sockets = GetNodeSocketRects(); - clicked_socket_ = false; + clicked_socket_ = -1; for (int i=0;ipos())) { - clicked_socket_ = true; + clicked_socket_ = i; break; } } - if (clicked_socket_) { - qDebug() << "Clicked socket!"; + if (clicked_socket_ > -1) { + drag_line_start_ = pos() + sockets.at(clicked_socket_).center(); + drag_line_ = scene()->addPath(GetEdgePath(drag_line_start_, event->scenePos()), + QPen(Qt::white, 2)); + event->accept(); } else { QGraphicsItem::mousePressEvent(event); @@ -113,7 +117,11 @@ void NodeUI::mousePressEvent(QGraphicsSceneMouseEvent *event) void NodeUI::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - if (clicked_socket_) { + if (clicked_socket_ > -1) { + + drag_line_->setPath(GetEdgePath(drag_line_start_, event->scenePos())); + + event->accept(); } else { QGraphicsItem::mouseMoveEvent(event); @@ -122,13 +130,28 @@ void NodeUI::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void NodeUI::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { - if (clicked_socket_) { - + if (clicked_socket_ > -1) { + scene()->removeItem(drag_line_); + delete drag_line_; + event->accept(); } else { QGraphicsItem::mouseReleaseEvent(event); } } +QPainterPath NodeUI::GetEdgePath(const QPointF &start_pos, const QPointF &end_pos) +{ + double mid_x = double_lerp(start_pos.x(), end_pos.x(), 0.5); + + QPainterPath path_; + path_.moveTo(start_pos); + path_.cubicTo(QPointF(mid_x, start_pos.y()), + QPointF(mid_x, end_pos.y()), + end_pos); + + return path_; +} + QVector NodeUI::GetNodeSocketRects() { QVector rects; diff --git a/ui/nodeui.h b/ui/nodeui.h index 3cb50d2a6..2ac1b0c48 100644 --- a/ui/nodeui.h +++ b/ui/nodeui.h @@ -22,12 +22,16 @@ protected: virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; private: QVector GetNodeSocketRects(); + QPainterPath GetEdgePath(const QPointF& start_pos, const QPointF& end_pos); EffectUI* central_widget_; QGraphicsProxyWidget* proxy_; QPainterPath path_; - bool clicked_socket_; + QGraphicsPathItem* drag_line_; + QPointF drag_line_start_; + + int clicked_socket_; }; #endif // NODEUI_H