33  auto lineSymbolLayer = std::make_unique< QgsSimpleLineSymbolLayer >( QColor( 0, 0, 0 ), 0.2 );
 
   34  mLineSymbol = std::make_unique< QgsLineSymbol >( 
QgsSymbolLayerList() << lineSymbolLayer.release() );
 
 
   40  : mType( other.mType )
 
   41  , mTitleLabel( other.mTitleLabel )
 
   42  , mSizeClasses( other.mSizeClasses )
 
   43  , mSymbol( other.mSymbol.get() ? other.mSymbol->clone() : nullptr )
 
   44  , mLineSymbol( other.mLineSymbol.get() ? other.mLineSymbol->clone() : nullptr )
 
   45  , mSizeScaleTransformer( other.mSizeScaleTransformer.get() ? new 
QgsSizeScaleTransformer( *other.mSizeScaleTransformer ) : nullptr )
 
   46  , mVAlign( other.mVAlign )
 
   47  , mFont( other.mFont )
 
   48  , mTextColor( other.mTextColor )
 
   49  , mTextAlignment( other.mTextAlignment )
 
 
   58    mTitleLabel = other.mTitleLabel;
 
   59    mSizeClasses = other.mSizeClasses;
 
   60    mSymbol.reset( other.mSymbol.get() ? other.mSymbol->clone() : nullptr );
 
   61    mLineSymbol.reset( other.mLineSymbol.get() ? other.mLineSymbol->clone() : nullptr );
 
   62    mSizeScaleTransformer.reset( other.mSizeScaleTransformer.get() ? 
new QgsSizeScaleTransformer( *other.mSizeScaleTransformer ) : nullptr );
 
   63    mVAlign = other.mVAlign;
 
   65    mTextColor = other.mTextColor;
 
   66    mTextAlignment = other.mTextAlignment;
 
 
   83  mLineSymbol.reset( 
symbol );
 
 
   88  return mLineSymbol.get();
 
 
   93  mSizeScaleTransformer.reset( transformer );
 
 
   98  return mSizeScaleTransformer.get();
 
 
  108  mSizeScaleTransformer.reset( sizeTransformer ? sizeTransformer->
clone() : nullptr );
 
  110  if ( mTitleLabel.isEmpty() )
 
  114  if ( sizeTransformer && mSizeClasses.isEmpty() )
 
  116    mSizeClasses.clear();
 
  118    for ( 
double v : prettyBreaks )
 
  120      mSizeClasses << 
SizeClass( v, QString::number( v ) );
 
 
  128  QVariant isDataDefinedSize( 
true );
 
  129  if ( !mTitleLabel.isEmpty() )
 
  149      lst.reserve( mSizeClasses.size() );
 
  150      for ( 
const SizeClass &cl : mSizeClasses )
 
  155        double size = cl.
size;
 
  156        if ( mSizeScaleTransformer )
 
  158          size = mSizeScaleTransformer->size( size );
 
 
  178      *outputSize = QSizeF();
 
  185  double hLengthLineMM = 2;       
 
  186  double hSpaceLineTextMM = 1;    
 
  188  std::unique_ptr<QgsMarkerSymbol> s( mSymbol->clone() );
 
  190  QList<SizeClass> 
classes = mSizeClasses;
 
  193  if ( mSizeScaleTransformer )
 
  196      cls.size = mSizeScaleTransformer->size( cls.size );
 
  204  int dpm = std::round( context.
scaleFactor() * 1000 );  
 
  207  QImage tmpImg( QSize( 1, 1 ), QImage::Format_ARGB32_Premultiplied );
 
  208  tmpImg.setDotsPerMeterX( dpm );
 
  209  tmpImg.setDotsPerMeterY( dpm );
 
  210  QFontMetricsF fm( mFont, &tmpImg );
 
  211  double textHeight = fm.height();
 
  212  double leading = fm.leading();
 
  213  double minTextDistY = textHeight + leading;
 
  220  double maxTextWidth = 0;
 
  223    maxTextWidth = std::max( maxTextWidth, fm.boundingRect( 
c.label ).width() );
 
  229  double largestSize = 
classes.at( 0 ).size;
 
  230  double outputLargestSize = context.
