49 , mEmbeddedInParent( false )
55 return qobject_cast<QgsLayerTreeModel *>( parent() );
60 return Qt::ItemIsEnabled;
97 std::optional< QgsScopedRenderContextScaleToPixels > scaleToPx( *ctx->
context );
111 const double itemHeight = std::max(
static_cast< double >( ctx && ctx->
patchSize.height() > 0 ? ctx->
patchSize.height() : settings.
symbolSize().height() ), textHeight );
125 const QString text =
data( Qt::DisplayRole ).toString();
126 json[ QStringLiteral(
"title" ) ] = text;
132 const QIcon symbolIcon =
data( Qt::DecorationRole ).value<QIcon>();
133 if ( symbolIcon.isNull() )
140 size.setWidth( ctx->
patchSize.width( ) );
142 size.setHeight( ctx->
patchSize.height( ) );
149 const int width =
static_cast<int>( size.width() * scaleFactor );
150 const int height =
static_cast<int>( size.height() * scaleFactor );
151 const int y =
static_cast<int>( ( ctx->
top + ( itemHeight - size.height() ) / 2 ) * scaleFactor );
158 x =
static_cast<int>( ctx->
columnLeft * scaleFactor );
161 x =
static_cast<int>( ( ctx->
columnRight - size.width() ) * scaleFactor );
164 symbolIcon.paint( ctx->
painter, x, y, width, height );
171 const QIcon icon =
data( Qt::DecorationRole ).value<QIcon>();
173 return QJsonObject();
175 const QImage image( icon.pixmap( settings.
symbolSize().width(), settings.
symbolSize().height() ).toImage() );
176 QByteArray byteArray;
177 QBuffer buffer( &byteArray );
178 image.save( &buffer,
"PNG" );
179 const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
182 json[ QStringLiteral(
"icon" ) ] = base64;
189 std::unique_ptr< QgsRenderContext > tempContext;
194 context = tempContext.get();
200 std::optional< QgsTextDocument > tempDocument;
206 document = &tempDocument.value();
209 std::optional< QgsTextDocumentMetrics > tempMetrics;
214 metrics = &tempMetrics.value();
221 const QSizeF labelSizeMM( documentSize / dotsPerMM );
223 double labelXMin = 0.0;
224 double labelXMax = 0.0;
225 double labelYMM = 0.0;
226 if ( ctx && context->
painter() )
252 if ( labelSizeMM.height() < symbolSizeMM.height() )
253 labelYMM += ( symbolSizeMM.height() - labelSizeMM.height() ) / 2;
263 ( labelXMax - labelXMin )* dotsPerMM,
264 std::max( symbolSizeMM.height(), labelSizeMM.height() ) * dotsPerMM ),
286 if ( !vlayer->renderer() )
290 for (
const auto &item : symbolList )
292 vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), ! vlayer->renderer()->legendSymbolItemChecked( item.ruleKey() ) );
296 vlayer->emitStyleChanged();
297 vlayer->triggerRepaint();
301 if ( !pclayer->renderer() )
304 const QStringList ruleKeys = pclayer->renderer()->legendRuleKeys();
305 for (
const QString &rule : ruleKeys )
307 pclayer->renderer()->checkLegendItem( rule, !pclayer->renderer()->legendItemChecked( rule ) );
311 pclayer->emitStyleChanged();
312 pclayer->triggerRepaint();
324 , mSymbolUsesMapUnits( false )
334 MINIMUM_SIZE = settings.
value(
"/qgis/legendsymbolMinimumSize", 0.5 ).toDouble();
335 MAXIMUM_SIZE = settings.
value(
"/qgis/legendsymbolMaximumSize", 20.0 ).toDouble();
342 connect( nodeLayer, &QObject::destroyed,
this, [
this]() {
mLayerNode =
nullptr; } );
355 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable;
357 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
375 int maxSize = largeIconSize;
383 if ( !ok && context )
398 context,
false,
nullptr,
nullptr, targetScreen ).toImage(),
400 true ).size() / targetScreen.devicePixelRatio();
403 if ( !mTextOnSymbolLabel.isEmpty() && context )
407 int wInt = ceil( w ), hInt = ceil( h );
408 if ( wInt > minSz.width() ) minSz.setWidth( wInt );
409 if ( hInt > minSz.height() ) minSz.setHeight( hInt );
453 return mCustomSymbol.get();
458 mCustomSymbol.reset(
symbol );
466 std::unique_ptr< QgsSymbol > s(
symbol );
468 if ( !vlayer || !vlayer->
renderer() )
485 if (
auto *lModel =
model() )
486 lModel->legendMapViewData( &mupp, &dpi, &scale );
492 std::unique_ptr<QgsRenderContext> context = std::make_unique<QgsRenderContext>( );
493 context->setScaleFactor( dpi / 25.4 );
494 context->setRendererScale( scale );
499 if (
model() && !
model()->targetScreenProperties().isEmpty() )
506 context->setExpressionContext( expContext );
508 return context.release();
511void QgsLayerTreeModelLegendNode::checkAll(
bool state )
515 if ( !vlayer->renderer() )
519 for (
const auto &item : symbolList )
521 vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), state );
525 vlayer->emitStyleChanged();
526 vlayer->triggerRepaint();
530 if ( !pclayer->renderer() )
533 const QStringList ruleKeys = pclayer->renderer()->legendRuleKeys();
534 for (
const QString &rule : ruleKeys )
536 pclayer->renderer()->checkLegendItem( rule, state );
540 pclayer->emitStyleChanged();
541 pclayer->triggerRepaint();
547 if ( role == Qt::DisplayRole )
551 else if ( role == Qt::EditRole )
555 else if ( role == Qt::DecorationRole )
557 if ( mPixmap.isNull() )
572 if ( !mTextOnSymbolLabel.isEmpty() && context )
574 QPainter painter( &mPixmap );
575 painter.setRenderHint( QPainter::Antialiasing );
576 context->setPainter( &painter );
577 bool isNullSize =
false;
578 const QFontMetricsF fm( mTextOnSymbolTextFormat.
scaledFont( *context, 1.0, &isNullSize ) );
581 const qreal yBaselineVCenter = ( mIconSize.height() + fm.ascent() - fm.descent() ) / 2;
583 QStringList() << mTextOnSymbolLabel, *context, mTextOnSymbolTextFormat );
590 mPixmap.fill( Qt::transparent );
595 else if ( role == Qt::CheckStateRole )
602 if ( !vlayer->renderer() )
605 return vlayer->renderer()->legendSymbolItemChecked( mItem.
ruleKey() ) ? Qt::Checked : Qt::Unchecked;
626 if ( role != Qt::CheckStateRole )
633 if ( !vlayer || !vlayer->
renderer() )
639 project->setDirty(
true );
659 std::unique_ptr< QgsRenderContext > tempRenderContext;
665 tempRenderContext = std::make_unique< QgsRenderContext >();
668 tempRenderContext->setScaleFactor( settings.
dpi() / 25.4 );
669 tempRenderContext->setRendererScale( settings.
mapScale() );
673 tempRenderContext->setForceVectorOutput(
true );
674 tempRenderContext->setPainter( ctx ? ctx->
painter : nullptr );
679 tempRenderContext->setExpressionContext( expContext );
680 context = tempRenderContext.get();
686 double height = desiredHeight;
687 double width = desiredWidth;
690 double widthOffset = 0;
691 double heightOffset = 0;
698 const double size = markerSymbol->size( *context ) / context->
scaleFactor();
706 bool restrictedSizeSymbolOK;
708 if ( minMaxSizeSymbol )
710 s = minMaxSizeSymbol.get();
715 if ( width < desiredWidth )
717 widthOffset = ( desiredWidth - width ) / 2.0;
719 if ( height < desiredHeight )
721 heightOffset = ( desiredHeight - height ) / 2.0;
726 const double currentYCoord = ctx->
top + ( itemHeight - desiredHeight ) / 2;
734 opacity =
static_cast<int >( std::round( 255 * layer->opacity() ) );
743 p->translate( ctx->
columnLeft + widthOffset, currentYCoord + heightOffset );
746 p->translate( ctx->
columnRight - widthOffset - width, currentYCoord + heightOffset );
750 p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
756 if ( opacity != 255 && useAdvancedEffects )
763 const QSize symbolSize(
static_cast< int >( std::round( width * dotsPerMM ) ),
static_cast<int >( std::round( height * dotsPerMM ) ) );
764 const QSize tempImageSize( symbolSize.width() + maxBleed * 2, symbolSize.height() + maxBleed * 2 );
765 QImage tempImage = QImage( tempImageSize, QImage::Format_ARGB32 );
766 tempImage.fill( Qt::transparent );
767 QPainter imagePainter( &tempImage );
771 imagePainter.translate( maxBleed, maxBleed );
773 imagePainter.translate( -maxBleed, -maxBleed );
776 imagePainter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
777 imagePainter.fillRect( tempImage.rect(), QColor( 0, 0, 0, opacity ) );
780 p->drawImage( -maxBleed, -maxBleed, tempImage );
782 else if ( !restrictedSizeSymbolOK )
787 const QSize symbolSize(
static_cast< int >( std::round( width * dotsPerMM ) ),
static_cast<int >( std::round( height * dotsPerMM ) ) );
788 const QSize maxSize( symbolSize.width() + maxBleed * 2, symbolSize.height() + maxBleed * 2 );
790 p->setClipRect( -maxBleed, -maxBleed, maxSize.width(), maxSize.height(), Qt::IntersectClip );
796 s->
drawPreviewIcon( p, QSize(
static_cast< int >( std::round( width * dotsPerMM ) ),
static_cast< int >( std::round( height * dotsPerMM ) ) ), context,
false,
nullptr, &
patchShape, ctx->
screenProperties );
799 if ( !mTextOnSymbolLabel.isEmpty() )
801 bool isNullSize =
false;
802 const QFontMetricsF fm( mTextOnSymbolTextFormat.
scaledFont( *context, 1.0, &isNullSize ) );
805 const qreal yBaselineVCenter = ( height * dotsPerMM + fm.ascent() - fm.descent() ) / 2;
807 QStringList() << mTextOnSymbolLabel, *context, mTextOnSymbolTextFormat );
812 return QSizeF( std::max( width + 2 * widthOffset,
static_cast< double >( desiredWidth ) ),
813 std::max( height + 2 * heightOffset,
static_cast< double >( desiredHeight ) ) );
821 json[ QStringLiteral(
"scaleMaxDenom" ) ] = mItem.
scaleMaxDenom();
825 json[ QStringLiteral(
"scaleMinDenom" ) ] = mItem.
scaleMinDenom();
829 const QgsSymbol *s = mCustomSymbol ? mCustomSymbol.get() : mItem.
symbol();
854 QImage img( pix.toImage().convertToFormat( QImage::Format_ARGB32_Premultiplied ) );
858 opacity = ( 255 * layer->opacity() );
860 if ( opacity != 255 )
863 painter.begin( &img );
864 painter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
865 painter.fillRect( pix.rect(), QColor( 0, 0, 0, opacity ) );
869 QByteArray byteArray;
870 QBuffer buffer( &byteArray );
871 img.save( &buffer,
"PNG" );
872 const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
874 json[ QStringLiteral(
"icon" ) ] = base64;
887 if ( mSymbolUsesMapUnits )
896 if ( mIconSize == sz )
904void QgsSymbolLegendNode::updateLabel()
916 if ( showFeatureCount && vl )
922 mLabel += QStringLiteral(
" [%1%2]" ).arg(
923 estimatedCount ? QStringLiteral(
"≈" ) : QString(),
924 count != -1 ? QLocale().toString( count ) : tr(
"N/A" ) );
944 if ( label.isEmpty() )
949 else if ( symLabel.contains(
"[%" ) )
958 else if ( label.contains(
"[%" ) )
993 if ( role == Qt::DisplayRole || role == Qt::EditRole )
995 else if ( role == Qt::DecorationRole )
1016 if ( role == Qt::DecorationRole )
1018 return QPixmap::fromImage( mImage );
1020 else if ( role == Qt::SizeHintRole )
1022 return mImage.size();
1033 Q_UNUSED( itemHeight )
1039 const double imgWidth = settings.
wmsLegendSize().width() * scaleFactor;
1040 const double imgHeight = settings.
wmsLegendSize().height() * scaleFactor;
1042 const QImage scaledImg = mImage.scaled( QSizeF( imgWidth, imgHeight ).toSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation );
1047 ctx->
painter->drawImage( QPointF( ctx->
columnLeft * scaleFactor, ctx->
top * scaleFactor ), scaledImg );
1050 case Qt::AlignRight:
1051 ctx->
painter->drawImage( QPointF( ctx->
columnRight * scaleFactor - imgWidth, ctx->
top * scaleFactor ), scaledImg );
1060 QByteArray byteArray;
1061 QBuffer buffer( &byteArray );
1062 mImage.save( &buffer,
"PNG" );
1063 const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
1066 json[ QStringLiteral(
"icon" ) ] = base64;
1076 , mCheckable( isCheckable )
1077 , mRuleKey( ruleKey )
1078 , mParentRuleKey( parentRuleKey )
1085 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable;
1087 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
1094 case Qt::DecorationRole:
1097 QPixmap pix( iconSize, iconSize );
1099 return QIcon( pix );
1102 case Qt::DisplayRole:
1113 return mParentRuleKey;
1115 case Qt::CheckStateRole:
1122 if ( !pclayer->renderer() )
1125 return pclayer->renderer()->legendItemChecked( mRuleKey ) ? Qt::Checked : Qt::Unchecked;
1138 if ( role != Qt::CheckStateRole )
1146 if ( !pclayer->renderer() )
1149 pclayer->renderer()->checkLegendItem( mRuleKey, value == Qt::Checked );
1152 pclayer->emitStyleChanged();
1154 pclayer->triggerRepaint();
1155 if ( pclayer->sync3DRendererTo2DRenderer() )
1156 pclayer->convertRenderer3DFromRenderer2D();
1175 if ( ctx->
patchSize.width() < size.width() )
1176 offsetX = ( size.width() - ctx->
patchSize.width() ) / 2.0;
1177 size.setWidth( ctx->
patchSize.width() );
1181 size.setHeight( ctx->
patchSize.height() );
1187 QColor itemColor = mColor;
1191 itemColor.setAlpha( rasterRenderer->opacity() * 255.0 );
1193 ctx->
painter->setBrush( itemColor );
1200 pen.setJoinStyle( Qt::MiterJoin );
1205 ctx->
painter->setPen( Qt::NoPen );
1212 ctx->
painter->drawRect( QRectF( ctx->
columnLeft + offsetX, ctx->
top + ( itemHeight - size.height() ) / 2,
1213 size.width(), size.height() ) );
1216 case Qt::AlignRight:
1217 ctx->
painter->drawRect( QRectF( ctx->
columnRight - size.width() - offsetX, ctx->
top + ( itemHeight - size.height() ) / 2,
1218 size.width(), size.height() ) );
1227 QImage img = QImage( settings.
symbolSize().toSize(), QImage::Format_ARGB32 );
1228 img.fill( Qt::transparent );
1230 QPainter painter( &img );
1231 painter.setRenderHint( QPainter::Antialiasing );
1233 QColor itemColor = mColor;
1237 itemColor.setAlpha( rasterRenderer->opacity() * 255.0 );
1239 painter.setBrush( itemColor );
1246 pen.setJoinStyle( Qt::MiterJoin );
1247 painter.setPen( pen );
1251 painter.setPen( Qt::NoPen );
1254 painter.drawRect( QRectF( 0, 0, settings.
symbolSize().width(), settings.
symbolSize().height() ) );
1256 QByteArray byteArray;
1257 QBuffer buffer( &byteArray );
1258 img.save( &buffer,
"PNG" );
1259 const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
1262 json[ QStringLiteral(
"icon" ) ] = base64;
1276QImage QgsWmsLegendNode::getLegendGraphic(
bool synchronous )
const
1278 if ( ! mValid && ! mFetcher )
1285 if ( layer && layer->
isValid() )
1296 Q_ASSERT( ! mFetcher );
1308 connect( mFetcher.get(), &QObject::destroyed, &loop, &QEventLoop::quit );
1315 QgsDebugError( QStringLiteral(
"Failed to download legend graphics: layer is not valid." ) );
1324 if ( role == Qt::DecorationRole )
1326 return QPixmap::fromImage( getLegendGraphic() );
1328 else if ( role == Qt::SizeHintRole )
1330 return getLegendGraphic().size();
1341 Q_UNUSED( itemHeight )
1345 double px2mm = 1000. / image.dotsPerMeterX();
1346 double mmWidth = image.width() * px2mm;
1347 double mmHeight = image.height() * px2mm;
1349 QSize targetSize = QSize( mmWidth, mmHeight );
1352 double targetHeight = mmHeight * settings.
wmsLegendSize().width() / mmWidth;
1353 targetSize = QSize( settings.
wmsLegendSize().width(), targetHeight );
1357 double targetWidth = mmWidth * settings.
wmsLegendSize().height() / mmHeight;
1358 targetSize = QSize( targetWidth, settings.
wmsLegendSize().height() );
1363 QImage smoothImage = image.scaled( targetSize / px2mm, Qt::KeepAspectRatio, Qt::SmoothTransformation );
1372 targetSize.height() ),
1374 QRectF( QPointF( 0, 0 ), smoothImage.size() ) );
1377 case Qt::AlignRight:
1381 targetSize.height() ),
1383 QRectF( QPointF( 0, 0 ), smoothImage.size() ) );
1392 QByteArray byteArray;
1393 QBuffer buffer( &byteArray );
1394 mImage.save( &buffer,
"PNG" );
1395 const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
1398 json[ QStringLiteral(
"icon" ) ] = base64;
1402QImage QgsWmsLegendNode::renderMessage(
const QString &msg )
const
1404 const int fontHeight = 10;
1405 const int margin = fontHeight / 2;
1406 const int nlines = 1;
1408 const int w = 512, h = fontHeight * nlines + margin * ( nlines + 1 );
1409 QImage image( w, h, QImage::Format_ARGB32_Premultiplied );
1411 painter.begin( &image );
1412 painter.setPen( QColor( 255, 0, 0 ) );
1413 painter.setFont( QFont( QStringLiteral(
"Chicago" ), fontHeight ) );
1414 painter.fillRect( 0, 0, w, h, QColor( 255, 255, 255 ) );
1415 painter.drawText( 0, margin + fontHeight, msg );
1422void QgsWmsLegendNode::getLegendGraphicProgress( qint64 cur, qint64 tot )
1424 const QString msg = tot > 0 ? tr(
"Downloading: %1% (%2)" ).arg(
static_cast< int >( std::round( 100 * cur / tot ) ) ).arg(
QgsFileUtils::representFileSize( tot ) )
1426 mImage = renderMessage( msg );
1430void QgsWmsLegendNode::getLegendGraphicErrored(
const QString & )
1443void QgsWmsLegendNode::getLegendGraphicFinished(
const QImage &image )
1448 if ( ! image.isNull() )
1450 if ( image != mImage )
1470 return getLegendGraphic(
true );
1488 if ( role == Qt::DecorationRole )
1491 return QPixmap::fromImage( mImage );
1493 else if ( role == Qt::SizeHintRole )
1496 return mImage.size();
1509 std::unique_ptr< QgsRenderContext > tempRenderContext;
1514 tempRenderContext = std::make_unique< QgsRenderContext >();
1517 tempRenderContext->setScaleFactor( settings.
dpi() / 25.4 );
1518 tempRenderContext->setRendererScale( settings.
mapScale() );
1520 tempRenderContext->setMapToPixel(
QgsMapToPixel( 1 / ( settings.
mmPerMapUnit() * tempRenderContext->scaleFactor() ) ) );
1521 tempRenderContext->setForceVectorOutput(
true );
1522 tempRenderContext->setPainter( ctx ? ctx->
painter : nullptr );
1529 tempRenderContext->setExpressionContext( expContext );
1530 context = tempRenderContext.get();
1547 double labelXOffset;
1551 context->
painter()->restore();
1560void QgsDataDefinedSizeLegendNode::cacheImage()
const
1562 if ( mImage.isNull() )
1568 Q_ASSERT( context );
1569 context->setScaleFactor( 96 / 25.4 );
1585 if ( role == Qt::DisplayRole )
1589 if ( role == Qt::DecorationRole )
1599 Q_UNUSED( itemHeight );
1602 return QSizeF( 0, 0 );
1606 if ( renderContext )
1611 return QSizeF( 0, 0 );
1616 const QStringList textLines( mLabelSettings.
legendString() );
1619 double textWidth, textHeight;
1620 textWidthHeight( textWidth, textHeight, ctx, textFormat, textLines );
1623 const QPointF textPos( renderContext.
scaleFactor() * ( xOffset + settings.
symbolSize().width() / 2.0 - textWidth / 2.0 ), renderContext.
scaleFactor() * ( yOffset + settings.
symbolSize().height() / 2.0 + textHeight / 2.0 ) );
1628 const double symbolWidth = std::max( textWidth, settings.
symbolSize().width() );
1629 const double symbolHeight = std::max( textHeight, settings.
symbolSize().height() );
1630 return QSizeF( symbolWidth, symbolHeight );
1635 Q_UNUSED( settings );
1637 const double mmToPixel = 96.0 / 25.4;
1639 const QStringList textLines( mLabelSettings.
legendString() );
1644 double textWidth, textHeight;
1645 textWidthHeight( textWidth, textHeight, ctx, textFormat, textLines );
1648 QByteArray byteArray;
1649 QBuffer buffer( &byteArray );
1650 previewPixmap.save( &buffer,
"PNG" );
1651 const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
1654 json[ QStringLiteral(
"icon" ) ] = base64;
1658void QgsVectorLabelLegendNode::textWidthHeight(
double &width,
double &height,
QgsRenderContext &ctx,
const QgsTextFormat &textFormat,
const QStringList &textLines )
const
@ Point
Text at point of origin layout mode.
@ RectangleCapHeightBased
Similar to Rectangle mode, but uses cap height only when calculating font heights for the first line ...
@ Horizontal
Horizontally oriented text.
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ Antialiasing
Use antialiasing while drawing.
@ UseAdvancedEffects
Enable layer opacity and blending effects.
TextHorizontalAlignment
Text horizontal alignment.
QgsDataDefinedSizeLegendNode(QgsLayerTreeLayer *nodeLayer, const QgsDataDefinedSizeLegend &settings, QObject *parent=nullptr)
Construct the node using QgsDataDefinedSizeLegend as definition of the node's appearance.
ItemMetrics draw(const QgsLegendSettings &settings, ItemContext *ctx) override
Entry point called from QgsLegendRenderer to do the rendering.
QVariant data(int role) const override
Returns data associated with the item. Must be implemented in derived class.
~QgsDataDefinedSizeLegendNode() override
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
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.
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...
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...
virtual QString dataSourceUri(bool expandAuthConfig=false) const
Gets the data source specification.
Class for storing the component parts of a RDBMS data source URI (e.g.
bool useEstimatedMetadata() const
Returns true if estimated metadata should be used for the connection.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void appendScopes(const QList< QgsExpressionContextScope * > &scopes)
Appends a list of scopes to the end of the context.
static QString replaceExpressionText(const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea=nullptr)
This function replaces each expression between [% and %] in the string with the result of its evaluat...
virtual void setLegendSymbolItem(const QString &key, QgsSymbol *symbol)
Sets the symbol to be used for a legend symbol item.
virtual void checkLegendSymbolItem(const QString &key, bool state=true)
Sets whether the legend symbology item with the specified ley should be checked.
static QString representFileSize(qint64 bytes)
Returns the human size from bytes.
void progress(qint64 received, qint64 total)
Emitted to report progress.
void error(const QString &msg)
Emitted when an error occurs.
void finish(const QImage &legend)
Emitted when the download completes.
QVariant data(int role) const override
Returns data associated with the item. Must be implemented in derived class.
QgsImageLegendNode(QgsLayerTreeLayer *nodeLayer, const QImage &img, QObject *parent=nullptr)
Constructor for QgsImageLegendNode.
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
Draws symbol on the left side of the item.
QJsonObject exportSymbolToJson(const QgsLegendSettings &settings, const QgsRenderContext &context) const override
Adds a symbol in base64 string within a JSON object with the key "icon".
static QRect nonTransparentImageRect(const QImage &image, QSize minSize=QSize(), bool center=false)
Calculates the non-transparent region of an image.
Layer tree node points to a map layer.
QString labelExpression() const
Returns the expression member of the LayerTreeNode.
QgsLegendPatchShape patchShape() const
Returns the symbol patch shape to use when rendering the legend node symbol.
QString name() const override
Returns the layer's name.
QgsMapLayer * layer() const
Returns the map layer associated with this node.
QSizeF patchSize() const
Returns the user (overridden) size for the legend node.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...
virtual QVariant data(int role) const =0
Returns data associated with the item. Must be implemented in derived class.
QJsonObject exportToJson(const QgsLegendSettings &settings, const QgsRenderContext &context)
Entry point called from QgsLegendRenderer to do the rendering in a JSON object.
@ SimpleLegend
Simple label with icon legend node type.
@ RasterSymbolLegend
Raster symbol legend node type.
@ ImageLegend
Raster image legend node type.
@ DataDefinedSizeLegend
Marker symbol legend node type.
@ WmsLegend
WMS legend node type.
@ SymbolLegend
Vector symbol legend node type.
void checkAllItems()
Checks all checkable items belonging to the same layer as this node.
@ ParentRuleKey
Rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2....
@ NodeType
Type of node. Added in 3.16.
@ RuleKey
Rule key of the node (QString)
void uncheckAllItems()
Unchecks all checkable items belonging to the same layer as this node.
QgsLayerTreeLayer * mLayerNode
QgsLayerTreeModelLegendNode(QgsLayerTreeLayer *nodeL, QObject *parent=nullptr)
Construct the node with pointer to its parent layer node.
virtual void setUserPatchSize(QSizeF size)
Sets the user (overridden) size for the legend node.
void sizeChanged()
Emitted when the size of this node changes.
void dataChanged()
Emitted on internal data change so the layer tree model can forward the signal to views.
QgsRenderContext * createTemporaryRenderContext() const
Returns a temporary context or nullptr if legendMapViewData are not valid.
virtual QJsonObject exportSymbolToJson(const QgsLegendSettings &settings, const QgsRenderContext &context) const
Adds a symbol in base64 string within a JSON object with the key "icon".
QgsLayerTreeModel * model() const
Returns pointer to model owning this legend node.
void toggleAllItems()
Toggle all checkable items belonging to the same layer as this node.
QgsLegendPatchShape mPatchShape
virtual QSizeF userPatchSize() const
Returns the user (overridden) size for the legend node.
virtual ItemMetrics draw(const QgsLegendSettings &settings, ItemContext *ctx)
Entry point called from QgsLegendRenderer to do the rendering.
virtual Qt::ItemFlags flags() const
Returns item flags associated with the item. Default implementation returns Qt::ItemIsEnabled.
QgsLayerTreeLayer * layerNode() const
Returns pointer to the parent layer node.
virtual QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const
Draws symbol on the left side of the item.
virtual void setEmbeddedInParent(bool embedded)
virtual bool setData(const QVariant &value, int role)
Sets some data associated with the item. Default implementation does nothing and returns false.
virtual QSizeF drawSymbolText(const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize) const
Draws label on the right side of the item.
The QgsLayerTreeModel class is model implementation for Qt item views framework.
QSet< QgsScreenProperties > targetScreenProperties() const
Returns the target screen properties to use when generating icons.
static int scaleIconSize(int standardSize)
Scales an layer tree model icon size to compensate for display pixel density, making the icon size hi...
const QgsMapSettings * legendFilterMapSettings() const
Returns the current map settings used for the current legend filter (or nullptr if none is enabled)
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.
Represents a patch shape for use in map legends.
The QgsLegendSettings class stores the appearance and layout settings for legend drawing with QgsLege...
QgsLegendStyle style(QgsLegendStyle::Style s) const
Returns the style for a legend component.
bool drawRasterStroke() const
Returns whether a stroke will be drawn around raster symbol items.
QSizeF wmsLegendSize() const
Returns the size (in millimeters) of WMS legend graphics shown in the legend.
double minimumSymbolSize() const
Returns the minimum symbol size (in mm).
double rasterStrokeWidth() const
Returns the stroke width (in millimeters) for the stroke drawn around raster symbol items.
QSizeF symbolSize() const
Returns the default symbol size (in millimeters) used for legend items.
double maximumSymbolSize() const
Returns the maximum symbol size (in mm).
QColor rasterStrokeColor() const
Returns the stroke color for the stroke drawn around raster symbol items.
Q_DECL_DEPRECATED bool useAdvancedEffects() const
Q_DECL_DEPRECATED int dpi() const
bool synchronousLegendRequests() const
Returns whether to request legend graphics synchronously.
Q_DECL_DEPRECATED double mmPerMapUnit() const
QStringList evaluateItemText(const QString &text, const QgsExpressionContext &context) const
Splits a string using the wrap char taking into account handling empty wrap char which means no wrapp...
Qt::AlignmentFlag symbolAlignment() const
Returns the alignment for placement of legend symbols.
Q_DECL_DEPRECATED double mapScale() const
Returns the legend map scale.
Qt::Alignment alignment() const
Returns the alignment for the legend component.
QgsTextFormat & textFormat()
Returns the text format used for rendering this legend component.
double margin(Side side) const
Returns the margin (in mm) for the specified side of the component.
@ Symbol
Symbol icon (excluding label)
@ SymbolLabel
Symbol label (excluding icon)
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
QString parentRuleKey() const
Key of the parent legend node.
int scaleMaxDenom() const
Max scale denominator of the scale range.
void setSymbol(QgsSymbol *s)
Sets the symbol of the item.
int scaleMinDenom() const
Min scale denominator of the scale range.
QgsSymbol * symbol() const
Returns associated symbol. May be nullptr.
QString ruleKey() const
Returns unique identifier of the rule for identification of the item within renderer.
bool isCheckable() const
Returns whether the item is user-checkable - whether renderer supports enabling/disabling it.
QString label() const
Returns text label.
Base class for all map layer types.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted.
void emitStyleChanged()
Triggers an emission of the styleChanged() signal.
QgsProject * project() const
Returns the parent project if this map layer is added to a project.
The QgsMapSettings class contains configuration for rendering of the map.
Perform transforms between map coordinates and device coordinates.
A marker symbol type, for rendering Point and MultiPoint geometries.
Contains settings for how a map layer will be labeled.
QString legendString() const
legendString
static QPixmap labelSettingsPreviewPixmap(const QgsPalLayerSettings &settings, QSize size, const QString &previewText=QString(), int padding=0, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for label settings.
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
Represents a map layer supporting display of point clouds.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Base class for raster data providers.
virtual QgsImageFetcher * getLegendGraphicFetcher(const QgsMapSettings *mapSettings)
Returns a new image downloader for the raster legend.
Represents a raster layer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
Raster renderer pipe that applies colors to a raster.
Qt::ItemFlags flags() const override
Returns item flags associated with the item. Default implementation returns Qt::ItemIsEnabled.
bool setData(const QVariant &value, int role) override
Sets some data associated with the item. Default implementation does nothing and returns false.
QJsonObject exportSymbolToJson(const QgsLegendSettings &settings, const QgsRenderContext &context) const override
Adds a symbol in base64 string within a JSON object with the key "icon".
QgsRasterSymbolLegendNode(QgsLayerTreeLayer *nodeLayer, const QColor &color, const QString &label, QObject *parent=nullptr, bool isCheckable=false, const QString &ruleKey=QString(), const QString &parentRuleKey=QString())
Constructor for QgsRasterSymbolLegendNode.
QVariant data(int role) const override
Returns data associated with the item. Must be implemented in derived class.
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
Draws symbol on the left side of the item.
Contains information about the context of a rendering operation.
void setForceVectorOutput(bool force)
Sets whether rendering operations should use vector operations instead of any faster raster shortcuts...
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
QgsExpressionContext & expressionContext()
Gets the expression context.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
void setRendererScale(double scale)
Sets the renderer map scale.
Qgis::RenderContextFlags flags() const
Returns combination of flags used for rendering.
Scoped object for saving and restoring a QPainter object's state.
Scoped object for temporary scaling of a QgsRenderContext for pixel based rendering.
Stores properties relating to a screen.
double devicePixelRatio() const
Returns the ratio between physical pixels and device-independent pixels for the screen.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
QVariant data(int role) const override
Returns data associated with the item. Must be implemented in derived class.
QgsSimpleLegendNode(QgsLayerTreeLayer *nodeLayer, const QString &label, const QIcon &icon=QIcon(), QObject *parent=nullptr, const QString &key=QString())
Constructor for QgsSimpleLegendNode.
static QPixmap symbolPreviewPixmap(const QgsSymbol *symbol, QSize size, int padding=0, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *shape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for a color ramp.
static QgsSymbol * restrictedSizeSymbol(const QgsSymbol *s, double minSize, double maxSize, QgsRenderContext *context, double &width, double &height, bool *ok=nullptr)
Creates a new symbol with size restricted to min/max size if original size is out of min/max range.
static double estimateMaxSymbolBleed(QgsSymbol *symbol, const QgsRenderContext &context)
Returns the maximum estimated bleed for the symbol.
static double MAXIMUM_SIZE
QString evaluateLabel(const QgsExpressionContext &context=QgsExpressionContext(), const QString &label=QString())
Evaluates and returns the text label of the current node.
const QgsSymbol * symbol() const
Returns the symbol used by the legend node.
void setPatchShape(const QgsLegendPatchShape &shape)
Sets the symbol patch shape to use when rendering the legend node symbol.
QgsSymbolLegendNode(QgsLayerTreeLayer *nodeLayer, const QgsLegendSymbolItem &item, QObject *parent=nullptr)
Constructor for QgsSymbolLegendNode.
void setIconSize(QSize sz)
Set the icon size.
QgsExpressionContextScope * createSymbolScope() const
Create an expression context scope containing symbol related variables.
QgsLegendPatchShape patchShape() const
Returns the symbol patch shape to use when rendering the legend node symbol.
QSize minimumIconSize() const
Calculates the minimum icon size to prevent cropping.
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
Draws symbol on the left side of the item.
void invalidateMapBasedData() override
Notification from model that information from associated map view has changed.
bool setData(const QVariant &value, int role) override
Sets some data associated with the item. Default implementation does nothing and returns false.
Qt::ItemFlags flags() const override
Returns item flags associated with the item. Default implementation returns Qt::ItemIsEnabled.
void setCustomSymbol(QgsSymbol *symbol)
Sets the node's custom symbol.
void setEmbeddedInParent(bool embedded) override
QgsSymbol * customSymbol() const
Returns the node's custom symbol.
QString symbolLabel() const
Label of the symbol, user defined label will be used, otherwise will default to the label made by QGI...
void setSymbol(QgsSymbol *symbol)
Sets the symbol to be used by the legend node.
static double MINIMUM_SIZE
QVariant data(int role) const override
Returns data associated with the item. Must be implemented in derived class.
QJsonObject exportSymbolToJson(const QgsLegendSettings &settings, const QgsRenderContext &context) const override
Adds a symbol in base64 string within a JSON object with the key "icon".
Abstract base class for all rendered symbols.
bool usesMapUnits() const
Returns true if the symbol has any components which use map unit based sizes.
void drawPreviewIcon(QPainter *painter, QSize size, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *patchShape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Draws an icon of the symbol that occupies an area given by size using the specified painter.
Qgis::SymbolType type() const
Returns the symbol's type.
Contains pre-calculated metrics of a QgsTextDocument.
QSizeF documentSize(Qgis::TextLayoutMode mode, Qgis::TextOrientation orientation) const
Returns the overall size of the document.
double firstLineCapHeight() const
Returns the cap height for the first line of text.
static QgsTextDocumentMetrics calculateMetrics(const QgsTextDocument &document, const QgsTextFormat &format, const QgsRenderContext &context, double scaleFactor=1.0, const QgsTextDocumentRenderContext &documentContext=QgsTextDocumentRenderContext())
Returns precalculated text metrics for a text document, when rendered using the given base format and...
Represents a document consisting of one or more QgsTextBlock objects.
static QgsTextDocument fromTextAndFormat(const QStringList &lines, const QgsTextFormat &format)
Constructor for QgsTextDocument consisting of a set of lines, respecting settings from a text format.
Container for all settings relating to text rendering.
QFont scaledFont(const QgsRenderContext &context, double scaleFactor=1.0, bool *isZeroSize=nullptr) const
Returns a font with the size scaled to match the format's size settings (including units and map unit...
QFont toQFont() const
Returns a QFont matching the relevant settings from this text format.
QColor color() const
Returns the color that text will be rendered in.
static double textWidth(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, QFontMetricsF *fontMetrics=nullptr)
Returns the width of a text based on a given format.
static void drawDocument(const QRectF &rect, const QgsTextFormat &format, const QgsTextDocument &document, const QgsTextDocumentMetrics &metrics, QgsRenderContext &context, Qgis::TextHorizontalAlignment horizontalAlignment=Qgis::TextHorizontalAlignment::Left, Qgis::TextVerticalAlignment verticalAlignment=Qgis::TextVerticalAlignment::Top, double rotation=0, Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags())
Draws a text document within a rectangle using the specified settings.
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 QFontMetricsF fontMetrics(QgsRenderContext &context, const QgsTextFormat &format, double scaleFactor=1.0)
Returns the font metrics for the given text format, when rendered in the specified render context.
static double calculateScaleFactorForFormat(const QgsRenderContext &context, const QgsTextFormat &format)
Returns the scale factor used for upscaling font sizes and downscaling destination painter devices.
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Point, QFontMetricsF *fontMetrics=nullptr, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), double maxLineWidth=0)
Returns the height of a text based on a given format.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
QgsVectorLabelLegendNode(QgsLayerTreeLayer *nodeLayer, const QgsPalLayerSettings &labelSettings, QObject *parent=nullptr)
QgsVectorLabelLegendNode.
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
drawSymbol
QJsonObject exportSymbolToJson(const QgsLegendSettings &settings, const QgsRenderContext &context) const override
exportSymbolToJson
~QgsVectorLabelLegendNode() override
QVariant data(int role) const override
data Returns data associated with the item
Represents a vector layer which manages a vector based data sets.
QgsExpressionContextScope * createExpressionContextScope() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
long long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
void symbolFeatureCountMapChanged()
Emitted when the feature count for symbols on this layer has been recalculated.
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
QImage getLegendGraphicBlocking() const
Fetches the image from the server and returns it.
QSizeF drawSymbol(const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight) const override
Draws symbol on the left side of the item.
void invalidateMapBasedData() override
Notification from model that information from associated map view has changed.
QVariant data(int role) const override
Returns data associated with the item. Must be implemented in derived class.
~QgsWmsLegendNode() override
QgsWmsLegendNode(QgsLayerTreeLayer *nodeLayer, QObject *parent=nullptr)
Constructor for QgsWmsLegendNode.
QJsonObject exportSymbolToJson(const QgsLegendSettings &settings, const QgsRenderContext &context) const override
Adds a symbol in base64 string within a JSON object with the key "icon".
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QList< QgsLegendSymbolItem > QgsLegendSymbolList
#define QgsDebugError(str)
Single variable definition for use within a QgsExpressionContextScope.
QPainter * painter
Painter.
double top
Top y-position of legend item.
QgsLegendPatchShape patchShape
The patch shape to render for the node.
QgsScreenProperties screenProperties
Destination screen properties.
double maxSiblingSymbolWidth
Largest symbol width, considering all other sibling legend components associated with the current com...
QSizeF patchSize
Symbol patch size to render for the node.
const QgsTextDocument * textDocument
Optional text document.
double columnLeft
Left side of current legend column.
const QgsTextDocumentMetrics * textDocumentMetrics
Optional text document metrics.
double columnRight
Right side of current legend column.
Q_NOWARN_DEPRECATED_POP QgsRenderContext * context
Render context, if available.