AbstractNodeGeometry.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "AbstractNodeGeometry.hpp"
  2. #include "AbstractGraphModel.hpp"
  3. #include "StyleCollection.hpp"
  4. #include <QMargins>
  5. #include <cmath>
  6. namespace QtNodes {
  7. AbstractNodeGeometry::AbstractNodeGeometry(AbstractGraphModel &graphModel)
  8. : _graphModel(graphModel)
  9. {
  10. //
  11. }
  12. QRectF AbstractNodeGeometry::boundingRect(NodeId const nodeId) const
  13. {
  14. QSize s = size(nodeId);
  15. double ratio = 0.20;
  16. int widthMargin = s.width() * ratio;
  17. int heightMargin = s.height() * ratio;
  18. QMargins margins(widthMargin, heightMargin, widthMargin, heightMargin);
  19. QRectF r(QPointF(0, 0), s);
  20. return r.marginsAdded(margins);
  21. }
  22. QPointF AbstractNodeGeometry::portScenePosition(NodeId const nodeId,
  23. PortType const portType,
  24. PortIndex const index,
  25. QTransform const &t) const
  26. {
  27. QPointF result = portPosition(nodeId, portType, index);
  28. return t.map(result);
  29. }
  30. PortIndex AbstractNodeGeometry::checkPortHit(NodeId const nodeId,
  31. PortType const portType,
  32. QPointF const nodePoint) const
  33. {
  34. auto const &nodeStyle = StyleCollection::nodeStyle();
  35. PortIndex result = InvalidPortIndex;
  36. if (portType == PortType::None)
  37. return result;
  38. double const tolerance = 2.0 * nodeStyle.ConnectionPointDiameter;
  39. size_t const n = _graphModel.nodeData<unsigned int>(nodeId,
  40. (portType == PortType::Out)
  41. ? NodeRole::OutPortCount
  42. : NodeRole::InPortCount);
  43. for (unsigned int portIndex = 0; portIndex < n; ++portIndex) {
  44. auto pp = portPosition(nodeId, portType, portIndex);
  45. QPointF p = pp - nodePoint;
  46. auto distance = std::sqrt(QPointF::dotProduct(p, p));
  47. if (distance < tolerance) {
  48. result = portIndex;
  49. break;
  50. }
  51. }
  52. return result;
  53. }
  54. } // namespace QtNodes