33 Wt::WPainter* painter,
64 double const radius = 6.0;
66 Wt::WRectF boundary = model->
captionVisible() ? Wt::WRectF(-diam, -diam, 2.0 * diam + geom.
width(), 2.0 * diam + geom.
height())
67 : Wt::WRectF(-diam, 0.0f, 2.0 * diam + geom.
width(), diam + geom.
height());
75 double captionRatio = (double)captionHeight / geom.
height();
77 painter->setBrush(Wt::WColor(Wt::StandardColor::White));
79 painter->drawRect(boundary);
90 painter->drawRect(boundary);
95 Wt::WPainter* painter,
109 auto reducedDiameter = diameter * 0.6;
111 std::vector<connectionPointData> pointsData;
117 for (
unsigned int i = 0; i < n; i++)
125 auto const& dataType = model->
dataType(portType, i);
127 bool canConnect = (state.
getEntries(portType)[i].empty() ||
137 double dist = std::sqrt(diff.x() * diff.x() + diff.y() * diff.y());
139 bool typeConvertable =
false;
144 typeConvertable = scene.registry().getTypeConverter(state.
reactingDataType(), dataType) !=
nullptr;
148 typeConvertable = scene.registry().getTypeConverter(dataType, state.
reactingDataType()) !=
nullptr;
154 double const thres = 40.0;
156 (2.0 - dist / thres) :
161 double const thres = 80.0;
169 if (connectionStyle.useDataDefinedColors())
171 painter->setBrush(connectionStyle.normalColor(dataType.id));
178 double w = diameter * 0.4 * r;
179 double h = diameter * 0.8 * r;
181 vert[0] = Wt::WPointF(p.x() - w, p.y() - h);
182 vert[1] = Wt::WPointF(p.x() - w, p.y() + h);
183 vert[2] = Wt::WPointF(p.x() + w, p.y() + h);
184 vert[3] = Wt::WPointF(p.x() + (2.5 * w), p.y());
185 vert[4] = Wt::WPointF(p.x() + w, p.y() - h);
187 double dr = diameter * 1 * r;
188 Wt::WPointF diamond[4];
189 diamond[0] = Wt::WPointF(p.x(), p.y() + dr);
190 diamond[1] = Wt::WPointF(p.x() + dr, p.y());
191 diamond[2] = Wt::WPointF(p.x(), p.y() - dr);
192 diamond[3] = Wt::WPointF(p.x() - dr, p.y());
194 double odr = diameter * 1.1 * r;
195 double idr = diameter * 0.3 * r;
196 Wt::WPointF diamond_out[4];
197 diamond_out[0] = Wt::WPointF(p.x(), p.y() + odr);
198 diamond_out[1] = Wt::WPointF(p.x() + odr, p.y());
199 diamond_out[2] = Wt::WPointF(p.x(), p.y() - odr);
200 diamond_out[3] = Wt::WPointF(p.x() - odr, p.y());
202 Wt::WPointF diamond_inner[4];
203 diamond_inner[0] = Wt::WPointF(p.x(), p.y() + idr);
204 diamond_inner[1] = Wt::WPointF(p.x() + idr, p.y());
205 diamond_inner[2] = Wt::WPointF(p.x(), p.y() - idr);
206 diamond_inner[3] = Wt::WPointF(p.x() - idr, p.y());
208 double rx = reducedDiameter * r;
209 double ry = reducedDiameter * r;
210 Wt::WRectF drawRect = Wt::WRectF(p.x() - rx, p.y() - ry, 2 * rx, 2 * ry);
212 switch (dataType.shape)
215 painter->drawEllipse(drawRect);
221 painter->drawPolygon(diamond_out, 4);
222 painter->setBrush(Wt::StandardColor::White);
223 painter->drawPolygon(diamond_inner, 4);
232 painter->drawPolygon(diamond, 4);
235 pointData.
diamond[0] = diamond[0];
236 pointData.
diamond[1] = diamond[1];
237 pointData.
diamond[2] = diamond[2];
238 pointData.
diamond[3] = diamond[3];
244 pointsData.push_back(pointData);
251 Wt::WPainter* painter,
264 Wt::WFontMetrics metrics = painter->device()->fontMetrics();
266 Wt::WPointF position(0, 0);
268 Wt::WFont f = painter->font();
270 f.setWeight(Wt::FontWeight::Bold);
274 Wt::WRectF boundary(position, position);
277 painter->setPen(Wt::WPen(nodeStyle.
FontColor));
278 painter->drawRect(boundary);
279 painter->drawText(boundary, Wt::AlignmentFlag::Left, Wt::WString(name));
281 f.setWeight(Wt::FontWeight::Normal);
286 Wt::WPainter* painter,
304 const Wt::WPen& pen = painter->pen();
341 Wt::WPointF points[4];
342 points[0] = Wt::WPointF(geom.
width() + diam - keyWidth - keyOffset, -diam);
343 points[1] = Wt::WPointF(geom.
width() + diam - keyOffset, -diam);
346 points[2] = Wt::WPointF(geom.
width() + diam - keyOffset, captionHeight);
347 points[3] = Wt::WPointF(geom.
width() + diam - keyWidth - keyOffset, captionHeight);
351 Wt::WRectF hotKey0Rect = Wt::WRectF(points[0], points[2]);
353 painter->drawRect(hotKey0Rect);
379 points[0] = Wt::WPointF(geom.
width() + diam - keyWidth - keyOffset, -diam);
382 points[3] = Wt::WPointF(geom.
width() + diam - keyWidth - keyWidth - keyOffset, -diam);
384 points[1] = Wt::WPointF(geom.
width() + diam - keyWidth - keyOffset, captionHeight);
385 points[2] = Wt::WPointF(geom.
width() + diam - keyWidth - keyWidth - keyOffset, captionHeight);
387 Wt::WRectF hotKey1Rect = Wt::WRectF(points[3], points[1]);
389 painter->drawRect(hotKey1Rect);
398 Wt::WPainter* painter,
405 auto const& nodeStyle = model->
nodeStyle();
409 size_t n = entries.size();
411 for (
size_t i = 0; i < n; ++i)
415 if (entries[i].empty())
416 painter->setPen(nodeStyle.FontColorFaded);
418 painter->setPen(nodeStyle.FontColor);
427 Wt::WFontMetrics metrics = painter->device()->fontMetrics();
429 Wt::WPointF topLeft, bottomRight;
434 topLeft = Wt::WPointF(p.x() + 10, p.y() - metrics.height() / 3);
435 bottomRight = Wt::WPointF(p.x() + 50, p.y() + 6);
436 painter->drawText(Wt::WRectF(topLeft, bottomRight), Wt::AlignmentFlag::Left, Wt::WString(s));
440 topLeft = Wt::WPointF(p.x() - 50, p.y() - 6);
441 bottomRight = Wt::WPointF(p.x() - 10, p.y() + metrics.height() / 3);
442 painter->drawText(Wt::WRectF(topLeft, bottomRight), Wt::AlignmentFlag::Right, Wt::WString(s));
453 Wt::WPainter* painter,
460 painter->setBrush(Wt::StandardColor::Gray);
466 Wt::WPainter* painter,
492 p.setWidth(Wt::WLength(nodeStyle.
HoveredPenWidth, Wt::LengthUnit::Pixel));
498 p.setWidth(Wt::WLength(nodeStyle.
PenWidth, Wt::LengthUnit::Pixel));
511 double const radius = 3.0;
515 Wt::WRectF boundary(-diam,
517 2.0 * diam + geom.
width(),
520 painter->drawRect(boundary);
522 painter->setBrush(Wt::StandardColor::Gray);
558 return _node.nodeGeometry().boundingRect();
virtual ConnectionPolicy portOutConnectionPolicy(PortIndex) const
virtual std::string caption() const =0
virtual bool captionVisible() const
It is possible to hide caption in GUI.
virtual NodeDataType dataType(PortType portType, PortIndex portIndex) const =0
virtual bool hotkeyEnabled() const
WtNodeStyle const & nodeStyle() const
virtual bool portCaptionVisible(PortType, PortIndex) const
It is possible to hide port caption in GUI.
virtual std::string portCaption(PortType, PortIndex) const
Port caption is used in GUI to label individual ports.
virtual bool resizable() const
virtual NodeValidationState validationState() const
unsigned int captionHeight() const
Wt::WPointF portScenePosition(PortIndex index, PortType portType, Wt::WTransform const &t=Wt::WTransform()) const
unsigned int hotkeyIncline() const
Wt::WRectF resizeRect() const
unsigned int width() const
unsigned int hotkeyWidth() const
unsigned int height() const
unsigned int validationHeight() const
unsigned int hotkeyOffset() const
Wt::WPointF const & draggingPos() const
std::string strFormat(std::string str) const
void setPos(Wt::WPointF pos)
bool hotKey1Hovered() const
void setGeometryChanged()
Wt::WPointF getPos() const
bool hotKey0Hovered() const
Wt::WRectF boundingRect() const
WtFlowNodeData & _flowNodeData
void setPointsData(std::vector< connectionPointData > p) const
virtual ~WtNodeGraphicsObject()
void setBoundingRect(Wt::WRectF r) const
bool isHotKey1Checked() const
bool isHotKey0Checked() const
WtNodeGraphicsObject()=default
void moveConnections() const
void setHotKey0BoundingRect(Wt::WRectF r) const
void paint(Wt::WPainter *painter)
void setHotKey1BoundingRect(Wt::WRectF r) const
WtNodeDataModel * nodeDataModel() const
WtNodeGraphicsObject const & nodeGraphicsObject() const
WtNodeState const & nodeState() const
WtNodeGeometry & nodeGeometry()
static void paint(Wt::WPainter *painter, WtNode &node, WtFlowScene const &scene)
static void drawResizeRect(Wt::WPainter *painter, WtNodeGeometry const &geom, WtNodeDataModel const *model)
static void drawEntryLabels(Wt::WPainter *painter, WtNodeGeometry const &geom, WtNodeState const &state, WtNodeDataModel const *model)
static void drawValidationRect(Wt::WPainter *painter, WtNodeGeometry const &geom, WtNodeDataModel const *model, WtNodeGraphicsObject const &graphicsObject)
static void drawConnectionPoints(Wt::WPainter *painter, WtNodeGeometry const &geom, WtNodeState const &state, WtNodeDataModel const *model, WtFlowScene const &scene, WtNodeGraphicsObject const &graphicsObject)
static void drawNodeRect(Wt::WPainter *painter, WtNodeGeometry const &geom, WtNodeDataModel const *model, WtNodeGraphicsObject const &graphicsObject)
static void drawModelName(Wt::WPainter *painter, WtNodeGeometry const &geom, WtNodeState const &state, WtNodeDataModel const *model)
static void drawHotKeys(Wt::WPainter *painter, WtNodeGeometry const &geom, WtNodeDataModel const *model, WtNodeGraphicsObject const &graphicsObject)
std::vector< ConnectionPtrSet > const & getEntries(PortType) const
PortType reactingPortType() const
NodeDataType reactingDataType() const
Wt::WColor GradientColor0
Wt::WColor SelectedBoundaryColor
float ConnectionPointDiameter
Wt::WColor ConnectionPointColor
Wt::WColor NormalBoundaryColor
Wt::WColor SelectedDragColor
static WtConnectionStyle const & connectionStyle()
Wt::WPointF diamond_out[4]