30   std::unique_ptr< QgsSimpleLineSymbolLayer > lineSymbolLayer = std::make_unique< QgsSimpleLineSymbolLayer >( QColor( 0, 0, 0 ), 0.2 );
 
   31   mLineSymbol = std::make_unique< QgsLineSymbol >( 
QgsSymbolLayerList() << lineSymbolLayer.release() );
 
   37   : mType( other.mType )
 
   38   , mTitleLabel( other.mTitleLabel )
 
   39   , mSizeClasses( other.mSizeClasses )
 
   40   , mSymbol( other.mSymbol.get() ? other.mSymbol->clone() : nullptr )
 
   41   , mLineSymbol( other.mLineSymbol.get() ? other.mLineSymbol->clone() : nullptr )
 
   42   , mSizeScaleTransformer( other.mSizeScaleTransformer.get() ? new 
QgsSizeScaleTransformer( *other.mSizeScaleTransformer ) : nullptr )
 
   43   , mVAlign( other.mVAlign )
 
   44   , mFont( other.mFont )
 
   45   , mTextColor( other.mTextColor )
 
   46   , mTextAlignment( other.mTextAlignment )
 
   55     mTitleLabel = other.mTitleLabel;
 
   56     mSizeClasses = other.mSizeClasses;
 
   57     mSymbol.reset( other.mSymbol.get() ? other.mSymbol->clone() : 
nullptr );
 
   58     mLineSymbol.reset( other.mLineSymbol.get() ? other.mLineSymbol->clone() : 
nullptr );
 
   59     mSizeScaleTransformer.reset( other.mSizeScaleTransformer.get() ? 
new QgsSizeScaleTransformer( *other.mSizeScaleTransformer ) : 
nullptr );
 
   60     mVAlign = other.mVAlign;
 
   62     mTextColor = other.mTextColor;
 
   63     mTextAlignment = other.mTextAlignment;
 
   80   mLineSymbol.reset( 
symbol );
 
   85   return mLineSymbol.get();
 
   90   mSizeScaleTransformer.reset( transformer );
 
   95   return mSizeScaleTransformer.get();
 
  105   mSizeScaleTransformer.reset( sizeTransformer ? sizeTransformer->
clone() : nullptr );
 
  107   if ( mTitleLabel.isEmpty() )
 
  111   if ( sizeTransformer && mSizeClasses.isEmpty() )
 
  113     mSizeClasses.clear();
 
  115     for ( 
double v : prettyBreaks )
 
  117       mSizeClasses << 
SizeClass( v, QString::number( v ) );
 
  125   if ( !mTitleLabel.isEmpty() )
 
  143       lst.reserve( mSizeClasses.size() );
 
  144       for ( 
const SizeClass &cl : mSizeClasses )
 
  148         double size = cl.
size;
 
  149         if ( mSizeScaleTransformer )
 
  151           size = mSizeScaleTransformer->size( size );
 
  171       *outputSize = QSizeF();
 
  178   double hLengthLineMM = 2;       
 
  179   double hSpaceLineTextMM = 1;    
 
  181   std::unique_ptr<QgsMarkerSymbol> s( mSymbol->clone() );
 
  183   QList<SizeClass> 
classes = mSizeClasses;
 
  186   if ( mSizeScaleTransformer )
 
  189       cls.size = mSizeScaleTransformer->size( cls.size );
 
  197   int dpm = std::round( context.
scaleFactor() * 1000 );  
 
  200   QImage tmpImg( QSize( 1, 1 ), QImage::Format_ARGB32_Premultiplied );
 
  201   tmpImg.setDotsPerMeterX( dpm );
 
  202   tmpImg.setDotsPerMeterY( dpm );
 
  203   QFontMetricsF fm( mFont, &tmpImg );
 
  204   double textHeight = fm.height();
 
  205   double leading = fm.leading();
 
  206   double minTextDistY = textHeight + leading;
 
  213   double maxTextWidth = 0;
 
  216     maxTextWidth = std::max( maxTextWidth, fm.boundingRect( 
c.label ).width() );
 
  222   double largestSize = 
classes.at( 0 ).size;
 
  223   double outputLargestSize = context.
