void DrawingPolylineItem::render(QPainter* painter, const DrawingStyleOptions& styleOptions) { DrawingItemPoint* point0 = point(0); DrawingItemPoint* point1 = point(numberOfPoints() - 1); QList<DrawingItemPoint*> lPoints = points(); QPolygonF polygon; DrawingItemPoint* otherPoint; qreal theta; // Polyline for(auto pointIter = lPoints.begin(); pointIter != lPoints.end(); pointIter++) polygon.append((*pointIter)->pos()); setupPainter(painter, styleOptions, pen()); painter->drawPolyline(polygon); // Arrows if (pen().style() != Qt::NoPen) { QPen arrowPen = pen(); arrowPen.setStyle(Qt::SolidLine); setupPainter(painter, styleOptions, arrowPen, styleOptions.outputBrush(DrawingStyleOptions::Background)); otherPoint = point(1); if (otherPoint) { theta = qAtan2(otherPoint->y() - point0->y(), otherPoint->x() - point0->x()) * 180.0 / 3.1414592654; if (Drawing::magnitude(otherPoint->pos() - point0->pos()) > startArrowSize()) startArrow().render(painter, point0->pos(), theta); } otherPoint = point(numberOfPoints() - 2); if (otherPoint) { theta = qAtan2(otherPoint->y() - point1->y(), otherPoint->x() - point1->x()) * 180.0 / 3.1414592654; if (Drawing::magnitude(otherPoint->pos() - point1->pos()) > endArrowSize()) endArrow().render(painter, point1->pos(), theta); } } #ifdef DEBUG_DRAW_ITEM_SHAPE painter->setBrush(Qt::magenta); painter->setPen(QPen(Qt::magenta, 1)); painter->drawPath(shape()); #endif }
void HorizontalDistancesPaintingStrategy::drawDistanceLine(const KoRulerPrivate *d, QPainter &painter, const qreal start, const qreal end) { // Don't draw too short lines if (qMax(start, end) - qMin(start, end) < 1) return; painter.save(); painter.translate(d->offset, d->ruler->height() / 2); painter.setPen(d->ruler->palette().color(QPalette::Text)); painter.setBrush(d->ruler->palette().color(QPalette::Text)); QLineF line(QPointF(d->viewConverter->documentToViewX(start), 0), QPointF(d->viewConverter->documentToViewX(end), 0)); QPointF midPoint = line.pointAt(0.5); // Draw the label text QFont font = KGlobalSettings::smallestReadableFont(); font.setPointSize(6); QFontMetrics fontMetrics(font); QString label = d->unit.toUserStringValue( d->viewConverter->viewToDocumentX(line.length())) + ' ' + KUnit::unitName(d->unit); QPointF labelPosition = QPointF(midPoint.x() - fontMetrics.width(label)/2, midPoint.y() + fontMetrics.ascent()/2); painter.setFont(font); painter.drawText(labelPosition, label); // Draw the arrow lines qreal arrowLength = (line.length() - fontMetrics.width(label)) / 2 - 2; arrowLength = qMax(qreal(0.0), arrowLength); QLineF startArrow(line.p1(), line.pointAt(arrowLength / line.length())); QLineF endArrow(line.p2(), line.pointAt(1.0 - arrowLength / line.length())); painter.drawLine(startArrow); painter.drawLine(endArrow); // Draw the arrow heads QPolygonF arrowHead; arrowHead << line.p1() << QPointF(line.x1()+3, line.y1()-3) << QPointF(line.x1()+3, line.y1()+3); painter.drawPolygon(arrowHead); arrowHead.clear(); arrowHead << line.p2() << QPointF(line.x2()-3, line.y2()-3) << QPointF(line.x2()-3, line.y2()+3); painter.drawPolygon(arrowHead); painter.restore(); }