QGIS API Documentation  3.14.0-Pi (9f7028fd23)
qgsnumericscalebarrenderer.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsnumericscalebarrenderer.cpp
3  ------------------------------
4  begin : June 2008
5  copyright : (C) 2008 by Marco Hugentobler
6  email : [email protected]
7  ***************************************************************************/
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
18 #include "qgsscalebarsettings.h"
19 #include "qgslayoututils.h"
20 #include "qgsnumericformat.h"
21 #include "qgstextrenderer.h"
22 #include <QList>
23 #include <QPainter>
24 
26 {
27  return QStringLiteral( "Numeric" );
28 }
29 
31 {
32  return QObject::tr( "Numeric" );
33 }
34 
36 {
37  return 100;
38 }
39 
40 QgsScaleBarRenderer::Flags QgsNumericScaleBarRenderer::flags() const
41 {
43 }
44 
46 {
47  return new QgsNumericScaleBarRenderer( *this );
48 }
49 
50 void QgsNumericScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBarSettings &settings, const ScaleBarContext &scaleContext ) const
51 {
52  if ( !context.painter() )
53  {
54  return;
55  }
56 
57  QPainter *painter = context.painter();
58 
59  painter->save();
60  if ( context.flags() & QgsRenderContext::Antialiasing )
61  painter->setRenderHint( QPainter::Antialiasing, true );
62 
63  double margin = context.convertToPainterUnits( settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
64  //map scalebar alignment to Qt::AlignmentFlag type
66  switch ( settings.alignment() )
67  {
70  break;
73  break;
76  break;
77  }
78 
79  //text destination is item's rect, excluding the margin
80  QRectF painterRect( margin, margin, context.convertToPainterUnits( scaleContext.size.width(), QgsUnitTypes::RenderMillimeters ) - 2 * margin,
81  context.convertToPainterUnits( scaleContext.size.height(), QgsUnitTypes::RenderMillimeters ) - 2 * margin );
82  QgsTextRenderer::drawText( painterRect, 0, hAlign, QStringList() << scaleText( scaleContext.scale, settings ), context, settings.textFormat() );
83 
84  painter->restore();
85 }
86 
88  const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const
89 {
90  const double painterToMm = 1.0 / context.convertToPainterUnits( 1, QgsUnitTypes::RenderMillimeters );
91 
92  double textWidth = QgsTextRenderer::textWidth( context, settings.textFormat(), QStringList() << scaleText( scaleContext.scale, settings ) ) * painterToMm;
93  double textHeight = QgsTextRenderer::textHeight( context, settings.textFormat(), QStringList() << scaleText( scaleContext.scale, settings ) ) * painterToMm;
94 
95  return QSizeF( 2 * settings.boxContentSpace() + textWidth,
96  textHeight + 2 * settings.boxContentSpace() );
97 }
98 
100 {
101  QFont font = settings.textFormat().toQFont();
102 
103  double textWidth = QgsLayoutUtils::textWidthMM( font, scaleText( scaleContext.scale, settings ) );
104  double textHeight = QgsLayoutUtils::fontAscentMM( font );
105 
106  return QSizeF( 2 * settings.boxContentSpace() + textWidth,
107  textHeight + 2 * settings.boxContentSpace() );
108 }
109 
110 QString QgsNumericScaleBarRenderer::scaleText( double scale, const QgsScaleBarSettings &settings ) const
111 {
112  return "1:" + settings.numericFormat()->formatDouble( scale, QgsNumericFormatContext() );
113 }
QgsNumericScaleBarRenderer::draw
void draw(QgsRenderContext &context, const QgsScaleBarSettings &settings, const QgsScaleBarRenderer::ScaleBarContext &scaleContext) const override
Draws the scalebar using the specified settings and scaleContext to a destination render context.
Definition: qgsnumericscalebarrenderer.cpp:50
QgsNumericScaleBarRenderer::clone
QgsNumericScaleBarRenderer * clone() const override
Returns a clone of the renderer.
Definition: qgsnumericscalebarrenderer.cpp:45
QgsRenderContext::convertToPainterUnits
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
Definition: qgsrendercontext.cpp:287
QgsScaleBarRenderer::ScaleBarContext
Contains parameters regarding scalebar calculations.
Definition: qgsscalebarrenderer.h:70
qgstextrenderer.h
QgsTextRenderer::AlignCenter
@ AlignCenter
Center align.
Definition: qgstextrenderer.h:61
QgsScaleBarSettings::AlignLeft
@ AlignLeft
Left aligned.
Definition: qgsscalebarsettings.h:49
QgsTextRenderer::AlignRight
@ AlignRight
Right align.
Definition: qgstextrenderer.h:62
QgsRenderContext
Definition: qgsrendercontext.h:57
QgsNumericScaleBarRenderer::id
QString id() const override
Returns the unique ID for this renderer.
Definition: qgsnumericscalebarrenderer.cpp:25
QgsUnitTypes::RenderMillimeters
@ RenderMillimeters
Millimeters.
Definition: qgsunittypes.h:168
QgsNumericScaleBarRenderer::calculateBoxSize
QSizeF calculateBoxSize(QgsRenderContext &context, const QgsScaleBarSettings &settings, const QgsScaleBarRenderer::ScaleBarContext &scaleContext) const override
Calculates the required box size (in millimeters) for a scalebar using the specified settings and sca...
Definition: qgsnumericscalebarrenderer.cpp:87
QgsNumericScaleBarRenderer::sortKey
int sortKey() const override
Returns a sorting key value, where renderers with a lower sort key will be shown earlier in lists.
Definition: qgsnumericscalebarrenderer.cpp:35
QgsScaleBarSettings::AlignMiddle
@ AlignMiddle
Center aligned.
Definition: qgsscalebarsettings.h:50
QgsTextRenderer::textWidth
static double textWidth(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, QFontMetricsF *fontMetrics=nullptr)
Returns the width of a text based on a given format.
Definition: qgstextrenderer.cpp:448
qgsscalebarsettings.h
qgslayoututils.h
QgsScaleBarRenderer::ScaleBarContext::size
QSizeF size
Destination size for scalebar.
Definition: qgsscalebarrenderer.h:84
QgsTextRenderer::drawText
static void drawText(const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true)
Draws text within a rectangle using the specified settings.
Definition: qgstextrenderer.cpp:45
QgsScaleBarSettings::alignment
Alignment alignment() const
Returns the scalebar alignment.
Definition: qgsscalebarsettings.h:614
QgsScaleBarSettings::boxContentSpace
double boxContentSpace() const
Returns the spacing (margin) between the scalebar box and content in millimeters.
Definition: qgsscalebarsettings.h:602
QgsScaleBarSettings::textFormat
QgsTextFormat & textFormat()
Returns the text format used for drawing text in the scalebar.
Definition: qgsscalebarsettings.h:268
QgsNumericScaleBarRenderer::visibleName
QString visibleName() const override
Returns the user friendly, translated name for the renderer.
Definition: qgsnumericscalebarrenderer.cpp:30
QgsScaleBarSettings
Definition: qgsscalebarsettings.h:40
QgsNumericScaleBarRenderer::QgsNumericScaleBarRenderer
QgsNumericScaleBarRenderer()=default
Constructor for QgsNumericScaleBarRenderer.
QgsScaleBarRenderer::Flag::FlagUsesAlignment
@ FlagUsesAlignment
Renderer uses the QgsScaleBarSettings::alignment() setting.
QgsScaleBarRenderer::ScaleBarContext::scale
double scale
Scale denominator.
Definition: qgsscalebarrenderer.h:87
QgsTextRenderer::AlignLeft
@ AlignLeft
Left align.
Definition: qgstextrenderer.h:60
QgsNumericScaleBarRenderer::flags
Flags flags() const override
Returns the scalebar rendering flags, which dictates the renderer's behavior.
Definition: qgsnumericscalebarrenderer.cpp:40
QgsScaleBarSettings::AlignRight
@ AlignRight
Right aligned.
Definition: qgsscalebarsettings.h:51
QgsTextRenderer::textHeight
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, DrawMode mode=Point, QFontMetricsF *fontMetrics=nullptr)
Returns the height of a text based on a given format.
Definition: qgstextrenderer.cpp:515
QgsNumericFormat::formatDouble
virtual QString formatDouble(double value, const QgsNumericFormatContext &context) const =0
Returns a formatted string representation of a numeric double value.
QgsTextFormat::toQFont
QFont toQFont() const
Returns a QFont matching the relevant settings from this text format.
Definition: qgstextformat.cpp:493
qgsnumericformat.h
QgsLayoutUtils::fontAscentMM
static double fontAscentMM(const QFont &font)
Calculates a font ascent in millimeters, including workarounds for QT font rendering issues.
Definition: qgslayoututils.cpp:181
QgsRenderContext::Antialiasing
@ Antialiasing
Use antialiasing while drawing.
Definition: qgsrendercontext.h:78
qgsnumericscalebarrenderer.h
QgsRenderContext::painter
QPainter * painter()
Returns the destination QPainter for the render operation.
Definition: qgsrendercontext.h:174
QgsScaleBarSettings::numericFormat
const QgsNumericFormat * numericFormat() const
Returns the numeric format used for numbers in the scalebar.
Definition: qgsscalebarsettings.cpp:323
QgsNumericScaleBarRenderer
Definition: qgsnumericscalebarrenderer.h:30
QgsNumericFormatContext
Definition: qgsnumericformat.h:34
QgsTextRenderer::HAlignment
HAlignment
Horizontal alignment.
Definition: qgstextrenderer.h:58
QgsRenderContext::flags
Flags flags() const
Returns combination of flags used for rendering.
Definition: qgsrendercontext.cpp:160
QgsLayoutUtils::textWidthMM
static double textWidthMM(const QFont &font, const QString &text)
Calculate a font width in millimeters for a text string, including workarounds for QT font rendering ...
Definition: qgslayoututils.cpp:219