QSizeF QgsNumericScaleBarRenderer::calculateBoxSize( const QgsScaleBarSettings &settings, const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const { QFont font = settings.textFormat().toQFont(); double textWidth = QgsLayoutUtils::textWidthMM( font, scaleText( scaleContext.scale ) ); double textHeight = QgsLayoutUtils::fontAscentMM( font ); return QSizeF( 2 * settings.boxContentSpace() + 2 * settings.pen().width() + textWidth, textHeight + 2 * settings.boxContentSpace() ); }
void QgsDoubleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBarSettings &settings, const ScaleBarContext &scaleContext ) const { if ( !context.painter() ) { return; } QPainter *painter = context.painter(); double barTopPosition = QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace(); double segmentHeight = settings.height() / 2; painter->save(); if ( context.flags() & QgsRenderContext::Antialiasing ) painter->setRenderHint( QPainter::Antialiasing, true ); painter->setPen( settings.pen() ); bool useColor = true; //alternate brush color/white double xOffset = firstLabelXOffset( settings ); QList<double> positions = segmentPositions( scaleContext, settings ); QList<double> widths = segmentWidths( scaleContext, settings ); for ( int i = 0; i < positions.size(); ++i ) { //draw top half if ( useColor ) { painter->setBrush( settings.brush() ); } else //secondary color { painter->setBrush( settings.brush2() ); } QRectF segmentRectTop( positions.at( i ) + xOffset, barTopPosition, widths.at( i ), segmentHeight ); painter->drawRect( segmentRectTop ); //draw bottom half if ( useColor ) { //secondary color painter->setBrush( settings.brush2() ); } else //primary color { painter->setBrush( settings.brush() ); } QRectF segmentRectBottom( positions.at( i ) + xOffset, barTopPosition + segmentHeight, widths.at( i ), segmentHeight ); painter->drawRect( segmentRectBottom ); useColor = !useColor; } painter->restore(); //draw labels using the default method drawDefaultLabels( context, settings, scaleContext ); }
void QgsNumericScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBarSettings &settings, const ScaleBarContext &scaleContext ) const { if ( !context.painter() ) { return; } QPainter *painter = context.painter(); painter->save(); if ( context.flags() & QgsRenderContext::Antialiasing ) painter->setRenderHint( QPainter::Antialiasing, true ); double margin = context.convertToPainterUnits( settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters ); //map scalebar alignment to Qt::AlignmentFlag type QgsTextRenderer::HAlignment hAlign = QgsTextRenderer::AlignLeft; switch ( settings.alignment() ) { case QgsScaleBarSettings::AlignLeft: hAlign = QgsTextRenderer::AlignLeft; break; case QgsScaleBarSettings::AlignMiddle: hAlign = QgsTextRenderer::AlignCenter; break; case QgsScaleBarSettings::AlignRight: hAlign = QgsTextRenderer::AlignRight; break; } //text destination is item's rect, excluding the margin QRectF painterRect( margin, margin, context.convertToPainterUnits( scaleContext.size.width(), QgsUnitTypes::RenderMillimeters ) - 2 * margin, context.convertToPainterUnits( scaleContext.size.height(), QgsUnitTypes::RenderMillimeters ) - 2 * margin ); QgsTextRenderer::drawText( painterRect, 0, hAlign, QStringList() << scaleText( scaleContext.scale ), context, settings.textFormat() ); painter->restore(); }