104 QPainter *painter = context.
painter();
112 const double scaledMaxHeight = ( ( settings.
numberOfSubdivisions() > 1 ) && ( scaledSubdivisionsHeight > scaledHeight ) ) ? scaledSubdivisionsHeight : scaledHeight;
113 const double middlePosition = barTopPosition + scaledMaxHeight / 2.0;
114 const double bottomPosition = barTopPosition + scaledMaxHeight;
121 std::unique_ptr< QgsLineSymbol > symbol( settings.
lineSymbol()->
clone() );
122 symbol->startRender( context );
125 divisionSymbol->startRender( context );
128 subdivisionSymbol->startRender( context );
130 const QList<double> positions =
segmentPositions( context, scaleContext, settings );
133 double verticalPos = 0.0;
134 QList<double> subTickPositionsY;
135 QList<double> tickPositionsY;
136 switch ( mTickPosition )
139 verticalPos = barTopPosition;
140 subTickPositionsY << verticalPos;
141 subTickPositionsY << verticalPos + scaledSubdivisionsHeight;
142 tickPositionsY << verticalPos;
143 tickPositionsY << verticalPos + scaledHeight;
146 verticalPos = middlePosition;
147 subTickPositionsY << verticalPos + scaledSubdivisionsHeight / 2.0;
148 subTickPositionsY << verticalPos - scaledSubdivisionsHeight / 2.0;
149 tickPositionsY << verticalPos + scaledHeight / 2.0;
150 tickPositionsY << verticalPos - scaledHeight / 2.0;
153 verticalPos = bottomPosition;
154 subTickPositionsY << verticalPos;
155 subTickPositionsY << verticalPos - scaledSubdivisionsHeight;
156 tickPositionsY << verticalPos;
157 tickPositionsY << verticalPos - scaledHeight;
161 int symbolLayerCount = symbol->symbolLayerCount();
162 symbolLayerCount = std::max( symbolLayerCount, divisionSymbol->symbolLayerCount() );
163 symbolLayerCount = std::max( symbolLayerCount, subdivisionSymbol->symbolLayerCount() );
166 for (
int layer = 0; layer < symbolLayerCount; ++ layer )
168 const bool drawDivisionsForThisSymbolLayer = layer < divisionSymbol->symbolLayerCount();
169 const bool drawSubdivisionsForThisSymbolLayer = layer < subdivisionSymbol->symbolLayerCount();
170 const bool drawLineForThisSymbolLayer = layer < symbol->symbolLayerCount();
172 if ( drawDivisionsForThisSymbolLayer )
175 for (
int i = 0; i < positions.size(); ++i )
178 divisionSymbol->renderPolyline( QPolygonF() << QPointF( thisX, tickPositionsY.at( 0 ) )
179 << QPointF( thisX, tickPositionsY.at( 1 ) ),
nullptr, context, layer );
184 if ( drawSubdivisionsForThisSymbolLayer )
191 subdivisionSymbol->renderPolyline( QPolygonF() << QPointF( thisSubX, subTickPositionsY.at( 0 ) )
192 << QPointF( thisSubX, subTickPositionsY.at( 1 ) ),
nullptr, context, layer );
198 if ( !positions.isEmpty() )
203 if ( drawDivisionsForThisSymbolLayer )
205 divisionSymbol->renderPolyline( QPolygonF() << QPointF( lastTickPositionX, tickPositionsY.at( 0 ) )
206 << QPointF( lastTickPositionX, tickPositionsY.at( 1 ) ),
207 nullptr, context, layer );
211 if ( drawLineForThisSymbolLayer )
214 << QPointF( lastTickPositionX, verticalPos ),
nullptr, context, layer );
219 symbol->stopRender( context );
220 divisionSymbol->stopRender( context );
221 subdivisionSymbol->stopRender( context );
Contains information about the context of a rendering operation.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
static QFontMetricsF fontMetrics(QgsRenderContext &context, const QgsTextFormat &format, double scaleFactor=1.0)
Returns the font metrics for the given text format, when rendered in the specified render context.
Contains parameters regarding scalebar calculations.
double segmentWidth
The width, in millimeters, of each individual segment drawn.