QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
qgsdatadefinedsizelegend.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsdatadefinedsizelegend.cpp
3  --------------------------------------
4  Date : June 2017
5  Copyright : (C) 2017 by Martin Dobias
6  Email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
17 
18 #include "qgsproperty.h"
19 #include "qgspropertytransformer.h"
20 #include "qgssymbollayerutils.h"
21 #include "qgsxmlutils.h"
22 #include "qgslinesymbollayer.h"
23 #include "qgstextformat.h"
24 #include "qgstextrenderer.h"
25 #include "qgsmarkersymbol.h"
26 #include "qgslinesymbol.h"
27 
29 {
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() );
32 }
33 
35 
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 )
47 {
48 }
49 
51 {
52  if ( this != &other )
53  {
54  mType = other.mType;
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;
61  mFont = other.mFont;
62  mTextColor = other.mTextColor;
63  mTextAlignment = other.mTextAlignment;
64  }
65  return *this;
66 }
67 
69 {
70  mSymbol.reset( symbol );
71 }
72 
74 {
75  return mSymbol.get();
76 }
77 
79 {
80  mLineSymbol.reset( symbol );
81 }
82 
84 {
85  return mLineSymbol.get();
86 }
87 
89 {
90  mSizeScaleTransformer.reset( transformer );
91 }
92 
94 {
95  return mSizeScaleTransformer.get();
96 }
97 
98 
100 {
101  mSymbol.reset( symbol->clone() );
102  mSymbol->setDataDefinedSize( QgsProperty() ); // original symbol may have had data-defined size associated
103 
104  const QgsSizeScaleTransformer *sizeTransformer = dynamic_cast< const QgsSizeScaleTransformer * >( ddSize.transformer() );
105  mSizeScaleTransformer.reset( sizeTransformer ? sizeTransformer->clone() : nullptr );
106 
107  if ( mTitleLabel.isEmpty() )
108  mTitleLabel = ddSize.propertyType() == QgsProperty::ExpressionBasedProperty ? ddSize.expressionString() : ddSize.field();
109 
110  // automatically generate classes if no classes are defined
111  if ( sizeTransformer && mSizeClasses.isEmpty() )
112  {
113  mSizeClasses.clear();
114  const auto prettyBreaks { QgsSymbolLayerUtils::prettyBreaks( sizeTransformer->minValue(), sizeTransformer->maxValue(), 4 ) };
115  for ( double v : prettyBreaks )
116  {
117  mSizeClasses << SizeClass( v, QString::number( v ) );
118  }
119  }
120 }
121 
123 {
125  if ( !mTitleLabel.isEmpty() )
126  {
127  QgsLegendSymbolItem title( nullptr, mTitleLabel, QString() );
128  lst << title;
129  }
130 
131  switch ( mType )
132  {
133  case LegendCollapsed:
134  {
137  lst << i;
138  break;
139  }
140 
141  case LegendSeparated:
142  {
143  lst.reserve( mSizeClasses.size() );
144  for ( const SizeClass &cl : mSizeClasses )
145  {
146  QgsLegendSymbolItem si( mSymbol.get(), cl.label, QString() );
147  QgsMarkerSymbol *s = static_cast<QgsMarkerSymbol *>( si.symbol() );
148  double size = cl.size;
149  if ( mSizeScaleTransformer )
150  {
151  size = mSizeScaleTransformer->size( size );
152  }
153 
154  s->setSize( size );
155  lst << si;
156  }
157  break;
158  }
159  }
160  return lst;
161 }
162 
163 
164 void QgsDataDefinedSizeLegend::drawCollapsedLegend( QgsRenderContext &context, QSizeF *outputSize, double *labelXOffset ) const
165 {
166  // this assumes the context's painter has been scaled to pixels in advance!
167 
168  if ( mType != LegendCollapsed || mSizeClasses.isEmpty() || !mSymbol )
169  {
170  if ( outputSize )
171  *outputSize = QSizeF();
172  if ( labelXOffset )
173  *labelXOffset = 0;
174  return;
175  }
176 
177  // parameters that could be configurable
178  double hLengthLineMM = 2; // extra horizontal space to be occupied by callout line
179  double hSpaceLineTextMM = 1; // horizontal space between end of the line and start of the text
180 
181  std::unique_ptr<QgsMarkerSymbol> s( mSymbol->clone() );
182 
183  QList<SizeClass> classes = mSizeClasses;
184 
185  // optionally scale size values if transformer is defined
186  if ( mSizeScaleTransformer )
187  {
188  for ( SizeClass &cls : classes )
189  cls.size = mSizeScaleTransformer->size( cls.size );
190  }
191 
192  // make sure we draw bigger symbols first
193  std::sort( classes.begin(), classes.end(), []( const SizeClass & a, const SizeClass & b ) { return a.size > b.size; } );
194 
195  double hLengthLine = context.convertToPainterUnits( hLengthLineMM, QgsUnitTypes::RenderMillimeters );
196  double hSpaceLineText = context.convertToPainterUnits( hSpaceLineTextMM, QgsUnitTypes::RenderMillimeters );
197  int dpm = std::round( context.scaleFactor() * 1000 ); // scale factor = dots per millimeter
198 
199  // get font metrics - we need a temporary image just to get the metrics right for the given DPI
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;
207 
208  //
209  // determine layout of the rendered elements
210  //
211 
212  // find out how wide the text will be
213  double maxTextWidth = 0;
214  for ( const SizeClass &c : std::as_const( classes ) )
215  {
216  maxTextWidth = std::max( maxTextWidth, fm.boundingRect( c.label ).width() );
217  }
218  // add extra width needed to handle varying rendering of font weight
219  maxTextWidth += 1;
220 
221  // find out size of the largest symbol
222  double largestSize = classes.at( 0 ).size;
223  double outputLargestSize = context.convertToPainterUnits( largestSize, s->sizeUnit(), s->sizeMapUnitScale() );
224 
225  // find out top Y coordinate for individual symbol sizes
226  QList<double> symbolTopY;
227  for ( const SizeClass &c : std::as_const( classes ) )
228  {
229  double outputSymbolSize = context.convertToPainterUnits( c.size, s->sizeUnit(), s->sizeMapUnitScale() );
230  switch ( mVAlign )
231  {
232  case AlignCenter:
233  symbolTopY << outputLargestSize / 2 - outputSymbolSize / 2;
234  break;
235  case AlignBottom:
236  symbolTopY << outputLargestSize - outputSymbolSize;
237  break;
238  }
239  }
240 
241  // determine Y coordinate of texts: ideally they should be at the same level as symbolTopY
242  // but we need to avoid overlapping texts, so adjust the vertical positions
243  double middleIndex = 0; // classes.count() / 2; // will get the ideal position
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 )
248  {
249  double symbolY = symbolTopY[i];
250  if ( symbolY - lastY < minTextDistY )
251  symbolY = lastY + minTextDistY;
252  textCenterY << symbolY;
253  lastY = symbolY;
254  }
255 
256  double textTopY = textCenterY.first() - textHeight / 2;
257  double textBottomY = textCenterY.last() + textHeight / 2;
258  double totalTextHeight = textBottomY - textTopY;
259 
260  double fullWidth = outputLargestSize + hLengthLine + hSpaceLineText + maxTextWidth;
261  double fullHeight = std::max( outputLargestSize - textTopY, totalTextHeight );
262 
263  if ( outputSize )
264  *outputSize = QSizeF( fullWidth, fullHeight );
265  if ( labelXOffset )
266  *labelXOffset = outputLargestSize + hLengthLine + hSpaceLineText;
267 
268  if ( !context.painter() )
269  return; // only layout
270 
271  //
272  // drawing
273  //
274 
275  QPainter *p = context.painter();
276  QgsScopedQPainterState painterState( p );
277  p->translate( 0, -textTopY );
278 
279  // draw symbols first so that they do not cover
280  for ( const SizeClass &c : std::as_const( classes ) )
281  {
282  s->setSize( c.size );
283 
284  double outputSymbolSize = context.convertToPainterUnits( c.size, s->sizeUnit(), s->sizeMapUnitScale() );
285  double tx = ( outputLargestSize - outputSymbolSize ) / 2;
286 
287  QgsScopedQPainterState symbolPainterState( p );
288  switch ( mVAlign )
289  {
290  case AlignCenter:
291  p->translate( tx, ( outputLargestSize - outputSymbolSize ) / 2 );
292  break;
293  case AlignBottom:
294  p->translate( tx, outputLargestSize - outputSymbolSize );
295  break;
296  }
297  s->drawPreviewIcon( nullptr, QSize( outputSymbolSize, outputSymbolSize ), &context );
298  }
299 
300  QgsTextFormat format = QgsTextFormat::fromQFont( mFont );
301  format.setColor( mTextColor );
302 
303  if ( mLineSymbol )
304  {
305  mLineSymbol->startRender( context );
306  }
307 
308  int i = 0;
309  for ( const SizeClass &c : std::as_const( classes ) )
310  {
311  // line from symbol to the text
312  if ( mLineSymbol )
313  {
314  mLineSymbol->renderPolyline( QPolygonF() << QPointF( outputLargestSize / 2, symbolTopY[i] )
315  << QPointF( outputLargestSize + hLengthLine, textCenterY[i] ), nullptr, context );
316  }
317 
318  // draw label
319  QRect rect( outputLargestSize + hLengthLine + hSpaceLineText, textCenterY[i] - textHeight / 2,
320  maxTextWidth, textHeight );
321 
323  QStringList() << c.label, context, format );
324  i++;
325  }
326 
327  if ( mLineSymbol )
328  mLineSymbol->stopRender( context );
329 }
330 
331 
332 QImage QgsDataDefinedSizeLegend::collapsedLegendImage( QgsRenderContext &context, const QColor &backgroundColor, double paddingMM ) const
333 {
334  if ( mType != LegendCollapsed || mSizeClasses.isEmpty() || !mSymbol )
335  return QImage();
336 
337  // find out the size first
338  QSizeF contentSize;
339  drawCollapsedLegend( context, &contentSize );
340 
341  double padding = context.convertToPainterUnits( paddingMM, QgsUnitTypes::RenderMillimeters );
342  int dpm = std::round( context.scaleFactor() * 1000 ); // scale factor = dots per millimeter
343 
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 );
348 
349  QPainter painter( &img );
350  painter.setRenderHint( QPainter::Antialiasing, true );
351 
352  painter.translate( padding, padding ); // so we do not need to care about padding at all
353 
354  // now do the rendering
355  QPainter *oldPainter = context.painter();
356  context.setPainter( &painter );
357  drawCollapsedLegend( context );
358  context.setPainter( oldPainter );
359 
360  painter.end();
361  return img;
362 }
363 
365 {
366  if ( elem.isNull() )
367  return nullptr;
369  ddsLegend->setLegendType( elem.attribute( QStringLiteral( "type" ) ) == QLatin1String( "collapsed" ) ? LegendCollapsed : LegendSeparated );
370  ddsLegend->setVerticalAlignment( elem.attribute( QStringLiteral( "valign" ) ) == QLatin1String( "center" ) ? AlignCenter : AlignBottom );
371  ddsLegend->setTitle( elem.attribute( QStringLiteral( "title" ) ) );
372 
373  QDomElement elemSymbol = elem.firstChildElement( QStringLiteral( "symbol" ) );
374  if ( !elemSymbol.isNull() )
375  {
376  ddsLegend->setSymbol( QgsSymbolLayerUtils::loadSymbol<QgsMarkerSymbol>( elemSymbol, context ) );
377  }
378 
379  const QDomElement lineSymbolElem = elem.firstChildElement( QStringLiteral( "lineSymbol" ) );
380  if ( !lineSymbolElem.isNull() )
381  {
382  ddsLegend->setLineSymbol( QgsSymbolLayerUtils::loadSymbol<QgsLineSymbol>( lineSymbolElem.firstChildElement(), context ) );
383  }
384 
385  QgsSizeScaleTransformer *transformer = nullptr;
386  QDomElement elemTransformer = elem.firstChildElement( QStringLiteral( "transformer" ) );
387  if ( !elemTransformer.isNull() )
388  {
389  transformer = new QgsSizeScaleTransformer;
390  transformer->loadVariant( QgsXmlUtils::readVariant( elemTransformer ) );
391  }
392  ddsLegend->setSizeScaleTransformer( transformer );
393 
394  QDomElement elemTextStyle = elem.firstChildElement( QStringLiteral( "text-style" ) );
395  if ( !elemTextStyle.isNull() )
396  {
397  QDomElement elemFont = elemTextStyle.firstChildElement( QStringLiteral( "font" ) );
398  if ( !elemFont.isNull() )
399  {
400  ddsLegend->setFont( QFont( elemFont.attribute( QStringLiteral( "family" ) ), elemFont.attribute( QStringLiteral( "size" ) ).toInt(),
401  elemFont.attribute( QStringLiteral( "weight" ) ).toInt(), elemFont.attribute( QStringLiteral( "italic" ) ).toInt() ) );
402  }
403  ddsLegend->setTextColor( QgsSymbolLayerUtils::decodeColor( elemTextStyle.attribute( QStringLiteral( "color" ) ) ) );
404  ddsLegend->setTextAlignment( static_cast<Qt::AlignmentFlag>( elemTextStyle.attribute( QStringLiteral( "align" ) ).toInt() ) );
405  }
406 
407  QDomElement elemClasses = elem.firstChildElement( QStringLiteral( "classes" ) );
408  if ( !elemClasses.isNull() )
409  {
410  QList<SizeClass> classes;
411  QDomElement elemClass = elemClasses.firstChildElement( QStringLiteral( "class" ) );
412  while ( !elemClass.isNull() )
413  {
414  classes << SizeClass( elemClass.attribute( QStringLiteral( "size" ) ).toDouble(), elemClass.attribute( QStringLiteral( "label" ) ) );
415  elemClass = elemClass.nextSiblingElement();
416  }
417  ddsLegend->setClasses( classes );
418  }
419 
420  return ddsLegend;
421 }
422 
423 void QgsDataDefinedSizeLegend::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
424 {
425  QDomDocument doc = elem.ownerDocument();
426 
427  elem.setAttribute( QStringLiteral( "type" ), mType == LegendCollapsed ? "collapsed" : "separated" );
428  elem.setAttribute( QStringLiteral( "valign" ), mVAlign == AlignCenter ? "center" : "bottom" );
429  elem.setAttribute( QStringLiteral( "title" ), mTitleLabel );
430 
431  if ( mSymbol )
432  {
433  QDomElement elemSymbol = QgsSymbolLayerUtils::saveSymbol( QStringLiteral( "source" ), mSymbol.get(), doc, context );
434  elem.appendChild( elemSymbol );
435  }
436 
437  if ( mLineSymbol )
438  {
439  QDomElement lineSymbolElem = doc.createElement( QStringLiteral( "lineSymbol" ) );
440  lineSymbolElem.appendChild( QgsSymbolLayerUtils::saveSymbol( QStringLiteral( "lineSymbol" ), mLineSymbol.get(), doc, context ) );
441  elem.appendChild( lineSymbolElem );
442  }
443 
444  if ( mSizeScaleTransformer )
445  {
446  QDomElement elemTransformer = QgsXmlUtils::writeVariant( mSizeScaleTransformer->toVariant(), doc );
447  elemTransformer.setTagName( QStringLiteral( "transformer" ) );
448  elem.appendChild( elemTransformer );
449  }
450 
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() );
456 
457  QDomElement elemTextStyle = doc.createElement( QStringLiteral( "text-style" ) );
458  elemTextStyle.setAttribute( QStringLiteral( "color" ), QgsSymbolLayerUtils::encodeColor( mTextColor ) );
459  elemTextStyle.setAttribute( QStringLiteral( "align" ), static_cast<int>( mTextAlignment ) );
460  elemTextStyle.appendChild( elemFont );
461  elem.appendChild( elemTextStyle );
462 
463  if ( !mSizeClasses.isEmpty() )
464  {
465  QDomElement elemClasses = doc.createElement( QStringLiteral( "classes" ) );
466  for ( const SizeClass &sc : std::as_const( mSizeClasses ) )
467  {
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 );
472  }
473  elem.appendChild( elemClasses );
474  }
475 }
QgsLegendSymbolItem::setDataDefinedSizeLegendSettings
void setDataDefinedSizeLegendSettings(QgsDataDefinedSizeLegend *settings)
Sets extra information about data-defined size.
Definition: qgslegendsymbolitem.cpp:86
QgsSymbolLayerUtils::encodeColor
static QString encodeColor(const QColor &color)
Definition: qgssymbollayerutils.cpp:64
QgsDataDefinedSizeLegend::setSymbol
void setSymbol(QgsMarkerSymbol *symbol SIP_TRANSFER)
Sets marker symbol that will be used to draw markers in legend.
Definition: qgsdatadefinedsizelegend.cpp:68
QgsProperty
A store for object properties.
Definition: qgsproperty.h:230
QgsDataDefinedSizeLegend::AlignBottom
@ AlignBottom
Symbols are aligned to the bottom.
Definition: qgsdatadefinedsizelegend.h:68
QgsSizeScaleTransformer::clone
QgsSizeScaleTransformer * clone() const override
Returns a clone of the transformer.
Definition: qgspropertytransformer.cpp:314
QgsReadWriteContext
The class is used as a container of context for various read/write operations on other objects.
Definition: qgsreadwritecontext.h:34
qgspropertytransformer.h
qgstextrenderer.h
QgsMarkerSymbol::size
double size() const
Returns the estimated size for the whole symbol, which is the maximum size of all marker symbol layer...
Definition: qgsmarkersymbol.cpp:197
QgsDataDefinedSizeLegend::title
QString title() const
Returns title label for data-defined size legend.
Definition: qgsdatadefinedsizelegend.h:123
QgsDataDefinedSizeLegend::collapsedLegendImage
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...
Definition: qgsdatadefinedsizelegend.cpp:332
QgsRenderContext::setPainter
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
Definition: qgsrendercontext.h:512
qgssymbollayerutils.h
QgsDataDefinedSizeLegend
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
Definition: qgsdatadefinedsizelegend.h:42
QgsRenderContext
Contains information about the context of a rendering operation.
Definition: qgsrendercontext.h:59
QgsDataDefinedSizeLegend::QgsDataDefinedSizeLegend
QgsDataDefinedSizeLegend()
Constructor for QgsDataDefinedSizeLegend.
Definition: qgsdatadefinedsizelegend.cpp:28
QgsUnitTypes::RenderMillimeters
@ RenderMillimeters
Millimeters.
Definition: qgsunittypes.h:169
QgsProperty::propertyType
Type propertyType() const
Returns the property type.
Definition: qgsproperty.cpp:286
QgsRenderContext::scaleFactor
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
Definition: qgsrendercontext.h:266
QgsDataDefinedSizeLegend::setClasses
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.
Definition: qgsdatadefinedsizelegend.h:116
QgsProperty::transformer
const QgsPropertyTransformer * transformer() const
Returns the existing transformer used for manipulating the calculated values for the property,...
Definition: qgsproperty.cpp:871
QgsSymbolLayerUtils::decodeColor
static QColor decodeColor(const QString &str)
Definition: qgssymbollayerutils.cpp:69
QgsProperty::expressionString
QString expressionString() const
Returns the expression used for the property value.
Definition: qgsproperty.cpp:389
QgsMarkerSymbol::clone
QgsMarkerSymbol * clone() const override
Returns a deep copy of this symbol.
Definition: qgsmarkersymbol.cpp:523
QgsDataDefinedSizeLegend::AlignCenter
@ AlignCenter
Symbols are aligned to the center.
Definition: qgsdatadefinedsizelegend.h:67
QgsDataDefinedSizeLegend::SizeClass
Definition of one class for the legend.
Definition: qgsdatadefinedsizelegend.h:72
QgsDataDefinedSizeLegend::LegendCollapsed
@ LegendCollapsed
All classes are rendered within one legend node.
Definition: qgsdatadefinedsizelegend.h:61
QgsTextFormat
Container for all settings relating to text rendering.
Definition: qgstextformat.h:40
QgsLegendSymbolItem
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
Definition: qgslegendsymbolitem.h:36
QgsTextFormat::setColor
void setColor(const QColor &color)
Sets the color that text will be rendered in.
Definition: qgstextformat.cpp:302
QgsProperty::ExpressionBasedProperty
@ ExpressionBasedProperty
Expression based property (QgsExpressionBasedProperty)
Definition: qgsproperty.h:240
QgsDataDefinedSizeLegend::legendSymbolList
QgsLegendSymbolList legendSymbolList() const
Generates legend symbol items according to the configuration.
Definition: qgsdatadefinedsizelegend.cpp:122
QgsDataDefinedSizeLegend::setSizeScaleTransformer
void setSizeScaleTransformer(QgsSizeScaleTransformer *transformer SIP_TRANSFER)
Sets transformer for scaling of symbol sizes. Takes ownership of the object. Accepts nullptr to set n...
Definition: qgsdatadefinedsizelegend.cpp:88
QgsXmlUtils::readVariant
static QVariant readVariant(const QDomElement &element)
Read a QVariant from a QDomElement.
Definition: qgsxmlutils.cpp:251
QgsMarkerSymbol
A marker symbol type, for rendering Point and MultiPoint geometries.
Definition: qgsmarkersymbol.h:30
QgsSizeScaleTransformer::loadVariant
bool loadVariant(const QVariant &definition) override
Loads this transformer from a QVariantMap, wrapped in a QVariant.
Definition: qgspropertytransformer.cpp:341
QgsSizeScaleTransformer
QgsPropertyTransformer subclass for scaling a value into a size according to various scaling methods.
Definition: qgspropertytransformer.h:461
QgsLineSymbol
A line symbol type, for rendering LineString and MultiLineString geometries.
Definition: qgslinesymbol.h:29
QgsTextRenderer::drawText
static void drawText(const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, VAlignment vAlignment=AlignTop, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags())
Draws text within a rectangle using the specified settings.
Definition: qgstextrenderer.cpp:81
QgsSymbolLayerUtils::prettyBreaks
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...
Definition: qgssymbollayerutils.cpp:4580
QgsDataDefinedSizeLegend::LegendSeparated
@ LegendSeparated
Each class (size value) has a separate legend node.
Definition: qgsdatadefinedsizelegend.h:60
QgsDataDefinedSizeLegend::setTextColor
void setTextColor(const QColor &color)
Sets text color for rendering of labels - only valid for collapsed legend.
Definition: qgsdatadefinedsizelegend.h:136
QgsDataDefinedSizeLegend::operator=
QgsDataDefinedSizeLegend & operator=(const QgsDataDefinedSizeLegend &other)
Definition: qgsdatadefinedsizelegend.cpp:50
QgsTextFormat::fromQFont
static QgsTextFormat fromQFont(const QFont &font)
Returns a text format matching the settings from an input font.
Definition: qgstextformat.cpp:740
QgsScopedQPainterState
Scoped object for saving and restoring a QPainter object's state.
Definition: qgsrendercontext.h:1336
QgsDataDefinedSizeLegend::~QgsDataDefinedSizeLegend
~QgsDataDefinedSizeLegend()
QgsDataDefinedSizeLegend::setVerticalAlignment
void setVerticalAlignment(VerticalAlignment vAlign)
Sets vertical alignment of symbols - only valid for collapsed legend.
Definition: qgsdatadefinedsizelegend.h:126
QgsDataDefinedSizeLegend::lineSymbol
QgsLineSymbol * lineSymbol() const
Returns the line symbol that will be used to draw callout lines in legend.
Definition: qgsdatadefinedsizelegend.cpp:83
qgsxmlutils.h
QgsPropertyTransformer::maxValue
double maxValue() const
Returns the maximum value expected by the transformer.
Definition: qgspropertytransformer.h:263
QgsDataDefinedSizeLegend::updateFromSymbolAndProperty
void updateFromSymbolAndProperty(const QgsMarkerSymbol *symbol, const QgsProperty &ddSize)
Updates the list of classes, source symbol and title label from given symbol and property.
Definition: qgsdatadefinedsizelegend.cpp:99
QgsRenderContext::convertToPainterUnits
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
Definition: qgsrendercontext.cpp:367
QgsDataDefinedSizeLegend::setTitle
void setTitle(const QString &title)
Sets title label for data-defined size legend.
Definition: qgsdatadefinedsizelegend.h:121
QgsPropertyTransformer::minValue
double minValue() const
Returns the minimum value expected by the transformer.
Definition: qgspropertytransformer.h:248
QgsDataDefinedSizeLegend::sizeScaleTransformer
QgsSizeScaleTransformer * sizeScaleTransformer() const
Returns transformer for scaling of symbol sizes. Returns nullptr if no transformer is defined.
Definition: qgsdatadefinedsizelegend.cpp:93
QgsLegendSymbolItem::symbol
QgsSymbol * symbol() const
Returns associated symbol. May be nullptr.
Definition: qgslegendsymbolitem.h:56
qgslinesymbollayer.h
c
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
Definition: porting_processing.dox:1
QgsSymbolLayerList
QList< QgsSymbolLayer * > QgsSymbolLayerList
Definition: qgssymbol.h:27
qgsmarkersymbol.h
QgsMarkerSymbol::setSize
void setSize(double size) const
Sets the size for the whole symbol.
Definition: qgsmarkersymbol.cpp:153
QgsProperty::field
QString field() const
Returns the current field name the property references.
Definition: qgsproperty.cpp:357
qgsproperty.h
QgsDataDefinedSizeLegend::symbol
QgsMarkerSymbol * symbol() const
Returns marker symbol that will be used to draw markers in legend.
Definition: qgsdatadefinedsizelegend.cpp:73
QgsDataDefinedSizeLegend::writeXml
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const
Writes configuration to the given XML element.
Definition: qgsdatadefinedsizelegend.cpp:423
QgsDataDefinedSizeLegend::classes
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.
Definition: qgsdatadefinedsizelegend.h:118
QgsDataDefinedSizeLegend::readXml
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...
Definition: qgsdatadefinedsizelegend.cpp:364
QgsDataDefinedSizeLegend::setLegendType
void setLegendType(LegendType type)
Sets how the legend should be rendered.
Definition: qgsdatadefinedsizelegend.h:84
qgsdatadefinedsizelegend.h
qgstextformat.h
QgsRenderContext::painter
QPainter * painter()
Returns the destination QPainter for the render operation.
Definition: qgsrendercontext.h:112
QgsDataDefinedSizeLegend::drawCollapsedLegend
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...
Definition: qgsdatadefinedsizelegend.cpp:164
QgsTextRenderer::convertQtHAlignment
static HAlignment convertQtHAlignment(Qt::Alignment alignment)
Converts a Qt horizontal alignment flag to a QgsTextRenderer::HAlignment value.
Definition: qgstextrenderer.cpp:46
QgsLegendSymbolList
QList< QgsLegendSymbolItem > QgsLegendSymbolList
Definition: qgslegendsymbolitem.h:144
QgsXmlUtils::writeVariant
static QDomElement writeVariant(const QVariant &value, QDomDocument &doc)
Write a QVariant to a QDomElement.
Definition: qgsxmlutils.cpp:106
QgsDataDefinedSizeLegend::setLineSymbol
void setLineSymbol(QgsLineSymbol *symbol SIP_TRANSFER)
Sets the line symbol that will be used to draw callout lines in legend.
Definition: qgsdatadefinedsizelegend.cpp:78
QgsSymbolLayerUtils::saveSymbol
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
Definition: qgssymbollayerutils.cpp:1397
QgsDataDefinedSizeLegend::setTextAlignment
void setTextAlignment(Qt::AlignmentFlag flag)
Sets horizontal text alignment for rendering of labels - only valid for collapsed legend.
Definition: qgsdatadefinedsizelegend.h:141
qgslinesymbol.h
QgsDataDefinedSizeLegend::setFont
void setFont(const QFont &font)
Sets font used for rendering of labels - only valid for collapsed legend.
Definition: qgsdatadefinedsizelegend.h:131