diff options
Diffstat (limited to 'src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp')
-rw-r--r-- | src/libs/modelinglib/qmt/stereotype/shapepaintvisitor.cpp | 148 |
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 |