101 QPainter *painter = context.
painter();
103 const double barTopPosition =
verticalOffset( context, settings );
106 const double scaledMaxHeight = ( ( settings.
numberOfSubdivisions() > 1 ) && ( scaledSubdivisionsHeight > scaledHeight ) ) ? scaledSubdivisionsHeight : scaledHeight;
107 const double middlePosition = barTopPosition + scaledMaxHeight / 2.0;
108 const double bottomPosition = barTopPosition + scaledMaxHeight;
115 std::unique_ptr< QgsLineSymbol > symbol( settings.
lineSymbol()->
clone() );
116 symbol->startRender( context );
119 divisionSymbol->startRender( context );
122 subdivisionSymbol->startRender( context );
124 const QList<double> positions =
segmentPositions( context, scaleContext, settings );
127 double verticalPos = 0.0;
128 QList<double> subTickPositionsY;
129 QList<double> tickPositionsY;
130 switch ( mTickPosition )
133 verticalPos = barTopPosition;
134 subTickPositionsY << verticalPos;
135 subTickPositionsY << verticalPos + scaledSubdivisionsHeight;
136 tickPositionsY << verticalPos;
137 tickPositionsY << verticalPos + scaledHeight;
140 verticalPos = middlePosition;
141 subTickPositionsY << verticalPos + scaledSubdivisionsHeight / 2.0;
142 subTickPositionsY << verticalPos - scaledSubdivisionsHeight / 2.0;
143 tickPositionsY << verticalPos + scaledHeight / 2.0;
144 tickPositionsY << verticalPos - scaledHeight / 2.0;
147 verticalPos = bottomPosition;
148 subTickPositionsY << verticalPos;
149 subTickPositionsY << verticalPos - scaledSubdivisionsHeight;
150 tickPositionsY << verticalPos;
151 tickPositionsY << verticalPos - scaledHeight;
155 int symbolLayerCount = symbol->symbolLayerCount();
156 symbolLayerCount = std::max( symbolLayerCount, divisionSymbol->symbolLayerCount() );
157 symbolLayerCount = std::max( symbolLayerCount, subdivisionSymbol->symbolLayerCount() );
160 for (
int layer = 0; layer < symbolLayerCount; ++layer )
162 const bool drawDivisionsForThisSymbolLayer = layer < divisionSymbol->symbolLayerCount();
163 const bool drawSubdivisionsForThisSymbolLayer = layer < subdivisionSymbol->symbolLayerCount();
164 const bool drawLineForThisSymbolLayer = layer < symbol->symbolLayerCount();
166 if ( drawDivisionsForThisSymbolLayer )
169 for (
int i = 0; i < positions.size(); ++i )
172 divisionSymbol->renderPolyline( QPolygonF() << QPointF( thisX, tickPositionsY.at( 0 ) ) << QPointF( thisX, tickPositionsY.at( 1 ) ),
nullptr, context, layer );
177 if ( drawSubdivisionsForThisSymbolLayer )
184 subdivisionSymbol->renderPolyline( QPolygonF() << QPointF( thisSubX, subTickPositionsY.at( 0 ) ) << QPointF( thisSubX, subTickPositionsY.at( 1 ) ),
nullptr, context, layer );
190 if ( !positions.isEmpty() )
195 if ( drawDivisionsForThisSymbolLayer )
197 divisionSymbol->renderPolyline( QPolygonF() << QPointF( lastTickPositionX, tickPositionsY.at( 0 ) ) << QPointF( lastTickPositionX, tickPositionsY.at( 1 ) ),
nullptr, context, layer );
201 if ( drawLineForThisSymbolLayer )
208 symbol->stopRender( context );
209 divisionSymbol->stopRender( context );
210 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 ...
Contains parameters regarding scalebar calculations.
double segmentWidth
The width, in millimeters, of each individual segment drawn.