convertToPainterUnits( largestSize, s->sizeUnit(), s->sizeMapUnitScale() );
 
  233  QList<double> symbolTopY;
 
  240        symbolTopY << outputLargestSize / 2 - outputSymbolSize / 2;
 
  243        symbolTopY <<  outputLargestSize - outputSymbolSize;
 
  250  double middleIndex = 0; 
 
  251  QList<double> textCenterY;
 
  252  double lastY = middleIndex < symbolTopY.size() ? symbolTopY[middleIndex] : 0;
 
  253  textCenterY << lastY;
 
  254  for ( 
int i = middleIndex + 1; i < 
classes.count(); ++i )
 
  256    double symbolY = symbolTopY[i];
 
  257    if ( symbolY - lastY < minTextDistY )
 
  258      symbolY = lastY + minTextDistY;
 
  259    textCenterY << symbolY;
 
  263  double textTopY = textCenterY.first() - textHeight / 2;
 
  264  double textBottomY = textCenterY.last() + textHeight / 2;
 
  265  double totalTextHeight = textBottomY - textTopY;
 
  267  double fullWidth = outputLargestSize + hLengthLine + hSpaceLineText + maxTextWidth;
 
  268  double fullHeight = std::max( outputLargestSize - textTopY, totalTextHeight );
 
  271    *outputSize = QSizeF( fullWidth, fullHeight );
 
  273    *labelXOffset = outputLargestSize + hLengthLine + hSpaceLineText;
 
  282  QPainter *p = context.
painter();
 
  284  p->translate( 0, -textTopY );
 
  289    s->setSize( 
c.size );
 
  292    double tx = ( outputLargestSize - outputSymbolSize ) / 2;
 
  298        p->translate( tx, ( outputLargestSize - outputSymbolSize ) / 2 );
 
  301        p->translate( tx, outputLargestSize - outputSymbolSize );
 
  304    s->drawPreviewIcon( 
nullptr, QSize( outputSymbolSize, outputSymbolSize ), &context );
 
  312    mLineSymbol->startRender( context );
 
  321      mLineSymbol->renderPolyline( QPolygonF() << QPointF( outputLargestSize / 2, symbolTopY[i] )
 
  322                                   << QPointF( outputLargestSize + hLengthLine, textCenterY[i] ), 
nullptr, context );
 
  326    QRect rect( outputLargestSize + hLengthLine + hSpaceLineText, textCenterY[i] - textHeight / 2,
 
  327                maxTextWidth, textHeight );
 
  330                               QStringList() << 
c.label, context, format );
 
  335    mLineSymbol->stopRender( context );
 
 
  349  int dpm = std::round( context.
scaleFactor() * 1000 );  
 
  351  QImage img( contentSize.width() + padding * 2, contentSize.height() + padding * 2, QImage::Format_ARGB32_Premultiplied );
 
  352  img.setDotsPerMeterX( dpm );
 
  353  img.setDotsPerMeterY( dpm );
 
  354  img.fill( backgroundColor );
 
  356  QPainter painter( &img );
 
  357  painter.setRenderHint( QPainter::Antialiasing, 
true );
 
  359  painter.translate( padding, padding ); 
 
  362  QPainter *oldPainter = context.
painter();
 
 
  378  ddsLegend->
setTitle( elem.attribute( QStringLiteral( 
"title" ) ) );
 
  380  QDomElement elemSymbol = elem.firstChildElement( QStringLiteral( 
"symbol" ) );
 
  381  if ( !elemSymbol.isNull() )
 
  383    ddsLegend->
setSymbol( QgsSymbolLayerUtils::loadSymbol<QgsMarkerSymbol>( elemSymbol, context ).release() );
 
  386  const QDomElement lineSymbolElem = elem.firstChildElement( QStringLiteral( 
"lineSymbol" ) );
 
  387  if ( !lineSymbolElem.isNull() )
 
  389    ddsLegend->
setLineSymbol( QgsSymbolLayerUtils::loadSymbol<QgsLineSymbol>( lineSymbolElem.firstChildElement(), context ).release() );
 
  393  QDomElement elemTransformer = elem.firstChildElement( QStringLiteral( 
"transformer" ) );
 
  394  if ( !elemTransformer.isNull() )
 
  401  QDomElement elemTextStyle = elem.firstChildElement( QStringLiteral( 
"text-style" ) );
 
  402  if ( !elemTextStyle.isNull() )
 
  404    QDomElement elemFont = elemTextStyle.firstChildElement( QStringLiteral( 
"font" ) );
 
  405    if ( !elemFont.isNull() )
 
  407      ddsLegend->
setFont( 
QgsFontUtils::createFont( elemFont.attribute( QStringLiteral( 
"family" ) ), elemFont.attribute( QStringLiteral( 
"size" ) ).toInt(),
 
  408                          elemFont.attribute( QStringLiteral( 
"weight" ) ).toInt(), elemFont.attribute( QStringLiteral( 
"italic" ) ).toInt() ) );
 
  411    ddsLegend->
