forked from paceholder/nodeeditor
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathConnectionGeometry.cpp
More file actions
119 lines (90 loc) · 2.04 KB
/
ConnectionGeometry.cpp
File metadata and controls
119 lines (90 loc) · 2.04 KB
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "ConnectionGeometry.hpp"
ConnectionGeometry::
ConnectionGeometry()
: _in(0, 0)
, _out(0, 0)
, _pointDiameter(10)
//, _animationPhase(0)
, _lineWidth(3.0)
, _hovered(false)
{ }
QPointF const&
ConnectionGeometry::
getEndPoint(PortType portType) const
{
Q_ASSERT(portType != PortType::NONE);
return (portType == PortType::OUT ?
_out :
_in);
}
void
ConnectionGeometry::
setEndPoint(PortType portType, QPointF const& point)
{
switch (portType)
{
case PortType::OUT:
_out = point;
break;
case PortType::IN:
_in = point;
break;
default:
break;
}
}
void
ConnectionGeometry::
moveEndPoint(PortType portType, QPointF const &offset)
{
switch (portType)
{
case PortType::OUT:
_out += offset;
break;
case PortType::IN:
_in += offset;
break;
default:
break;
}
}
QRectF
ConnectionGeometry::
boundingRect() const
{
auto points = pointsC1C2();
QRectF basicRect(_out, _in);
QRectF c1c2Rect(points.first, points.second);
QMargins margins(_pointDiameter,
_pointDiameter,
_pointDiameter,
_pointDiameter);
return basicRect.united(c1c2Rect).marginsAdded(margins);
}
std::pair<QPointF, QPointF>
ConnectionGeometry::
pointsC1C2() const
{
double xDistance = _in.x() - _out.x();
//double yDistance = _in.y() - _out.y() - 100;
double defaultOffset = 200;
double minimum = qMin(defaultOffset, std::abs(xDistance));
double verticalOffset = 0;
double ratio1 = 0.5;
if (xDistance <= 0)
{
verticalOffset = -minimum;
ratio1 = 1.0;
}
//double verticalOffset2 = verticalOffset;
//if (xDistance <= 0)
//verticalOffset2 = qMin(defaultOffset, std::abs(yDistance));
//auto sign = [](double d) { return d > 0.0 ? +1.0 : -1.0; };
//verticalOffset2 = 0.0;
QPointF c1(_out.x() + minimum * ratio1,
_out.y() + verticalOffset);
QPointF c2(_in.x() - minimum * ratio1,
_in.y() + verticalOffset);
return std::make_pair(c1, c2);
}