convertToPainterUnits( largestSize, s->sizeUnit(), s->sizeMapUnitScale() );
 
  226   QList<double> symbolTopY;
 
  233         symbolTopY << outputLargestSize / 2 - outputSymbolSize / 2;
 
  236         symbolTopY <<  outputLargestSize - outputSymbolSize;
 
  243   double middleIndex = 0; 
 
  244   QList<double> textCenterY;
 
  245   double lastY = middleIndex < symbolTopY.size() ? symbolTopY[middleIndex] : 0;
 
  246   textCenterY << lastY;
 
  247   for ( 
int i = middleIndex + 1; i < 
classes.count(); ++i )
 
  249     double symbolY = symbolTopY[i];
 
  250     if ( symbolY - lastY < minTextDistY )
 
  251       symbolY = lastY + minTextDistY;
 
  252     textCenterY << symbolY;
 
  256   double textTopY = textCenterY.first() - textHeight / 2;
 
  257   double textBottomY = textCenterY.last() + textHeight / 2;
 
  258   double totalTextHeight = textBottomY - textTopY;
 
  260   double fullWidth = outputLargestSize + hLengthLine + hSpaceLineText + maxTextWidth;
 
  261   double fullHeight = std::max( outputLargestSize - textTopY, totalTextHeight );
 
  264     *outputSize = QSizeF( fullWidth, fullHeight );
 
  266     *labelXOffset = outputLargestSize + hLengthLine + hSpaceLineText;
 
  275   QPainter *p = context.
painter();
 
  277   p->translate( 0, -textTopY );
 
  282     s->setSize( 
c.size );
 
  285     double tx = ( outputLargestSize - outputSymbolSize ) / 2;
 
  291         p->translate( tx, ( outputLargestSize - outputSymbolSize ) / 2 );
 
  294         p->translate( tx, outputLargestSize - outputSymbolSize );
 
  297     s->drawPreviewIcon( 
nullptr, QSize( outputSymbolSize, outputSymbolSize ), &context );
 
  305     mLineSymbol->startRender( context );
 
  314       mLineSymbol->renderPolyline( QPolygonF() << QPointF( outputLargestSize / 2, symbolTopY[i] )
 
  315                                    << QPointF( outputLargestSize + hLengthLine, textCenterY[i] ), 
nullptr, context );
 
  319     QRect rect( outputLargestSize + hLengthLine + hSpaceLineText, textCenterY[i] - textHeight / 2,
 
  320                 maxTextWidth, textHeight );
 
  323                                QStringList() << 
c.label, context, format );
 
  328     mLineSymbol->stopRender( context );
 
  342   int dpm = std::round( context.
scaleFactor() * 1000 );  
 
  344   QImage img( contentSize.width() + padding * 2, contentSize.height() + padding * 2, QImage::Format_ARGB32_Premultiplied );
 
  345   img.setDotsPerMeterX( dpm );
 
  346   img.setDotsPerMeterY( dpm );
 
  347   img.fill( backgroundColor );
 
  349   QPainter painter( &img );
 
  350   painter.setRenderHint( QPainter::Antialiasing, 
true );
 
  352   painter.translate( padding, padding ); 
 
  355   QPainter *oldPainter = context.
painter();
 
  371   ddsLegend->
setTitle( elem.attribute( QStringLiteral( 
"title" ) ) );
 
  373   QDomElement elemSymbol = elem.firstChildElement( QStringLiteral( 
"symbol" ) );
 
  374   if ( !elemSymbol.isNull() )
 
  376     ddsLegend->
setSymbol( QgsSymbolLayerUtils::loadSymbol<QgsMarkerSymbol>( elemSymbol, context ) );
 
  379   const QDomElement lineSymbolElem = elem.firstChildElement( QStringLiteral( 
"lineSymbol" ) );
 
  380   if ( !lineSymbolElem.isNull() )
 
  382     ddsLegend->
setLineSymbol( QgsSymbolLayerUtils::loadSymbol<QgsLineSymbol>( lineSymbolElem.firstChildElement(), context ) );
 
  386   QDomElement elemTransformer = elem.firstChildElement( QStringLiteral( 
"transformer" ) );
 
  387   if ( !elemTransformer.isNull() )
 
  394   QDomElement elemTextStyle = elem.firstChildElement( QStringLiteral( 
"text-style" ) );
 
  395   if ( !elemTextStyle.isNull() )
 
  397     QDomElement elemFont = elemTextStyle.firstChildElement( QStringLiteral( 
"font" ) );
 
  398     if ( !elemFont.isNull() )
 
  400       ddsLegend->
