aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp')
-rw-r--r--src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp b/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp
index 930f8450ad..13ce2b1317 100644
--- a/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp
+++ b/src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp
@@ -263,4 +263,152 @@ void ShapeSizeVisitor::visitPath(const PathShape *shapePath)
m_boundingRect |= path.boundingRect();
}
+ShapePolygonVisitor::ShapePolygonVisitor(const QPointF &scaledOrigin, const QSizeF &originalSize,
+ const QSizeF &baseSize, const QSizeF &size)
+ : m_scaledOrigin(scaledOrigin),
+ m_originalSize(originalSize),
+ m_baseSize(baseSize),
+ m_size(size)
+{
+ m_path.setFillRule(Qt::WindingFill);
+}
+
+QList<QPolygonF> ShapePolygonVisitor::toPolygons() const
+{
+ return m_path.toSubpathPolygons();
+}
+
+void ShapePolygonVisitor::visitLine(const LineShape *shapeLine)
+{
+ QPointF p1 = shapeLine->pos1().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size);
+ QPointF p2 = shapeLine->pos2().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size);
+ m_path.moveTo(p1);
+ m_path.lineTo(p2);
+}
+
+void ShapePolygonVisitor::visitRect(const RectShape *shapeRect)
+{
+ m_path.addRect(QRectF(shapeRect->pos().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size),
+ shapeRect->size().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size)));
+}
+
+void ShapePolygonVisitor::visitRoundedRect(const RoundedRectShape *shapeRoundedRect)
+{
+ qreal radiusX = shapeRoundedRect->radius().mapScaledTo(0, m_originalSize.width(),
+ m_baseSize.width(), m_size.width());
+ qreal radiusY = shapeRoundedRect->radius().mapScaledTo(0, m_originalSize.height(),
+ m_baseSize.height(), m_size.height());
+ m_path.addRoundedRect(QRectF(shapeRoundedRect->pos().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size),
+ shapeRoundedRect->size().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size)),
+ radiusX, radiusY);
+}
+
+void ShapePolygonVisitor::visitCircle(const CircleShape *shapeCircle)
+{
+ m_path.addEllipse(shapeCircle->center().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size),
+ shapeCircle->radius().mapScaledTo(m_scaledOrigin.x(), m_originalSize.width(),
+ m_baseSize.width(), m_size.width()),
+ shapeCircle->radius().mapScaledTo(m_scaledOrigin.y(), m_originalSize.height(),
+ m_baseSize.height(), m_size.height()));
+}
+
+void ShapePolygonVisitor::visitEllipse(const EllipseShape *shapeEllipse)
+{
+ QSizeF radius = shapeEllipse->radius().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size);
+ m_path.addEllipse(shapeEllipse->center().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size),
+ radius.width(), radius.height());
+}
+
+void ShapePolygonVisitor::visitDiamond(const DiamondShape *shapeDiamond)
+{
+ QPainterPath path;
+ QPointF center = shapeDiamond->center().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size);
+ QSizeF size = shapeDiamond->size().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size);
+ path.moveTo(center + QPointF(0.0, size.height() / 2.0));
+ path.lineTo(center + QPointF(-size.width() / 2.0, 0.0));
+ path.lineTo(center + QPointF(0.0, -size.height() / 2.0));
+ path.lineTo(center + QPointF(size.width() / 2.0, 0.0));
+ path.closeSubpath();
+ m_path.addPath(path);
+}
+
+void ShapePolygonVisitor::visitTriangle(const TriangleShape *shapeTriangle)
+{
+ QPainterPath path;
+ QPointF center = shapeTriangle->center().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size);
+ QSizeF size = shapeTriangle->size().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size);
+ path.moveTo(center + QPointF(size.width() / 2.0, size.height() / 2.0));
+ path.lineTo(center + QPointF(-size.width() / 2.0, size.height() / 2.0));
+ path.lineTo(center + QPointF(0.0, -size.height() / 2.0));
+ path.closeSubpath();
+ m_path.addPath(path);
+}
+
+void ShapePolygonVisitor::visitArc(const ArcShape *shapeArc)
+{
+ QSizeF radius = shapeArc->radius().mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size);
+ QRectF rect(shapeArc->center().mapScaledTo(m_scaledOrigin, m_originalSize, m_baseSize, m_size)
+ - QPointF(radius.width(), radius.height()), radius * 2.0);
+ m_path.arcMoveTo(rect, shapeArc->startAngle());
+ m_path.arcTo(rect, shapeArc->startAngle(), shapeArc->spanAngle());
+}
+
+void ShapePolygonVisitor::visitPath(const PathShape *shapePath)
+{
+ QPainterPath path;
+ for (const PathShape::Element &element: shapePath->elements()) {
+ switch (element.m_elementType) {
+ case PathShape::TypeNone:
+ // nothing to do
+ break;
+ case PathShape::TypeMoveto:
+ path.moveTo(element.m_position.mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size));
+ break;
+ case PathShape::TypeLineto:
+ path.lineTo(element.m_position.mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size));
+ break;
+ case PathShape::TypeArcmoveto:
+ {
+ QSizeF radius = element.m_size.mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size);
+ path.arcMoveTo(QRectF(element.m_position.mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size)
+ - QPointF(radius.width(), radius.height()),
+ radius * 2.0),
+ element.m_angle1);
+ break;
+ }
+ case PathShape::TypeArcto:
+ {
+ QSizeF radius = element.m_size.mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size);
+ path.arcTo(QRectF(element.m_position.mapScaledTo(m_scaledOrigin, m_originalSize,
+ m_baseSize, m_size)
+ - QPointF(radius.width(), radius.height()),
+ radius * 2.0),
+ element.m_angle1, element.m_angle2);
+ break;
+ }
+ case PathShape::TypeClose:
+ path.closeSubpath();
+ break;
+ }
+ }
+ m_path.addPath(path);
+}
+
} // namespace qmt