35 , mEmbeddedInParent( false )
46 return Qt::ItemIsEnabled;
65 double itemHeight = std::max( static_cast< double >( settings.
symbolSize().height() ), textHeight );
76 QIcon symbolIcon =
data( Qt::DecorationRole ).value<QIcon>();
77 if ( symbolIcon.isNull() )
89 QSizeF labelSize( 0, 0 );
97 labelSize.rheight() = lines.count() * textHeight + ( lines.count() - 1 ) * ( settings.
lineSpacing() + textDescent );
99 double labelX = 0.0, labelY = 0.0;
104 labelX = ctx->
point.x() + std::max( static_cast< double >( symbolSize.width() ), ctx->
labelXOffset );
105 labelY = ctx->
point.y();
108 if ( labelSize.height() < symbolSize.height() )
109 labelY += symbolSize.height() / 2 - labelSize.height() / 2;
111 labelY += textHeight;
114 for ( QStringList::Iterator itemPart = lines.begin(); itemPart != lines.end(); ++itemPart )
116 labelSize.rwidth() = std::max( settings.
textWidthMillimeters( symbolLabelFont, *itemPart ), double( labelSize.width() ) );
120 settings.
drawText( ctx->
painter, labelX, labelY, *itemPart, symbolLabelFont );
121 if ( itemPart != ( lines.end() - 1 ) )
122 labelY += textDescent + settings.
lineSpacing() + textHeight;
135 , mSymbolUsesMapUnits( false )
136 , mIconSize( 16, 16 )
140 connect( nodeLayer, &QObject::destroyed,
this, [ = ]() {
mLayerNode =
nullptr; } );
149 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
151 return Qt::ItemIsEnabled;
163 QSize minSz( 16, 16 );
182 minSz.setWidth( mItem.
level() * INDENT_SIZE + minSz.width() );
198 if ( !vlayer || !vlayer->
renderer() )
233 context->setScaleFactor( dpi / 25.4 );
234 context->setRendererScale( scale );
236 return context.release();
239 void QgsSymbolLegendNode::checkAll(
bool state )
242 if ( !vlayer || !vlayer->
renderer() )
257 if ( role == Qt::DisplayRole )
261 else if ( role == Qt::EditRole )
265 else if ( role == Qt::DecorationRole )
267 if ( mPixmap.isNull() || mPixmap.size() != mIconSize )
277 pix = QPixmap( mIconSize );
278 pix.fill( Qt::transparent );
286 QPixmap pix2( pix.width() + mItem.
level() * INDENT_SIZE, pix.height() );
287 pix2.fill( Qt::transparent );
289 p.drawPixmap( mItem.
level() * INDENT_SIZE, 0, pix );
296 else if ( role == Qt::CheckStateRole )
302 if ( !vlayer || !vlayer->
renderer() )
321 if ( role != Qt::CheckStateRole )
328 if ( !vlayer || !vlayer->
renderer() )
359 double height = settings.
symbolSize().height();
363 double widthOffset = 0;
364 double heightOffset = 0;
366 if (
QgsMarkerSymbol *markerSymbol = dynamic_cast<QgsMarkerSymbol *>( s ) )
374 widthOffset = ( settings.
symbolSize().width() - width ) / 2.0;
376 if ( height < settings.
symbolSize().height() )
378 heightOffset = ( settings.
symbolSize().height() - height ) / 2.0;
384 double currentXPosition = ctx->
point.x();
385 double currentYCoord = ctx->
point.y() + ( itemHeight - settings.
symbolSize().height() ) / 2;
393 opacity = ( 255 * vectorLayer->opacity() );
396 p->setRenderHint( QPainter::Antialiasing );
397 p->translate( currentXPosition + widthOffset, currentYCoord + heightOffset );
398 p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
403 QSize tempImageSize( width * dotsPerMM, height * dotsPerMM );
404 QImage tempImage = QImage( tempImageSize, QImage::Format_ARGB32 );
405 tempImage.fill( Qt::transparent );
406 QPainter imagePainter( &tempImage );
411 imagePainter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
412 imagePainter.fillRect( tempImage.rect(), QColor( 0, 0, 0, opacity ) );
415 p->drawImage( 0, 0, tempImage );
419 s->
drawPreviewIcon( p, QSize( width * dotsPerMM, height * dotsPerMM ), &context );
424 return QSizeF( std::max( width + 2 * widthOffset, static_cast< double >( settings.
symbolSize().width() ) ),
425 std::max( height + 2 * heightOffset, static_cast< double >( settings.
symbolSize().height() ) ) );
438 if ( mSymbolUsesMapUnits )
446 void QgsSymbolLegendNode::updateLabel()
461 if ( showFeatureCount && vl && vl->
featureCount() >= 0 )
462 mLabel += QStringLiteral(
" [%1]" ).arg( vl->
featureCount() );
467 if ( showFeatureCount && vl )
470 mLabel += QStringLiteral(
" [%1]" ).arg( count != -1 ? QLocale().toString( count ) : tr(
"N/A" ) );
492 if ( role == Qt::DisplayRole || role == Qt::EditRole )
494 else if ( role == Qt::DecorationRole )
513 if ( role == Qt::DecorationRole )
515 return QPixmap::fromImage( mImage );
517 else if ( role == Qt::SizeHintRole )
519 return mImage.size();
526 Q_UNUSED( itemHeight );
531 mImage, QRectF( 0, 0, mImage.width(), mImage.height() ) );
547 if ( role == Qt::DecorationRole )
549 QSize iconSize( 16, 16 );
550 QPixmap pix( iconSize );
554 else if ( role == Qt::DisplayRole || role == Qt::EditRole )
565 QColor itemColor = mColor;
569 itemColor.setAlpha( rasterRenderer->opacity() * 255.0 );
571 ctx->
painter->setBrush( itemColor );
578 pen.setJoinStyle( Qt::MiterJoin );
583 ctx->
painter->setPen( Qt::NoPen );
600 QImage QgsWmsLegendNode::getLegendGraphic()
const 602 if ( ! mValid && ! mFetcher )
609 if ( ! mod )
return mImage;
614 Q_ASSERT( ! mFetcher );
633 if ( role == Qt::DecorationRole )
635 return QPixmap::fromImage( getLegendGraphic() );
637 else if ( role == Qt::SizeHintRole )
639 return getLegendGraphic().size();
646 Q_UNUSED( itemHeight );
652 QRectF( QPointF( 0, 0 ), mImage.size() ) );
658 QImage QgsWmsLegendNode::renderMessage(
const QString &msg )
const 660 const int fontHeight = 10;
661 const int margin = fontHeight / 2;
662 const int nlines = 1;
664 const int w = 512, h = fontHeight * nlines + margin * ( nlines + 1 );
665 QImage image( w, h, QImage::Format_ARGB32_Premultiplied );
667 painter.begin( &image );
668 painter.setPen( QColor( 255, 0, 0 ) );
669 painter.setFont( QFont( QStringLiteral(
"Chicago" ), fontHeight ) );
670 painter.fillRect( 0, 0, w, h, QColor( 255, 255, 255 ) );
671 painter.drawText( 0, margin + fontHeight, msg );
678 void QgsWmsLegendNode::getLegendGraphicProgress( qint64 cur, qint64 tot )
680 QString msg = QStringLiteral(
"Downloading... %1/%2" ).arg( cur ).arg( tot );
682 mImage = renderMessage( msg );
686 void QgsWmsLegendNode::getLegendGraphicErrored(
const QString &msg )
688 if ( ! mFetcher )
return;
690 mImage = renderMessage( msg );
702 void QgsWmsLegendNode::getLegendGraphicFinished(
const QImage &image )
704 if ( ! mFetcher )
return;
707 if ( ! image.isNull() )
709 if ( image != mImage )
743 if ( role == Qt::DecorationRole )
746 return QPixmap::fromImage( mImage );
748 else if ( role == Qt::SizeHintRole )
751 return mImage.size();
769 ctx->
painter->setRenderHint( QPainter::Antialiasing );
792 void QgsDataDefinedSizeLegendNode::cacheImage()
const 794 if ( mImage.isNull() )
800 context->setScaleFactor( 96 / 25.4 );
void setForceVectorOutput(bool force)
void drawText(QPainter *p, double x, double y, const QString &text, const QFont &font) const
Draws Text.
virtual QgsLegendSymbolList legendSymbolItems() const
Returns a list of symbology items for the legend.
static QPixmap symbolPreviewPixmap(QgsSymbol *symbol, QSize size, int padding=0, QgsRenderContext *customContext=nullptr)
Returns a pixmap preview for a color ramp.
QgsDataDefinedSizeLegendNode(QgsLayerTreeLayer *nodeLayer, const QgsDataDefinedSizeLegend &settings, QObject *parent=nullptr)
Construct the node using QgsDataDefinedSizeLegend as definition of the node's appearance.
~QgsDataDefinedSizeLegendNode() override
virtual Qt::ItemFlags flags() const
Return item flags associated with the item. Default implementation returns Qt::ItemIsEnabled.
double mapScale() const
Returns the legend map scale.
QgsRenderContext * createTemporaryRenderContext() const
Returns a temporary context or null if legendMapViewData are not valid.
QList< QgsLegendSymbolItem > QgsLegendSymbolList
QgsSymbol * symbol() const
Return associated symbol. May be null.
QString ruleKey() const
Return unique identifier of the rule for identification of the item within renderer.
bool useAdvancedEffects() const
QVariant data(int role) const override
Return data associated with the item. Must be implemented in derived class.
virtual QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const
Draws symbol on the left side of the item.
void setFont(const QFont &font)
Sets font used for rendering of labels - only valid for collapsed legend.
QgsImageLegendNode(QgsLayerTreeLayer *nodeLayer, const QImage &img, QObject *parent=nullptr)
Constructor for QgsImageLegendNode.
virtual bool setData(const QVariant &value, int role)
Set some data associated with the item. Default implementation does nothing and returns false...
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
QgsSymbolLegendNode(QgsLayerTreeLayer *nodeLayer, const QgsLegendSymbolItem &item, QObject *parent=nullptr)
Constructor for QgsSymbolLegendNode.
QVariant data(int role) const override
Return data associated with the item. Must be implemented in derived class.
bool testFlag(Flag f) const
Check whether a flag is enabled.
QStringList splitStringForWrapping(const QString &stringToSplt) const
Splits a string using the wrap char taking into account handling empty wrap char which means no wrapp...
void setRendererScale(double scale)
Sets the renderer map scale.
QFont font() const
The font for this style.
virtual QgsImageFetcher * getLegendGraphicFetcher(const QgsMapSettings *mapSettings)
Get an image downloader for the raster legend.
void invalidateMapBasedData() override
Notification from model that information from associated map view has changed.
void invalidateMapBasedData() override
Notification from model that information from associated map view has changed.
QgsLayerTreeLayer * layerNode() const
Return pointer to the parent layer node.
QVariant data(int role) const override
Return data associated with the item. Must be implemented in derived class.
bool drawRasterStroke() const
Returns whether a stroke will be drawn around raster symbol items.
double textWidthMillimeters(const QFont &font, const QString &text) const
Returns the font width in millimeters (considers upscaling and downscaling with FONT_WORKAROUND_SCALE...
QgsLayerTreeModelLegendNode(QgsLayerTreeLayer *nodeL, QObject *parent=nullptr)
Construct the node with pointer to its parent layer node.
QString label() const
Return text label.
bool qgsDoubleNear(double a, double b, double epsilon=4 *DBL_EPSILON)
Compare two doubles (but allow some difference)
QPainter * painter
Painter.
QgsWmsLegendNode(QgsLayerTreeLayer *nodeLayer, QObject *parent=nullptr)
Constructor for QgsWmsLegendNode.
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
Draws symbol on the left side of the item.
QColor rasterStrokeColor() const
Returns the stroke color for the stroke drawn around raster symbol items.
The QgsMapSettings class contains configuration for rendering of the map.
QgsUnitTypes::RenderUnit outputUnit() const
Returns the units to use for sizes and widths within the symbol.
QSize minimumIconSize() const
Calculates the minimum icon size to prevent cropping.
Perform transforms between map coordinates and device coordinates.
The QgsLayerTreeModel class is model implementation for Qt item views framework.
QSizeF wmsLegendSize() const
Rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2...
QgsLegendStyle style(QgsLegendStyle::Style s) const
Returns style.
QgsRasterDataProvider * dataProvider() override
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...
QString name() const override
Returns the layer's name.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
Draws symbol on the left side of the item.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted...
Qt::ItemFlags flags() const override
Return item flags associated with the item. Default implementation returns Qt::ItemIsEnabled.
Rule key of the node (QString)
void setSymbol(QgsSymbol *s)
Set symbol of the item. Takes ownership of symbol.
QgsRasterSymbolLegendNode(QgsLayerTreeLayer *nodeLayer, const QColor &color, const QString &label, QObject *parent=nullptr)
Constructor for QgsRasterSymbolLegendNode.
long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
void checkAllItems()
Checks all items belonging to the same layer as this node.
void error(const QString &msg)
Emitted when an error occurs.
QgsLayerTreeLayer * mLayerNode
double rasterStrokeWidth() const
Returns the stroke width (in millimeters) for the stroke drawn around raster symbol items...
QgsLayerTreeModel * model() const
Return pointer to model owning this legend node.
The QgsLegendSettings class stores the appearance and layout settings for legend drawing with QgsLege...
QVariant customProperty(const QString &key, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer. Properties are stored in a map and saved in project file...
ItemMetrics draw(const QgsLegendSettings &settings, ItemContext *ctx) override
Entry point called from QgsLegendRenderer to do the rendering.
void drawPreviewIcon(QPainter *painter, QSize size, QgsRenderContext *customContext=nullptr)
Draw icon of the symbol that occupyies area given by size using the painter.
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
virtual bool legendSymbolItemChecked(const QString &key)
items of symbology items in legend is checked
QgsFeatureRenderer * renderer()
Return renderer.
void dataChanged()
Emitted on internal data change so the layer tree model can forward the signal to views...
void symbolFeatureCountMapChanged()
Emitted when the feature count for symbols on this layer has been recalculated.
virtual void checkLegendSymbolItem(const QString &key, bool state=true)
item in symbology was checked
virtual void setLegendSymbolItem(const QString &key, QgsSymbol *symbol)
Sets the symbol to be used for a legend symbol item.
bool isCheckable() const
Return whether the item is user-checkable - whether renderer supports enabling/disabling it...
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
Draws symbol on the left side of the item.
QSizeF symbolSize() const
double fontHeightCharacterMM(const QFont &font, QChar c) const
Returns the font height of a character in millimeters.
virtual ItemMetrics draw(const QgsLegendSettings &settings, ItemContext *ctx)
Entry point called from QgsLegendRenderer to do the rendering.
void setEmbeddedInParent(bool embedded) override
QgsMapLayer * layer() const
void setSymbol(QgsSymbol *symbol)
Sets the symbol to be used by the legend node.
const QgsSymbol * symbol() const
Returns the symbol used by the legend node.
QgsSimpleLegendNode(QgsLayerTreeLayer *nodeLayer, const QString &label, const QIcon &icon=QIcon(), QObject *parent=nullptr, const QString &key=QString())
Constructor for QgsSimpleLegendNode.
virtual void setEmbeddedInParent(bool embedded)
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
Contains information about the context of a rendering operation.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
Draws symbol on the left side of the item.
QPointF point
Top-left corner of the legend item.
bool setData(const QVariant &value, int role) override
Set some data associated with the item. Default implementation does nothing and returns false...
void setMapToPixel(const QgsMapToPixel &mtp)
virtual QVariant data(int role) const =0
Return data associated with the item. Must be implemented in derived class.
void legendMapViewData(double *mapUnitsPerPixel, int *dpi, double *scale) const
Get hints about map view - to be used in legend nodes.
static QRect nonTransparentImageRect(const QImage &image, QSize minSize=QSize(), bool center=false)
Calculates the non-transparent region of an image.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...
QVariant data(int role) const override
Return data associated with the item. Must be implemented in derived class.
void uncheckAllItems()
Unchecks all items belonging to the same layer as this node.
void setTextColor(const QColor &color)
Sets text color for rendering of labels - only valid for collapsed legend.
virtual QSizeF drawSymbolText(const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize) const
Draws label on the right side of the item.
QString parentRuleKey() const
Key of the parent legend node.
QVariant data(int role) const override
Return data associated with the item. Must be implemented in derived class.
void drawCollapsedLegend(QgsRenderContext &context, QSize *outputSize SIP_OUT=nullptr, int *labelXOffset SIP_OUT=nullptr) const
Draw the legend if using LegendOneNodeForAll and optionally output size of the legend and x offset of...
double lineSpacing() const
For legends that support it, will show them in a tree instead of a list (needs also ShowLegend)...
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
Represents a vector layer which manages a vector based data sets.
double labelXOffset
offset from the left side where label should start
void finish(const QImage &legend)
Emitted when the download completes.
Object that keeps configuration of appearance of marker symbol's data-defined size in legend...
QVariant data(int role) const override
Return data associated with the item. Must be implemented in derived class.
int level() const
Indentation level that tells how deep the item is in a hierarchy of items. For flat lists level is 0...
double fontDescentMillimeters(const QFont &font) const
Returns the font descent in Millimeters (considers upscaling and downscaling with FONT_WORKAROUND_SCA...
double mmPerMapUnit() const
Raster renderer pipe that applies colors to a raster.
void progress(qint64 received, qint64 total)
Emitted to report progress.
Layer tree node points to a map layer.
Base class for raster data providers.