101 QPainter *painter = context.
painter();
109 const double scaledMaxHeight = ( ( settings.
numberOfSubdivisions() > 1 ) && ( scaledSubdivisionsHeight > scaledHeight ) ) ? scaledSubdivisionsHeight : scaledHeight;
110 const double middlePosition = barTopPosition + scaledMaxHeight / 2.0;
111 const double bottomPosition = barTopPosition + scaledMaxHeight;
118 std::unique_ptr< QgsLineSymbol > symbol( settings.
lineSymbol()->
clone() );
119 symbol->startRender( context );
122 divisionSymbol->startRender( context );
125 subdivisionSymbol->startRender( context );
127 const QList<double> positions =
segmentPositions( context, scaleContext, settings );
130 double verticalPos = 0.0;
131 QList<double> subTickPositionsY;
132 QList<double> tickPositionsY;
133 switch ( mTickPosition )
136 verticalPos = barTopPosition;
137 subTickPositionsY << verticalPos;
138 subTickPositionsY << verticalPos + scaledSubdivisionsHeight;
139 tickPositionsY << verticalPos;
140 tickPositionsY << verticalPos + scaledHeight;
143 verticalPos = middlePosition;
144 subTickPositionsY << verticalPos + scaledSubdivisionsHeight / 2.0;
145 subTickPositionsY << verticalPos - scaledSubdivisionsHeight / 2.0;
146 tickPositionsY << verticalPos + scaledHeight / 2.0;
147 tickPositionsY << verticalPos - scaledHeight / 2.0;
150 verticalPos = bottomPosition;
151 subTickPositionsY << verticalPos;
152 subTickPositionsY << verticalPos - scaledSubdivisionsHeight;
153 tickPositionsY << verticalPos;
154 tickPositionsY << verticalPos - scaledHeight;
158 int symbolLayerCount = symbol->symbolLayerCount();
159 symbolLayerCount = std::max( symbolLayerCount, divisionSymbol->symbolLayerCount() );
160 symbolLayerCount = std::max( symbolLayerCount, subdivisionSymbol->symbolLayerCount() );
163 for (
int layer = 0; layer < symbolLayerCount; ++ layer )
165 const bool drawDivisionsForThisSymbolLayer = layer < divisionSymbol->symbolLayerCount();
166 const bool drawSubdivisionsForThisSymbolLayer = layer < subdivisionSymbol->symbolLayerCount();
167 const bool drawLineForThisSymbolLayer = layer < symbol->symbolLayerCount();
169 if ( drawDivisionsForThisSymbolLayer )
172 for (
int i = 0; i < positions.size(); ++i )
175 divisionSymbol->renderPolyline( QPolygonF() << QPointF( thisX, tickPositionsY.at( 0 ) )
176 << QPointF( thisX, tickPositionsY.at( 1 ) ),
nullptr, context, layer );
181 if ( drawSubdivisionsForThisSymbolLayer )
188 subdivisionSymbol->renderPolyline( QPolygonF() << QPointF( thisSubX, subTickPositionsY.at( 0 ) )
189 << QPointF( thisSubX, subTickPositionsY.at( 1 ) ),
nullptr, context, layer );
195 if ( !positions.isEmpty() )
200 if ( drawDivisionsForThisSymbolLayer )
202 divisionSymbol->renderPolyline( QPolygonF() << QPointF( lastTickPositionX, tickPositionsY.at( 0 ) )
203 << QPointF( lastTickPositionX, tickPositionsY.at( 1 ) ),
204 nullptr, context, layer );
208 if ( drawLineForThisSymbolLayer )
211 << QPointF( lastTickPositionX, verticalPos ),
nullptr, context, layer );
216 symbol->stopRender( context );
217 divisionSymbol->stopRender( context );
218 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.