QgsLayerTreeModelLegendNode::ItemMetrics QgsDataDefinedSizeLegendNode::draw( const QgsLegendSettings &settings, QgsLayerTreeModelLegendNode::ItemContext *ctx ) { // setup temporary render context QgsRenderContext context; context.setScaleFactor( settings.dpi() / 25.4 ); context.setRendererScale( settings.mapScale() ); context.setMapToPixel( QgsMapToPixel( 1 / ( settings.mmPerMapUnit() * context.scaleFactor() ) ) ); context.setForceVectorOutput( true ); if ( ctx && ctx->painter ) { context.setPainter( ctx->painter ); ctx->painter->save(); ctx->painter->setRenderHint( QPainter::Antialiasing ); ctx->painter->translate( ctx->point ); ctx->painter->scale( 1 / context.scaleFactor(), 1 / context.scaleFactor() ); } QgsDataDefinedSizeLegend ddsLegend( *mSettings ); ddsLegend.setFont( settings.style( QgsLegendStyle::SymbolLabel ).font() ); ddsLegend.setTextColor( settings.fontColor() ); QSize contentSize; int labelXOffset; ddsLegend.drawCollapsedLegend( context, &contentSize, &labelXOffset ); if ( ctx && ctx->painter ) ctx->painter->restore(); ItemMetrics im; im.symbolSize = QSizeF( ( contentSize.width() - labelXOffset ) / context.scaleFactor(), contentSize.height() / context.scaleFactor() ); im.labelSize = QSizeF( labelXOffset / context.scaleFactor(), contentSize.height() / context.scaleFactor() ); return im; }
QSizeF QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize ) const { QSizeF labelSize( 0, 0 ); QFont symbolLabelFont = settings.style( QgsLegendStyle::SymbolLabel ).font(); double textHeight = settings.fontHeightCharacterMM( symbolLabelFont, QChar( '0' ) ); double textDescent = settings.fontDescentMillimeters( symbolLabelFont ); QgsExpressionContext tempContext; const QStringList lines = settings.evaluateItemText( data( Qt::DisplayRole ).toString(), ctx && ctx->context ? ctx->context->expressionContext() : tempContext ); labelSize.rheight() = lines.count() * textHeight + ( lines.count() - 1 ) * ( settings.lineSpacing() + textDescent ); double labelX = 0.0, labelY = 0.0; if ( ctx && ctx->painter ) { ctx->painter->setPen( settings.fontColor() ); labelX = ctx->point.x() + std::max( static_cast< double >( symbolSize.width() ), ctx->labelXOffset ); labelY = ctx->point.y(); // Vertical alignment of label with symbol if ( labelSize.height() < symbolSize.height() ) labelY += symbolSize.height() / 2 - labelSize.height() / 2; // label centered with symbol labelY += textHeight; } for ( QStringList::ConstIterator itemPart = lines.constBegin(); itemPart != lines.constEnd(); ++itemPart ) { labelSize.rwidth() = std::max( settings.textWidthMillimeters( symbolLabelFont, *itemPart ), double( labelSize.width() ) ); if ( ctx && ctx->painter ) { settings.drawText( ctx->painter, labelX, labelY, *itemPart, symbolLabelFont ); if ( itemPart != ( lines.end() - 1 ) ) labelY += textDescent + settings.lineSpacing() + textHeight; } } return labelSize; }
QSizeF QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings& settings, ItemContext* ctx, const QSizeF& symbolSize ) const { QSizeF labelSize( 0, 0 ); QFont symbolLabelFont = settings.style( QgsComposerLegendStyle::SymbolLabel ).font(); double textHeight = settings.fontHeightCharacterMM( symbolLabelFont, QChar( '0' ) ); QStringList lines = settings.splitStringForWrapping( data( Qt::DisplayRole ).toString() ); labelSize.rheight() = lines.count() * textHeight + ( lines.count() - 1 ) * settings.lineSpacing(); double labelX = 0.0, labelY = 0.0; if ( ctx ) { ctx->painter->setPen( settings.fontColor() ); labelX = ctx->point.x() + qMax(( double ) symbolSize.width(), ctx->labelXOffset ); labelY = ctx->point.y(); // Vertical alignment of label with symbol if ( labelSize.height() < symbolSize.height() ) labelY += symbolSize.height() / 2 + textHeight / 2; // label centered with symbol else labelY += textHeight; // label starts at top and runs under symbol } for ( QStringList::Iterator itemPart = lines.begin(); itemPart != lines.end(); ++itemPart ) { labelSize.rwidth() = qMax( settings.textWidthMillimeters( symbolLabelFont, *itemPart ), double( labelSize.width() ) ); if ( ctx ) { settings.drawText( ctx->painter, labelX, labelY, *itemPart, symbolLabelFont ); if ( itemPart != lines.end() ) labelY += settings.lineSpacing() + textHeight; } } return labelSize; }