void Connection::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { QGraphicsObject::mouseReleaseEvent(event); if (drag_state == CONNECTED) return; ungrabMouse(); clearFocus(); setFlag(QGraphicsItem::ItemIsFocusable, false); InputPort* target = gscene()->getInputPortAt(endPos()); Datum* datum = target ? target->getDatum() : NULL; if (target && datum->acceptsLink(link)) { datum->addLink(link); drag_state = CONNECTED; connect(endInspector(), &NodeInspector::moved, this, &Connection::onInspectorMoved); connect(endInspector(), &NodeInspector::hiddenChanged, this, &Connection::onHiddenChanged); App::instance()->pushStack(new UndoAddLinkCommand(link)); } else { link->deleteLater(); } prepareGeometryChange(); }
InputPort* NodeInspector::inputPort(const Datum* d) const { for (auto row : rows) for (auto a : row->childItems()) { InputPort* p = dynamic_cast<InputPort*>(a); if (p && p->getDatum() == d) return p; } return NULL; }
InputPort* Canvas::getInputPortNear(QPointF pos, Link* link) const { float distance = INFINITY; InputPort* port = NULL; for (auto i : scene->items()) { InputPort* p = dynamic_cast<InputPort*>(i); if (p && (link == NULL || p->getDatum()->acceptsLink(link))) { QPointF delta = p->mapToScene(p->boundingRect().center()) - pos; float d = QPointF::dotProduct(delta, delta); if (d < distance) { distance = d; port = p; } } } return port; }