void NodePainter:: drawConnectionPoints(QPainter* painter, NodeGeometry const& geom, NodeState const& state) { painter->setBrush(QColor(Qt::darkGray)); auto diameter = geom.connectionPointDiameter(); auto reducedDiameter = diameter * 0.6; auto drawPoints = [&](PortType portType) { size_t n = state.getEntries(portType).size(); for (size_t i = 0; i < n; ++i) { QPointF p = geom.connectionPointScenePosition(i, portType); double r = 1.0; if (state.isReacting() && state.getEntries(portType)[i].isNull()) { auto diff = geom.draggingPos() - p; double dist = std::sqrt(QPointF::dotProduct(diff, diff)); double const thres = 40.0; r = (dist < thres) ? (2.0 - dist / thres ) : 1.0; } painter->drawEllipse(p, reducedDiameter * r, reducedDiameter * r); } }; drawPoints(PortType::OUT); drawPoints(PortType::IN); }
void NodePainter:: drawConnectionPoints(QPainter* painter, NodeGeometry const& geom, NodeState const& state, NodeDataModel const * model, FlowScene const & scene) { NodeStyle const& nodeStyle = model->nodeStyle(); auto const &connectionStyle = StyleCollection::connectionStyle(); float diameter = nodeStyle.ConnectionPointDiameter; auto reducedDiameter = diameter * 0.6; for(PortType portType: {PortType::Out, PortType::In}) { size_t n = state.getEntries(portType).size(); for (unsigned int i = 0; i < n; ++i) { QPointF p = geom.portScenePosition(i, portType); auto const & dataType = model->dataType(portType, i); bool canConnect = (state.getEntries(portType)[i].empty() || (portType == PortType::Out && model->portOutConnectionPolicy(i) == NodeDataModel::ConnectionPolicy::Many) ); double r = 1.0; if (state.isReacting() && canConnect && portType == state.reactingPortType()) { auto diff = geom.draggingPos() - p; double dist = std::sqrt(QPointF::dotProduct(diff, diff)); bool typeConvertable = false; { if (portType == PortType::In) { typeConvertable = scene.registry().getTypeConverter(state.reactingDataType(), dataType) != nullptr; } else { typeConvertable = scene.registry().getTypeConverter(dataType, state.reactingDataType()) != nullptr; } } if (state.reactingDataType().id == dataType.id || typeConvertable) { double const thres = 40.0; r = (dist < thres) ? (2.0 - dist / thres ) : 1.0; } else { double const thres = 80.0; r = (dist < thres) ? (dist / thres) : 1.0; } } if (connectionStyle.useDataDefinedColors()) { painter->setBrush(connectionStyle.normalColor(dataType.id)); } else { painter->setBrush(nodeStyle.ConnectionPointColor); } painter->drawEllipse(p, reducedDiameter * r, reducedDiameter * r); } }; }