-
Notifications
You must be signed in to change notification settings - Fork 842
/
Copy pathAbstractNodeGeometry.cpp
77 lines (54 loc) · 2.11 KB
/
AbstractNodeGeometry.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "AbstractNodeGeometry.hpp"
#include "AbstractGraphModel.hpp"
#include "StyleCollection.hpp"
#include <QMargins>
#include <cmath>
namespace QtNodes {
AbstractNodeGeometry::AbstractNodeGeometry(AbstractGraphModel &graphModel)
: _graphModel(graphModel)
{
//
}
QRectF AbstractNodeGeometry::boundingRect(NodeId const nodeId) const
{
QSize s = size(nodeId);
double ratio = 0.20;
int widthMargin = s.width() * ratio;
int heightMargin = s.height() * ratio;
QMargins margins(widthMargin, heightMargin, widthMargin, heightMargin);
QRectF r(QPointF(0, 0), s);
return r.marginsAdded(margins);
}
QPointF AbstractNodeGeometry::portScenePosition(NodeId const nodeId,
PortType const portType,
PortIndex const index,
QTransform const &t) const
{
QPointF result = portPosition(nodeId, portType, index);
return t.map(result);
}
PortIndex AbstractNodeGeometry::checkPortHit(NodeId const nodeId,
PortType const portType,
QPointF const nodePoint) const
{
auto const &nodeStyle = StyleCollection::nodeStyle();
PortIndex result = InvalidPortIndex;
if (portType == PortType::None)
return result;
double const tolerance = 2.0 * nodeStyle.ConnectionPointDiameter;
size_t const n = _graphModel.nodeData<unsigned int>(nodeId,
(portType == PortType::Out)
? NodeRole::OutPortCount
: NodeRole::InPortCount);
for (unsigned int portIndex = 0; portIndex < n; ++portIndex) {
auto pp = portPosition(nodeId, portType, portIndex);
QPointF p = pp - nodePoint;
auto distance = std::sqrt(QPointF::dotProduct(p, p));
if (distance < tolerance) {
result = portIndex;
break;
}
}
return result;
}
} // namespace QtNodes