setFont( QFont( elemFont.attribute( QStringLiteral( 
"family" ) ), elemFont.attribute( QStringLiteral( 
"size" ) ).toInt(),
 
  401                                  elemFont.attribute( QStringLiteral( 
"weight" ) ).toInt(), elemFont.attribute( QStringLiteral( 
"italic" ) ).toInt() ) );
 
  404     ddsLegend->
setTextAlignment( 
static_cast<Qt::AlignmentFlag
>( elemTextStyle.attribute( QStringLiteral( 
"align" ) ).toInt() ) );
 
  407   QDomElement elemClasses = elem.firstChildElement( QStringLiteral( 
"classes" ) );
 
  408   if ( !elemClasses.isNull() )
 
  411     QDomElement elemClass = elemClasses.firstChildElement( QStringLiteral( 
"class" ) );
 
  412     while ( !elemClass.isNull() )
 
  414       classes << 
SizeClass( elemClass.attribute( QStringLiteral( 
"size" ) ).toDouble(), elemClass.attribute( QStringLiteral( 
"label" ) ) );
 
  415       elemClass = elemClass.nextSiblingElement();
 
  425   QDomDocument doc = elem.ownerDocument();
 
  427   elem.setAttribute( QStringLiteral( 
"type" ), mType == 
LegendCollapsed ? 
"collapsed" : 
"separated" );
 
  428   elem.setAttribute( QStringLiteral( 
"valign" ), mVAlign == 
AlignCenter ? 
"center" : 
"bottom" );
 
  429   elem.setAttribute( QStringLiteral( 
"title" ), mTitleLabel );
 
  434     elem.appendChild( elemSymbol );
 
  439     QDomElement lineSymbolElem = doc.createElement( QStringLiteral( 
"lineSymbol" ) );
 
  441     elem.appendChild( lineSymbolElem );
 
  444   if ( mSizeScaleTransformer )
 
  447     elemTransformer.setTagName( QStringLiteral( 
"transformer" ) );
 
  448     elem.appendChild( elemTransformer );
 
  451   QDomElement elemFont = doc.createElement( QStringLiteral( 
"font" ) );
 
  452   elemFont.setAttribute( QStringLiteral( 
"family" ), mFont.family() );
 
  453   elemFont.setAttribute( QStringLiteral( 
"size" ), mFont.pointSize() );
 
  454   elemFont.setAttribute( QStringLiteral( 
"weight" ), mFont.weight() );
 
  455   elemFont.setAttribute( QStringLiteral( 
"italic" ), mFont.italic() );
 
  457   QDomElement elemTextStyle = doc.createElement( QStringLiteral( 
"text-style" ) );
 
  459   elemTextStyle.setAttribute( QStringLiteral( 
"align" ), 
static_cast<int>( mTextAlignment ) );
 
  460   elemTextStyle.appendChild( elemFont );
 
  461   elem.appendChild( elemTextStyle );
 
  463   if ( !mSizeClasses.isEmpty() )
 
  465     QDomElement elemClasses = doc.createElement( QStringLiteral( 
"classes" ) );
 
  466     for ( 
const SizeClass &sc : std::as_const( mSizeClasses ) )
 
  468       QDomElement elemClass = doc.createElement( QStringLiteral( 
"class" ) );
 
  469       elemClass.setAttribute( QStringLiteral( 
"size" ), sc.size );
 
  470       elemClass.setAttribute( QStringLiteral( 
"label" ), sc.label );
 
  471       elemClasses.appendChild( elemClass );
 
  473     elem.appendChild( elemClasses );
 
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
void setTitle(const QString &title)
Sets title label for data-defined size legend.
QList< QgsDataDefinedSizeLegend::SizeClass > classes() const
Returns list of classes: each class is a pair of symbol size (in units used by the symbol) and label.
void setSymbol(QgsMarkerSymbol *symbol SIP_TRANSFER)
Sets marker symbol that will be used to draw markers in legend.
void setVerticalAlignment(VerticalAlignment vAlign)
Sets vertical alignment of symbols - only valid for collapsed legend.
void setLineSymbol(QgsLineSymbol *symbol SIP_TRANSFER)
Sets the line symbol that will be used to draw callout lines in legend.
QgsMarkerSymbol * symbol() const
Returns marker symbol that will be used to draw markers in legend.
@ AlignCenter
Symbols are aligned to the center.
@ AlignBottom
Symbols are aligned to the bottom.
void setTextAlignment(Qt::AlignmentFlag flag)
Sets horizontal text alignment for rendering of labels - only valid for collapsed legend.
QgsDataDefinedSizeLegend & operator=(const QgsDataDefinedSizeLegend &other)
void setClasses(const QList< QgsDataDefinedSizeLegend::SizeClass > &classes)
Sets list of classes: each class is a pair of symbol size (in units used by the symbol) and label.
void setLegendType(LegendType type)
Sets how the legend should be rendered.
void setFont(const QFont &font)
Sets font used for rendering of labels - only valid for collapsed legend.
void setTextColor(const QColor &color)
Sets text color for rendering of labels - only valid for collapsed legend.
QString title() const
Returns title label for data-defined size legend.
void setSizeScaleTransformer(QgsSizeScaleTransformer *transformer SIP_TRANSFER)
Sets transformer for scaling of symbol sizes. Takes ownership of the object. Accepts nullptr to set n...
QgsDataDefinedSizeLegend()
Constructor for QgsDataDefinedSizeLegend.
static QgsDataDefinedSizeLegend * readXml(const QDomElement &elem, const QgsReadWriteContext &context) SIP_FACTORY
Creates instance from given element and returns it (caller takes ownership). Returns nullptr on error...
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const
Writes configuration to the given XML element.
@ LegendSeparated
Each class (size value) has a separate legend node.
@ LegendCollapsed
All classes are rendered within one legend node.
~QgsDataDefinedSizeLegend()
QgsLineSymbol * lineSymbol() const
Returns the line symbol that will be used to draw callout lines in legend.
void updateFromSymbolAndProperty(const QgsMarkerSymbol *symbol, const QgsProperty &ddSize)
Updates the list of classes, source symbol and title label from given symbol and property.
QgsSizeScaleTransformer * sizeScaleTransformer() const
Returns transformer for scaling of symbol sizes. Returns nullptr if no transformer is defined.
QImage collapsedLegendImage(QgsRenderContext &context, const QColor &backgroundColor=Qt::transparent, double paddingMM=1) const
Returns output image that would be shown in the legend. Returns invalid image if legend is not config...
QgsLegendSymbolList legendSymbolList() const
Generates legend symbol items according to the configuration.
void drawCollapsedLegend(QgsRenderContext &context, QSizeF *outputSize SIP_OUT=nullptr, double *labelXOffset SIP_OUT=nullptr) const
Draw the legend if using LegendOneNodeForAll and optionally output size of the legend and x offset of...
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
void setDataDefinedSizeLegendSettings(QgsDataDefinedSizeLegend *settings)
Sets extra information about data-defined size.
QgsSymbol * symbol() const
Returns associated symbol. May be nullptr.
A line symbol type, for rendering LineString and MultiLineString geometries.
A marker symbol type, for rendering Point and MultiPoint geometries.
void setSize(double size)
Sets the size for the whole symbol.
double size() const
Returns the estimated size for the whole symbol, which is the maximum size of all marker symbol layer...
QgsMarkerSymbol * clone() const override
Returns a deep copy of this symbol.
A store for object properties.
@ ExpressionBasedProperty
Expression based property (QgsExpressionBasedProperty)
QString expressionString() const
Returns the expression used for the property value.
QString field() const
Returns the current field name the property references.
const QgsPropertyTransformer * transformer() const
Returns the existing transformer used for manipulating the calculated values for the property,...
Type propertyType() const
Returns the property type.
The class is used as a container of context for various read/write operations on other objects.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
Scoped object for saving and restoring a QPainter object's state.
static QColor decodeColor(const QString &str)
static QList< double > prettyBreaks(double minimum, double maximum, int classes)
Computes a sequence of about 'classes' equally spaced round values which cover the range of values fr...
static QString encodeColor(const QColor &color)
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
Container for all settings relating to text rendering.
void setColor(const QColor &color)
Sets the color that text will be rendered in.
static QgsTextFormat fromQFont(const QFont &font)
Returns a text format matching the settings from an input font.
static HAlignment convertQtHAlignment(Qt::Alignment alignment)
Converts a Qt horizontal alignment flag to a QgsTextRenderer::HAlignment value.
static void drawText(const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, VAlignment vAlignment=AlignTop)
Draws text within a rectangle using the specified settings.
@ RenderMillimeters
Millimeters.
static QDomElement writeVariant(const QVariant &value, QDomDocument &doc)
Write a QVariant to a QDomElement.
static QVariant readVariant(const QDomElement &element)
Read a QVariant from a QDomElement.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QList< QgsLegendSymbolItem > QgsLegendSymbolList
QList< QgsSymbolLayer * > QgsSymbolLayerList
Definition of one class for the legend.