setTextAlignment( 
static_cast<Qt::AlignmentFlag
>( elemTextStyle.attribute( QStringLiteral( 
"align" ) ).toInt() ) );
 
  414  QDomElement elemClasses = elem.firstChildElement( QStringLiteral( 
"classes" ) );
 
  415  if ( !elemClasses.isNull() )
 
  418    QDomElement elemClass = elemClasses.firstChildElement( QStringLiteral( 
"class" ) );
 
  419    while ( !elemClass.isNull() )
 
  421      classes << 
SizeClass( elemClass.attribute( QStringLiteral( 
"size" ) ).toDouble(), elemClass.attribute( QStringLiteral( 
"label" ) ) );
 
  422      elemClass = elemClass.nextSiblingElement();
 
 
  432  QDomDocument doc = elem.ownerDocument();
 
  434  elem.setAttribute( QStringLiteral( 
"type" ), mType == 
LegendCollapsed ? 
"collapsed" : 
"separated" );
 
  435  elem.setAttribute( QStringLiteral( 
"valign" ), mVAlign == 
AlignCenter ? 
"center" : 
"bottom" );
 
  436  elem.setAttribute( QStringLiteral( 
"title" ), mTitleLabel );
 
  441    elem.appendChild( elemSymbol );
 
  446    QDomElement lineSymbolElem = doc.createElement( QStringLiteral( 
"lineSymbol" ) );
 
  448    elem.appendChild( lineSymbolElem );
 
  451  if ( mSizeScaleTransformer )
 
  454    elemTransformer.setTagName( QStringLiteral( 
"transformer" ) );
 
  455    elem.appendChild( elemTransformer );
 
  458  QDomElement elemFont = doc.createElement( QStringLiteral( 
"font" ) );
 
  459  elemFont.setAttribute( QStringLiteral( 
"family" ), mFont.family() );
 
  460  elemFont.setAttribute( QStringLiteral( 
"size" ), mFont.pointSize() );
 
  461  elemFont.setAttribute( QStringLiteral( 
"weight" ), mFont.weight() );
 
  462  elemFont.setAttribute( QStringLiteral( 
"italic" ), mFont.italic() );
 
  464  QDomElement elemTextStyle = doc.createElement( QStringLiteral( 
"text-style" ) );
 
  466  elemTextStyle.setAttribute( QStringLiteral( 
"align" ), 
static_cast<int>( mTextAlignment ) );
 
  467  elemTextStyle.appendChild( elemFont );
 
  468  elem.appendChild( elemTextStyle );
 
  470  if ( !mSizeClasses.isEmpty() )
 
  472    QDomElement elemClasses = doc.createElement( QStringLiteral( 
"classes" ) );
 
  473    for ( 
const SizeClass &sc : std::as_const( mSizeClasses ) )
 
  475      QDomElement elemClass = doc.createElement( QStringLiteral( 
"class" ) );
 
  476      elemClass.setAttribute( QStringLiteral( 
"size" ), sc.size );
 
  477      elemClass.setAttribute( QStringLiteral( 
"label" ), sc.label );
 
  478      elemClasses.appendChild( elemClass );
 
  480    elem.appendChild( elemClasses );
 
 
@ Expression
Expression based property.
 
@ Millimeters
Millimeters.
 
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
 
static QString colorToString(const QColor &color)
Encodes a color into a string value.
 
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...
 
static QFont createFont(const QString &family, int pointSize=-1, int weight=-1, bool italic=false)
Creates a font with the specified family.
 
@ IsDataDefinedSize
Set when a node is related to data defined size (title or separated legend items)....
 
Stores information about one class/rule of a vector layer renderer in a unified way that can be used ...
 
void setUserData(int key, QVariant &value)
Adds a key - value pair to the item's user data.
 
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) const
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.
 
QString expressionString() const
Returns the expression used for the property value.
 
Qgis::PropertyType propertyType() const
Returns the property type.
 
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,...
 
A container for the context for various read/write operations on 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.
 
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 setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
 
Scoped object for saving and restoring a QPainter object's state.
 
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 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 void drawText(const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, Qgis::TextVerticalAlignment vAlignment=Qgis::TextVerticalAlignment::Top, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle)
Draws text within a rectangle using the specified settings.
 
static Qgis::TextHorizontalAlignment convertQtHAlignment(Qt::Alignment alignment)
Converts a Qt horizontal alignment flag to a Qgis::TextHorizontalAlignment value.
 
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.