Skip to content

Commit 82417fe

Browse files
dine-jpaceholder
authored andcommitted
Add AbstractConnectionPainter to enable custom connections
1 parent 77f3ad1 commit 82417fe

10 files changed

+144
-90
lines changed

CMakeLists.txt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,21 +75,21 @@ set(CPP_SOURCE_FILES
7575
src/AbstractNodeGeometry.cpp
7676
src/BasicGraphicsScene.cpp
7777
src/ConnectionGraphicsObject.cpp
78-
src/ConnectionPainter.cpp
7978
src/ConnectionState.cpp
8079
src/ConnectionStyle.cpp
8180
src/DataFlowGraphModel.cpp
8281
src/DataFlowGraphicsScene.cpp
82+
src/DefaultConnectionPainter.cpp
8383
src/DefaultHorizontalNodeGeometry.cpp
84+
src/DefaultNodePainter.cpp
8485
src/DefaultVerticalNodeGeometry.cpp
8586
src/Definitions.cpp
8687
src/GraphicsView.cpp
8788
src/GraphicsViewStyle.cpp
88-
src/NodeDelegateModelRegistry.cpp
8989
src/NodeConnectionInteraction.cpp
9090
src/NodeDelegateModel.cpp
91+
src/NodeDelegateModelRegistry.cpp
9192
src/NodeGraphicsObject.cpp
92-
src/DefaultNodePainter.cpp
9393
src/NodeState.cpp
9494
src/NodeStyle.cpp
9595
src/StyleCollection.cpp
@@ -98,6 +98,7 @@ set(CPP_SOURCE_FILES
9898
)
9999

100100
set(HPP_HEADER_FILES
101+
include/QtNodes/internal/AbstractConnectionPainter.hpp
101102
include/QtNodes/internal/AbstractGraphModel.hpp
102103
include/QtNodes/internal/AbstractNodeGeometry.hpp
103104
include/QtNodes/internal/AbstractNodePainter.hpp
@@ -110,7 +111,6 @@ set(HPP_HEADER_FILES
110111
include/QtNodes/internal/ConnectionStyle.hpp
111112
include/QtNodes/internal/DataFlowGraphicsScene.hpp
112113
include/QtNodes/internal/DataFlowGraphModel.hpp
113-
include/QtNodes/internal/DefaultNodePainter.hpp
114114
include/QtNodes/internal/Definitions.hpp
115115
include/QtNodes/internal/Export.hpp
116116
include/QtNodes/internal/GraphicsView.hpp
@@ -128,8 +128,9 @@ set(HPP_HEADER_FILES
128128
include/QtNodes/internal/Serializable.hpp
129129
include/QtNodes/internal/Style.hpp
130130
include/QtNodes/internal/StyleCollection.hpp
131-
src/ConnectionPainter.hpp
131+
src/DefaultConnectionPainter.hpp
132132
src/DefaultHorizontalNodeGeometry.hpp
133+
src/DefaultNodePainter.hpp
133134
src/DefaultVerticalNodeGeometry.hpp
134135
src/NodeConnectionInteraction.hpp
135136
src/UndoCommands.hpp
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "internal/AbstractConnectionPainter.hpp"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include <QPainter>
4+
5+
#include "Export.hpp"
6+
7+
class QPainter;
8+
9+
namespace QtNodes {
10+
11+
class ConnectionGraphicsObject;
12+
13+
/// Class enables custom painting for connections.
14+
class NODE_EDITOR_PUBLIC AbstractConnectionPainter
15+
{
16+
public:
17+
virtual ~AbstractConnectionPainter() = default;
18+
19+
/**
20+
* Reimplement this function in order to have a custom connection painting.
21+
*/
22+
virtual void paint(QPainter *painter, ConnectionGraphicsObject const &cgo) const = 0;
23+
24+
virtual QPainterPath getPainterStroke(ConnectionGraphicsObject const &cgo) const = 0;
25+
};
26+
} // namespace QtNodes

include/QtNodes/internal/BasicGraphicsScene.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class QUndoStack;
2121

2222
namespace QtNodes {
2323

24+
class AbstractConnectionPainter;
2425
class AbstractGraphModel;
2526
class AbstractNodePainter;
2627
class ConnectionGraphicsObject;
@@ -49,8 +50,12 @@ class NODE_EDITOR_PUBLIC BasicGraphicsScene : public QGraphicsScene
4950

5051
AbstractNodePainter &nodePainter();
5152

53+
AbstractConnectionPainter &connectionPainter();
54+
5255
void setNodePainter(std::unique_ptr<AbstractNodePainter> newPainter);
5356

57+
void setConnectionPainter(std::unique_ptr<AbstractConnectionPainter> newPainter);
58+
5459
QUndoStack &undoStack();
5560

5661
public:
@@ -170,6 +175,8 @@ public Q_SLOTS:
170175

171176
std::unique_ptr<AbstractNodePainter> _nodePainter;
172177

178+
std::unique_ptr<AbstractConnectionPainter> _connectionPainter;
179+
173180
bool _nodeDrag;
174181

175182
QUndoStack *_undoStack;

src/BasicGraphicsScene.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "AbstractNodeGeometry.hpp"
44
#include "ConnectionGraphicsObject.hpp"
55
#include "ConnectionIdUtils.hpp"
6+
#include "DefaultConnectionPainter.hpp"
67
#include "DefaultHorizontalNodeGeometry.hpp"
78
#include "DefaultNodePainter.hpp"
89
#include "DefaultVerticalNodeGeometry.hpp"
@@ -36,6 +37,7 @@ BasicGraphicsScene::BasicGraphicsScene(AbstractGraphModel &graphModel, QObject *
3637
, _graphModel(graphModel)
3738
, _nodeGeometry(std::make_unique<DefaultHorizontalNodeGeometry>(_graphModel))
3839
, _nodePainter(std::make_unique<DefaultNodePainter>())
40+
, _connectionPainter(std::make_unique<DefaultConnectionPainter>())
3941
, _nodeDrag(false)
4042
, _undoStack(new QUndoStack(this))
4143
, _orientation(Qt::Horizontal)
@@ -101,11 +103,21 @@ AbstractNodePainter &BasicGraphicsScene::nodePainter()
101103
return *_nodePainter;
102104
}
103105

106+
AbstractConnectionPainter &BasicGraphicsScene::connectionPainter()
107+
{
108+
return *_connectionPainter;
109+
}
110+
104111
void BasicGraphicsScene::setNodePainter(std::unique_ptr<AbstractNodePainter> newPainter)
105112
{
106113
_nodePainter = std::move(newPainter);
107114
}
108115

116+
void BasicGraphicsScene::setConnectionPainter(std::unique_ptr<AbstractConnectionPainter> newPainter)
117+
{
118+
_connectionPainter = std::move(newPainter);
119+
}
120+
109121
QUndoStack &BasicGraphicsScene::undoStack()
110122
{
111123
return *_undoStack;

src/ConnectionGraphicsObject.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#include "ConnectionGraphicsObject.hpp"
22

3+
#include "AbstractConnectionPainter.hpp"
34
#include "AbstractGraphModel.hpp"
45
#include "AbstractNodeGeometry.hpp"
56
#include "BasicGraphicsScene.hpp"
67
#include "ConnectionIdUtils.hpp"
7-
#include "ConnectionPainter.hpp"
88
#include "ConnectionState.hpp"
99
#include "ConnectionStyle.hpp"
1010
#include "NodeConnectionInteraction.hpp"
@@ -128,7 +128,7 @@ QPainterPath ConnectionGraphicsObject::shape() const
128128
//return path;
129129

130130
#else
131-
return ConnectionPainter::getPainterStroke(*this);
131+
return nodeScene()->connectionPainter().getPainterStroke(*this);
132132
#endif
133133
}
134134

@@ -198,7 +198,7 @@ void ConnectionGraphicsObject::paint(QPainter *painter,
198198

199199
painter->setClipRect(option->exposedRect);
200200

201-
ConnectionPainter::paint(painter, *this);
201+
nodeScene()->connectionPainter().paint(painter, *this);
202202
}
203203

204204
void ConnectionGraphicsObject::mousePressEvent(QGraphicsSceneMouseEvent *event)

src/ConnectionPainter.hpp

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 60 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "ConnectionPainter.hpp"
1+
#include "DefaultConnectionPainter.hpp"
22

33
#include <QtGui/QIcon>
44

@@ -11,7 +11,7 @@
1111

1212
namespace QtNodes {
1313

14-
static QPainterPath cubicPath(ConnectionGraphicsObject const &connection)
14+
QPainterPath DefaultConnectionPainter::cubicPath(ConnectionGraphicsObject const &connection) const
1515
{
1616
QPointF const &in = connection.endPoint(PortType::In);
1717
QPointF const &out = connection.endPoint(PortType::Out);
@@ -26,67 +26,15 @@ static QPainterPath cubicPath(ConnectionGraphicsObject const &connection)
2626
return cubic;
2727
}
2828

29-
QPainterPath ConnectionPainter::getPainterStroke(ConnectionGraphicsObject const &connection)
30-
{
31-
auto cubic = cubicPath(connection);
32-
33-
QPointF const &out = connection.endPoint(PortType::Out);
34-
QPainterPath result(out);
35-
36-
unsigned segments = 20;
37-
38-
for (auto i = 0ul; i < segments; ++i) {
39-
double ratio = double(i + 1) / segments;
40-
result.lineTo(cubic.pointAtPercent(ratio));
41-
}
42-
43-
QPainterPathStroker stroker;
44-
stroker.setWidth(10.0);
45-
46-
return stroker.createStroke(result);
47-
}
48-
49-
#ifdef NODE_DEBUG_DRAWING
50-
static void debugDrawing(QPainter *painter, ConnectionGraphicsObject const &cgo)
51-
{
52-
Q_UNUSED(painter);
53-
54-
{
55-
QPointF const &in = cgo.endPoint(PortType::In);
56-
QPointF const &out = cgo.endPoint(PortType::Out);
57-
58-
auto const points = cgo.pointsC1C2();
59-
60-
painter->setPen(Qt::red);
61-
painter->setBrush(Qt::red);
62-
63-
painter->drawLine(QLineF(out, points.first));
64-
painter->drawLine(QLineF(points.first, points.second));
65-
painter->drawLine(QLineF(points.second, in));
66-
painter->drawEllipse(points.first, 3, 3);
67-
painter->drawEllipse(points.second, 3, 3);
68-
69-
painter->setBrush(Qt::NoBrush);
70-
painter->drawPath(cubicPath(cgo));
71-
}
72-
73-
{
74-
painter->setPen(Qt::yellow);
75-
painter->drawRect(cgo.boundingRect());
76-
}
77-
}
78-
79-
#endif
80-
81-
static void drawSketchLine(QPainter *painter, ConnectionGraphicsObject const &cgo)
29+
void DefaultConnectionPainter::drawSketchLine(QPainter *painter, ConnectionGraphicsObject const &cgo) const
8230
{
8331
ConnectionState const &state = cgo.connectionState();
8432

8533
if (state.requiresPort()) {
8634
auto const &connectionStyle = QtNodes::StyleCollection::connectionStyle();
8735

8836
QPen pen;
89-
pen.setWidth(connectionStyle.constructionLineWidth());
37+
pen.setWidth(static_cast<int>(connectionStyle.constructionLineWidth()));
9038
pen.setColor(connectionStyle.constructionColor());
9139
pen.setStyle(Qt::DashLine);
9240

@@ -100,7 +48,7 @@ static void drawSketchLine(QPainter *painter, ConnectionGraphicsObject const &cg
10048
}
10149
}
10250

103-
static void drawHoveredOrSelected(QPainter *painter, ConnectionGraphicsObject const &cgo)
51+
void DefaultConnectionPainter::drawHoveredOrSelected(QPainter *painter, ConnectionGraphicsObject const &cgo) const
10452
{
10553
bool const hovered = cgo.connectionState().hovered();
10654
bool const selected = cgo.isSelected();
@@ -112,7 +60,7 @@ static void drawHoveredOrSelected(QPainter *painter, ConnectionGraphicsObject co
11260
double const lineWidth = connectionStyle.lineWidth();
11361

11462
QPen pen;
115-
pen.setWidth(2 * lineWidth);
63+
pen.setWidth(static_cast<int>(2 * lineWidth));
11664
pen.setColor(selected ? connectionStyle.selectedHaloColor()
11765
: connectionStyle.hoveredColor());
11866

@@ -125,7 +73,7 @@ static void drawHoveredOrSelected(QPainter *painter, ConnectionGraphicsObject co
12573
}
12674
}
12775

128-
static void drawNormalLine(QPainter *painter, ConnectionGraphicsObject const &cgo)
76+
void DefaultConnectionPainter::drawNormalLine(QPainter *painter, ConnectionGraphicsObject const &cgo) const
12977
{
13078
ConnectionState const &state = cgo.connectionState();
13179

@@ -188,7 +136,7 @@ static void drawNormalLine(QPainter *painter, ConnectionGraphicsObject const &cg
188136
p.setColor(cOut);
189137
painter->setPen(p);
190138

191-
unsigned int const segments = 60;
139+
unsigned int constexpr segments = 60;
192140

193141
for (unsigned int i = 0ul; i < segments; ++i) {
194142
double ratioPrev = double(i) / segments;
@@ -227,7 +175,7 @@ static void drawNormalLine(QPainter *painter, ConnectionGraphicsObject const &cg
227175
}
228176
}
229177

230-
void ConnectionPainter::paint(QPainter *painter, ConnectionGraphicsObject const &cgo)
178+
void DefaultConnectionPainter::paint(QPainter *painter, ConnectionGraphicsObject const &cgo) const
231179
{
232180
drawHoveredOrSelected(painter, cgo);
233181

@@ -251,4 +199,55 @@ void ConnectionPainter::paint(QPainter *painter, ConnectionGraphicsObject const
251199
painter->drawEllipse(cgo.in(), pointRadius, pointRadius);
252200
}
253201

202+
QPainterPath DefaultConnectionPainter::getPainterStroke(ConnectionGraphicsObject const &connection) const
203+
{
204+
auto cubic = cubicPath(connection);
205+
206+
QPointF const &out = connection.endPoint(PortType::Out);
207+
QPainterPath result(out);
208+
209+
unsigned int constexpr segments = 20;
210+
211+
for (auto i = 0ul; i < segments; ++i) {
212+
double ratio = double(i + 1) / segments;
213+
result.lineTo(cubic.pointAtPercent(ratio));
214+
}
215+
216+
QPainterPathStroker stroker;
217+
stroker.setWidth(10.0);
218+
219+
return stroker.createStroke(result);
220+
}
221+
222+
#ifdef NODE_DEBUG_DRAWING
223+
void DefaultConnectionPainter::debugDrawing(QPainter *painter, ConnectionGraphicsObject const &cgo)
224+
{
225+
Q_UNUSED(painter);
226+
227+
{
228+
QPointF const &in = cgo.endPoint(PortType::In);
229+
QPointF const &out = cgo.endPoint(PortType::Out);
230+
231+
auto const points = cgo.pointsC1C2();
232+
233+
painter->setPen(Qt::red);
234+
painter->setBrush(Qt::red);
235+
236+
painter->drawLine(QLineF(out, points.first));
237+
painter->drawLine(QLineF(points.first, points.second));
238+
painter->drawLine(QLineF(points.second, in));
239+
painter->drawEllipse(points.first, 3, 3);
240+
painter->drawEllipse(points.second, 3, 3);
241+
242+
painter->setBrush(Qt::NoBrush);
243+
painter->drawPath(cubicPath(cgo));
244+
}
245+
246+
{
247+
painter->setPen(Qt::yellow);
248+
painter->drawRect(cgo.boundingRect());
249+
}
250+
}
251+
#endif
252+
254253
} // namespace QtNodes

0 commit comments

Comments
 (0)