39 #include "qgssettings.h" 
   48   , mEmbeddedInParent( false )
 
   54   return qobject_cast<QgsLayerTreeModel *>( parent() );
 
   59   return Qt::ItemIsEnabled;
 
   94   double itemHeight = std::max( 
static_cast< double >( ctx && ctx->
patchSize.height() > 0 ? ctx->
patchSize.height() : settings.
symbolSize().height() ), textHeight );
 
  105   const QString text = 
data( Qt::DisplayRole ).toString();
 
  106   json[ QStringLiteral( 
"title" ) ] = text;
 
  112   QIcon symbolIcon = 
data( Qt::DecorationRole ).value<QIcon>();
 
  113   if ( symbolIcon.isNull() )
 
  120       size.setWidth( ctx->
patchSize.width( ) );
 
  122       size.setHeight( ctx->
patchSize.height( ) );
 
  131         symbolIcon.paint( ctx->
painter,
 
  133                           static_cast< int >( ctx->
top + ( itemHeight - size.height() ) / 2 ),
 
  134                           static_cast< int >( size.width() ),
 
  135                           static_cast< int >( size.height() ) );
 
  139         symbolIcon.paint( ctx->
painter,
 
  140                           static_cast< int >( ctx->
columnRight - size.width() ),
 
  141                           static_cast< int >( ctx->
top + ( itemHeight - size.height() ) / 2 ),
 
  142                           static_cast< int >( size.width() ),
 
  143                           static_cast< int >( size.height() ) );
 
  152   const QIcon icon = 
data( Qt::DecorationRole ).value<QIcon>();
 
  154     return QJsonObject();
 
  156   const QImage image( icon.pixmap( settings.
symbolSize().width(), settings.
symbolSize().height() ).toImage() );
 
  157   QByteArray byteArray;
 
  158   QBuffer buffer( &byteArray );
 
  159   image.save( &buffer, 
"PNG" );
 
  160   const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
 
  163   json[ QStringLiteral( 
"icon" ) ] = base64;
 
  169   QSizeF labelSize( 0, 0 );
 
  179   labelSize.rheight() = lines.count() * textHeight + ( lines.count() - 1 ) * ( settings.
lineSpacing() + textDescent );
 
  181   double labelXMin = 0.0;
 
  182   double labelXMax = 0.0;
 
  211     if ( labelSize.height() < symbolSize.height() )
 
  212       labelY += symbolSize.height() / 2 - labelSize.height() / 2;  
 
  214     labelY += textHeight;
 
  217   for ( QStringList::ConstIterator itemPart = lines.constBegin(); itemPart != lines.constEnd(); ++itemPart )
 
  220     labelSize.rwidth() = std::max( lineWidth, 
double( labelSize.width() ) );
 
  228           settings.
drawText( ctx->
painter, labelXMin, labelY, *itemPart, symbolLabelFont );
 
  232           settings.
drawText( ctx->
painter, labelXMax - lineWidth, labelY, *itemPart, symbolLabelFont );
 
  235         case Qt::AlignHCenter:
 
  236           settings.
drawText( ctx->
painter, labelXMin + ( labelXMax - labelXMin - lineWidth ) / 2.0, labelY, *itemPart, symbolLabelFont );
 
  240       if ( itemPart != ( lines.end() - 1 ) )
 
  241         labelY += textDescent + settings.
lineSpacing() + textHeight;
 
  262     if ( !vlayer->renderer() )
 
  266     for ( 
const auto &item : symbolList )
 
  268       vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), ! vlayer->renderer()->legendSymbolItemChecked( item.ruleKey() ) );
 
  272     vlayer->emitStyleChanged();
 
  273     vlayer->triggerRepaint();
 
  277     if ( !pclayer->renderer() )
 
  280     const QStringList ruleKeys = pclayer->renderer()->legendRuleKeys();
 
  281     for ( 
const QString &rule : ruleKeys )
 
  283       pclayer->renderer()->checkLegendItem( rule, !pclayer->renderer()->legendItemChecked( rule ) );
 
  287     pclayer->emitStyleChanged();
 
  288     pclayer->triggerRepaint();
 
  300   , mSymbolUsesMapUnits( false )
 
  309     QgsSettings settings;
 
  310     MINIMUM_SIZE = settings.value( 
"/qgis/legendsymbolMinimumSize", 0.5 ).toDouble();
 
  311     MAXIMUM_SIZE = settings.value( 
"/qgis/legendsymbolMaximumSize", 20.0 ).toDouble();
 
  318   connect( nodeLayer, &QObject::destroyed, 
this, [ = ]() { 
mLayerNode = 
nullptr; } );
 
  329     return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
 
  331     return Qt::ItemIsEnabled;
 
  370   if ( !mTextOnSymbolLabel.isEmpty() && context )
 
  374     int wInt = ceil( w ), hInt = ceil( h );
 
  375     if ( wInt > minSz.width() ) minSz.setWidth( wInt );
 
  376     if ( hInt > minSz.height() ) minSz.setHeight( hInt );
 
  393     QString layerName = legendlabel.isNull() ? 
mLayerNode->
name() : legendlabel.toString();
 
  420   return mCustomSymbol.get();
 
  425   mCustomSymbol.reset( 
symbol );
 
  433   std::unique_ptr< QgsSymbol > s( 
symbol ); 
 
  435   if ( !vlayer || !vlayer->
renderer() )
 
  452   if ( 
auto *lModel = 
model() )
 
  453     lModel->legendMapViewData( &mupp, &dpi, &scale );
 
  459   std::unique_ptr<QgsRenderContext> context = std::make_unique<QgsRenderContext>( );
 
  460   context->setScaleFactor( dpi / 25.4 );
 
  461   context->setRendererScale( scale );
 
  465   return context.release();
 
  468 void QgsLayerTreeModelLegendNode::checkAll( 
bool state )
 
  472     if ( !vlayer->renderer() )
 
  476     for ( 
const auto &item : symbolList )
 
  478       vlayer->renderer()->checkLegendSymbolItem( item.ruleKey(), state );
 
  482     vlayer->emitStyleChanged();
 
  483     vlayer->triggerRepaint();
 
  487     if ( !pclayer->renderer() )
 
  490     const QStringList ruleKeys = pclayer->renderer()->legendRuleKeys();
 
  491     for ( 
const QString &rule : ruleKeys )
 
  493       pclayer->renderer()->checkLegendItem( rule, state );
 
  497     pclayer->emitStyleChanged();
 
  498     pclayer->triggerRepaint();
 
  504   if ( role == Qt::DisplayRole )
 
  508   else if ( role == Qt::EditRole )
 
  512   else if ( role == Qt::DecorationRole )
 
  514     if ( mPixmap.isNull() || mPixmap.size() != mIconSize )
 
  527         if ( !mTextOnSymbolLabel.isEmpty() && context )
 
  529           QPainter painter( &pix );
 
  530           painter.setRenderHint( QPainter::Antialiasing );
 
  531           context->setPainter( &painter );
 
  532           QFontMetricsF fm( mTextOnSymbolTextFormat.
scaledFont( *context ) );
 
  533           qreal yBaselineVCenter = ( mIconSize.height() + fm.ascent() - fm.descent() ) / 2;
 
  535                                      QStringList() << mTextOnSymbolLabel, *context, mTextOnSymbolTextFormat );
 
  540         pix = QPixmap( mIconSize );
 
  541         pix.fill( Qt::transparent );
 
  548   else if ( role == Qt::CheckStateRole )
 
  555       if ( !vlayer->renderer() )
 
  558       return vlayer->renderer()->legendSymbolItemChecked( mItem.
ruleKey() ) ? Qt::Checked : Qt::Unchecked;
 
  579   if ( role != Qt::CheckStateRole )
 
  586   if ( !vlayer || !vlayer->
renderer() )
 
  611   std::unique_ptr< QgsRenderContext > tempRenderContext;
 
  617     tempRenderContext = std::make_unique< QgsRenderContext >();
 
  620     tempRenderContext->setScaleFactor( settings.
dpi() / 25.4 );
 
  621     tempRenderContext->setRendererScale( settings.
mapScale() );
 
  625     tempRenderContext->setForceVectorOutput( 
true );
 
  626     tempRenderContext->setPainter( ctx ? ctx->
painter : 
nullptr );
 
  631     tempRenderContext->setExpressionContext( expContext );
 
  632     context = tempRenderContext.get();
 
  638   double height = desiredHeight;
 
  639   double width = desiredWidth;
 
  642   double widthOffset = 0;
 
  643   double heightOffset = 0;
 
  650     double size = markerSymbol->size( *context ) / context->
scaleFactor();
 
  656   if ( minMaxSizeSymbol )
 
  658     s = minMaxSizeSymbol.get();
 
  663     if ( width < desiredWidth )
 
  665       widthOffset = ( desiredWidth - width ) / 2.0;
 
  667     if ( height < desiredHeight )
 
  669       heightOffset = ( desiredHeight - height ) / 2.0;
 
  674     double currentYCoord = ctx->
top + ( itemHeight - desiredHeight ) / 2;
 
  682       opacity = 
static_cast<int >( std::round( 255 * layer->opacity() ) );
 
  691         p->translate( ctx->
columnLeft + widthOffset, currentYCoord + heightOffset );
 
  694         p->translate( ctx->
columnRight - widthOffset - width, currentYCoord + heightOffset );
 
  698     p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
 
  703     if ( opacity != 255 && useAdvancedEffects )
 
  709       const QSize symbolSize( 
static_cast< int >( std::round( width * dotsPerMM ) ), 
static_cast<int >( std::round( height * dotsPerMM ) ) );
 
  710       const QSize tempImageSize( symbolSize.width() + maxBleed * 2, symbolSize.height() + maxBleed * 2 );
 
  711       QImage tempImage = QImage( tempImageSize, QImage::Format_ARGB32 );
 
  712       tempImage.fill( Qt::transparent );
 
  713       QPainter imagePainter( &tempImage );
 
  717       imagePainter.translate( maxBleed, maxBleed );
 
  719       imagePainter.translate( -maxBleed, -maxBleed );
 
  722       imagePainter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
 
  723       imagePainter.fillRect( tempImage.rect(), QColor( 0, 0, 0, opacity ) );
 
  726       p->drawImage( -maxBleed, -maxBleed, tempImage );
 
  730       s->
drawPreviewIcon( p, QSize( 
static_cast< int >( std::round( width * dotsPerMM ) ), 
static_cast< int >( std::round( height * dotsPerMM ) ) ), context, 
false, 
nullptr, &
patchShape );
 
  733     if ( !mTextOnSymbolLabel.isEmpty() )
 
  735       QFontMetricsF fm( mTextOnSymbolTextFormat.
scaledFont( *context ) );
 
  736       qreal yBaselineVCenter = ( height * dotsPerMM + fm.ascent() - fm.descent() ) / 2;
 
  738                                  QStringList() << mTextOnSymbolLabel, *context, mTextOnSymbolTextFormat );
 
  742   return QSizeF( std::max( width + 2 * widthOffset, 
static_cast< double >( desiredWidth ) ),
 
  743                  std::max( height + 2 * heightOffset, 
static_cast< double >( desiredHeight ) ) );
 
  748   const QgsSymbol *s = mCustomSymbol ? mCustomSymbol.get() : mItem.
symbol();
 
  751     return QJsonObject();
 
  773   QImage img( pix.toImage().convertToFormat( QImage::Format_ARGB32_Premultiplied ) );
 
  777     opacity = ( 255 * layer->opacity() );
 
  779   if ( opacity != 255 )
 
  782     painter.begin( &img );
 
  783     painter.setCompositionMode( QPainter::CompositionMode_DestinationIn );
 
  784     painter.fillRect( pix.rect(), QColor( 0, 0, 0, opacity ) );
 
  788   QByteArray byteArray;
 
  789   QBuffer buffer( &byteArray );
 
  790   img.save( &buffer, 
"PNG" );
 
  791   const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
 
  794   json[ QStringLiteral( 
"icon" ) ] = base64;
 
  797     json[ QStringLiteral( 
"scaleMaxDenom" ) ] = mItem.
scaleMaxDenom();
 
  801     json[ QStringLiteral( 
"scaleMinDenom" ) ] = mItem.
scaleMinDenom();
 
  816   if ( mSymbolUsesMapUnits )
 
  824 void QgsSymbolLegendNode::updateLabel()
 
  833   if ( showFeatureCount && vl )
 
  836     mLabel += QStringLiteral( 
" [%1]" ).arg( count != -1 ? QLocale().toString( count ) : tr( 
"N/A" ) );
 
  856     if ( label.isEmpty() )
 
  860       else if ( mLabel.contains( 
"[%" ) )
 
  872       else if ( label.contains( 
"[%" ) )
 
  907   if ( role == Qt::DisplayRole || role == Qt::EditRole )
 
  909   else if ( role == Qt::DecorationRole )
 
  930   if ( role == Qt::DecorationRole )
 
  932     return QPixmap::fromImage( mImage );
 
  934   else if ( role == Qt::SizeHintRole )
 
  936     return mImage.size();
 
  947   Q_UNUSED( itemHeight )
 
  956                                  mImage, QRectF( 0, 0, mImage.width(), mImage.height() ) );
 
  961                                  mImage, QRectF( 0, 0, mImage.width(), mImage.height() ) );
 
  970   QByteArray byteArray;
 
  971   QBuffer buffer( &byteArray );
 
  972   mImage.save( &buffer, 
"PNG" );
 
  973   const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
 
  976   json[ QStringLiteral( 
"icon" ) ] = base64;
 
  986   , mCheckable( isCheckable )
 
  987   , mRuleKey( ruleKey )
 
  994     return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable;
 
  996     return Qt::ItemIsEnabled;
 
 1003     case Qt::DecorationRole:
 
 1008       return QIcon( pix );
 
 1011     case Qt::DisplayRole:
 
 1021     case Qt::CheckStateRole:
 
 1028         if ( !pclayer->renderer() )
 
 1031         return pclayer->renderer()->legendItemChecked( mRuleKey ) ? Qt::Checked : Qt::Unchecked;
 
 1044   if ( role != Qt::CheckStateRole )
 
 1052     if ( !pclayer->renderer() )
 
 1055     pclayer->renderer()->checkLegendItem( mRuleKey, value == Qt::Checked );
 
 1058     pclayer->emitStyleChanged();
 
 1060     pclayer->triggerRepaint();
 
 1078       if ( ctx->
patchSize.width() < size.width() )
 
 1079         offsetX = ( size.width() - ctx->
patchSize.width() ) / 2.0;
 
 1080       size.setWidth( ctx->
patchSize.width() );
 
 1084       size.setHeight( ctx->
patchSize.height() );
 
 1090     QColor itemColor = mColor;
 
 1094         itemColor.setAlpha( rasterRenderer->opacity() * 255.0 );
 
 1096     ctx->
painter->setBrush( itemColor );
 
 1103       pen.setJoinStyle( Qt::MiterJoin );
 
 1108       ctx->
painter->setPen( Qt::NoPen );
 
 1115         ctx->
painter->drawRect( QRectF( ctx->
columnLeft + offsetX, ctx->
top + ( itemHeight - size.height() ) / 2,
 
 1116                                         size.width(), size.height() ) );
 
 1119       case Qt::AlignRight:
 
 1120         ctx->
painter->drawRect( QRectF( ctx->
columnRight - size.width() - offsetX, ctx->
top + ( itemHeight - size.height() ) / 2,
 
 1121                                         size.width(), size.height() ) );
 
 1130   QImage img = QImage( settings.
symbolSize().toSize(), QImage::Format_ARGB32 );
 
 1131   img.fill( Qt::transparent );
 
 1133   QPainter painter( &img );
 
 1134   painter.setRenderHint( QPainter::Antialiasing );
 
 1136   QColor itemColor = mColor;
 
 1140       itemColor.setAlpha( rasterRenderer->opacity() * 255.0 );
 
 1142   painter.setBrush( itemColor );
 
 1149     pen.setJoinStyle( Qt::MiterJoin );
 
 1150     painter.setPen( pen );
 
 1154     painter.setPen( Qt::NoPen );
 
 1157   painter.drawRect( QRectF( 0, 0, settings.
symbolSize().width(), settings.
symbolSize().height() ) );
 
 1159   QByteArray byteArray;
 
 1160   QBuffer buffer( &byteArray );
 
 1161   img.save( &buffer, 
"PNG" );
 
 1162   const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
 
 1165   json[ QStringLiteral( 
"icon" ) ] = base64;
 
 1179 QImage QgsWmsLegendNode::getLegendGraphic()
 const 
 1181   if ( ! mValid && ! mFetcher )
 
 1188     if ( layer && layer->
isValid() )
 
 1199       Q_ASSERT( ! mFetcher );
 
 1211       QgsDebugMsg( tr( 
"Failed to download legend graphics: layer is not valid." ) );
 
 1220   if ( role == Qt::DecorationRole )
 
 1222     return QPixmap::fromImage( getLegendGraphic() );
 
 1224   else if ( role == Qt::SizeHintRole )
 
 1226     return getLegendGraphic().size();
 
 1237   Q_UNUSED( itemHeight )
 
 1250                                  QRectF( QPointF( 0, 0 ), mImage.size() ) );
 
 1253       case Qt::AlignRight:
 
 1259                                  QRectF( QPointF( 0, 0 ), mImage.size() ) );
 
 1268   QByteArray byteArray;
 
 1269   QBuffer buffer( &byteArray );
 
 1270   mImage.save( &buffer, 
"PNG" );
 
 1271   const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
 
 1274   json[ QStringLiteral( 
"icon" ) ] = base64;
 
 1278 QImage QgsWmsLegendNode::renderMessage( 
const QString &msg )
 const 
 1280   const int fontHeight = 10;
 
 1281   const int margin = fontHeight / 2;
 
 1282   const int nlines = 1;
 
 1284   const int w = 512, h = fontHeight * nlines + margin * ( nlines + 1 );
 
 1285   QImage image( w, h, QImage::Format_ARGB32_Premultiplied );
 
 1287   painter.begin( &image );
 
 1288   painter.setPen( QColor( 255, 0, 0 ) );
 
 1289   painter.setFont( QFont( QStringLiteral( 
"Chicago" ), fontHeight ) );
 
 1290   painter.fillRect( 0, 0, w, h, QColor( 255, 255, 255 ) );
 
 1291   painter.drawText( 0, margin + fontHeight, msg );
 
 1298 void QgsWmsLegendNode::getLegendGraphicProgress( qint64 cur, qint64 tot )
 
 1300   const QString msg = tot > 0 ? tr( 
"Downloading: %1% (%2)" ).arg( 
static_cast< int >( std::round( 100 * cur / tot ) ) ).arg( 
QgsFileUtils::representFileSize( tot ) )
 
 1302   mImage = renderMessage( msg );
 
 1306 void QgsWmsLegendNode::getLegendGraphicErrored( 
const QString & )
 
 1319 void QgsWmsLegendNode::getLegendGraphicFinished( 
const QImage &image )
 
 1324   if ( ! image.isNull() )
 
 1326     if ( image != mImage )
 
 1359   if ( role == Qt::DecorationRole )
 
 1362     return QPixmap::fromImage( mImage );
 
 1364   else if ( role == Qt::SizeHintRole )
 
 1367     return mImage.size();
 
 1380   std::unique_ptr< QgsRenderContext > tempRenderContext;
 
 1385     tempRenderContext = std::make_unique< QgsRenderContext >();
 
 1388     tempRenderContext->setScaleFactor( settings.
dpi() / 25.4 );
 
 1389     tempRenderContext->setRendererScale( settings.
mapScale() );
 
 1391     tempRenderContext->setMapToPixel( 
QgsMapToPixel( 1 / ( settings.
mmPerMapUnit() * tempRenderContext->scaleFactor() ) ) );
 
 1392     tempRenderContext->setForceVectorOutput( 
true );
 
 1393     tempRenderContext->setPainter( ctx ? ctx->
painter : 
nullptr );
 
 1400     tempRenderContext->setExpressionContext( expContext );
 
 1401     context = tempRenderContext.get();
 
 1418   double labelXOffset;
 
 1422     context->
painter()->restore();
 
 1431 void QgsDataDefinedSizeLegendNode::cacheImage()
 const 
 1433   if ( mImage.isNull() )
 
 1439       Q_ASSERT( context ); 
 
 1440       context->setScaleFactor( 96 / 25.4 );
 
 1456   if ( role == Qt::DisplayRole )
 
 1460   if ( role == Qt::DecorationRole )
 
 1470   Q_UNUSED( itemHeight );
 
 1473     return QSizeF( 0, 0 );
 
 1477   if ( renderContext )
 
 1482   return QSizeF( 0, 0 );
 
 1487   QStringList textLines( mLabelSettings.
legendString() );
 
 1490   double textWidth, textHeight;
 
 1491   textWidthHeight( textWidth, textHeight, ctx, textFormat, textLines );
 
 1494   QPointF textPos( renderContext.
scaleFactor() * ( xOffset + settings.
symbolSize().width() / 2.0 - textWidth / 2.0 ), renderContext.
scaleFactor() * ( yOffset + settings.
symbolSize().height() / 2.0 + textHeight / 2.0 ) );
 
 1499   const double symbolWidth = std::max( textWidth, settings.
symbolSize().width() );
 
 1500   const double symbolHeight = std::max( textHeight, settings.
symbolSize().height() );
 
 1501   return QSizeF( symbolWidth, symbolHeight );
 
 1506   Q_UNUSED( settings );
 
 1508   const double mmToPixel = 96.0 / 25.4; 
 
 1510   const QStringList textLines( mLabelSettings.
legendString() );
 
 1515   double textWidth, textHeight;
 
 1516   textWidthHeight( textWidth, textHeight, ctx, textFormat, textLines );
 
 1519   QByteArray byteArray;
 
 1520   QBuffer buffer( &byteArray );
 
 1521   previewPixmap.save( &buffer, 
"PNG" );
 
 1522   const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
 
 1525   json[ QStringLiteral( 
"icon" ) ] = base64;
 
 1529 void QgsVectorLabelLegendNode::textWidthHeight( 
double &width, 
double &height, 
QgsRenderContext &ctx, 
const QgsTextFormat &textFormat, 
const QStringList &textLines )
 const 
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...
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)
item in symbology was 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.
void uncheckAllItems()
Unchecks all checkable items belonging to the same layer as this node.
QgsLayerTreeLayer * layerNode() const
Returns pointer to the parent layer 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.
@ ParentRuleKeyRole
Rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2....
@ RuleKeyRole
Rule key of the node (QString)
@ NodeTypeRole
Type of node. Added in 3.16.
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.
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.
const QgsMapSettings * legendFilterMapSettings() const
Returns the current map settings used for the current legend filter (or nullptr if none is enabled)
static int scaleIconSize(int standardSize)
Scales an layer tree model icon size to compensate for display pixel density, making the icon size hi...
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...
void drawText(QPainter *p, double x, double y, const QString &text, const QFont &font) const
Draws Text.
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.
double fontDescentMillimeters(const QFont &font) const
Returns the font descent in Millimeters (considers upscaling and downscaling with FONT_WORKAROUND_SCA...
QSizeF symbolSize() const
Returns the default symbol size (in millimeters) used for legend items.
QColor fontColor() const
Returns the font color 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.
double textWidthMillimeters(const QFont &font, const QString &text) const
Returns the font width in millimeters (considers upscaling and downscaling with FONT_WORKAROUND_SCALE...
Q_DECL_DEPRECATED bool useAdvancedEffects() const
double fontHeightCharacterMM(const QFont &font, QChar c) const
Returns the font height of a character in millimeters.
Q_DECL_DEPRECATED int dpi() const
double lineSpacing() const
Returns the line spacing to use between lines of legend text.
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.
double margin(Side side)
Returns the margin (in mm) for the specified side of the component.
Qt::Alignment alignment() const
Returns the alignment for the legend component.
QFont font() const
Returns the font used for rendering this legend 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.
QgsSymbol * symbol() const
Returns associated symbol. May be nullptr.
int scaleMinDenom() const
Min scale denominator of the scale range.
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.
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)
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.
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())
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.
QgsExpressionContext & expressionContext()
Gets the expression context.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
void setFlag(Flag 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...
@ Antialiasing
Use antialiasing while drawing.
@ RenderSymbolPreview
The render is for a symbol preview only and map based properties may not be available,...
@ UseAdvancedEffects
Enable layer opacity and blending effects.
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
Flags flags() const
Returns combination of flags used for rendering.
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
void setRendererScale(double scale)
Sets the renderer map scale.
Scoped object for saving and restoring a QPainter object's state.
Scoped object for temporary scaling of a QgsRenderContext for pixel based rendering.
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)
Returns a pixmap preview for a color ramp.
static QgsSymbol * restrictedSizeSymbol(const QgsSymbol *s, double minSize, double maxSize, QgsRenderContext *context, double &width, double &height)
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.
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.
void drawPreviewIcon(QPainter *painter, QSize size, QgsRenderContext *customContext=nullptr, bool selected=false, const QgsExpressionContext *expressionContext=nullptr, const QgsLegendPatchShape *patchShape=nullptr)
Draws an icon of the symbol that occupies an area given by size using the specified painter.
bool usesMapUnits() const
Returns true if the symbol has any components which use map unit based sizes.
Qgis::SymbolType type() const
Returns the symbol's type.
Container for all settings relating to text rendering.
QFont scaledFont(const QgsRenderContext &context, double scaleFactor=1.0) const
Returns a font with the size scaled to match the format's size settings (including units and map unit...
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.
@ AlignCenter
Center align.
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, DrawMode mode=Point, QFontMetricsF *fontMetrics=nullptr)
Returns the height of a text based on a given format.
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 void drawText(const QRectF &rect, double rotation, HAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, VAlignment vAlignment=AlignTop)
Draws text within a rectangle using the specified settings.
@ Point
Text at point of origin draw mode.
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.
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".
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
#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
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.
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.
double columnLeft
Left side of current legend column.
double columnRight
Right side of current legend column.
Q_NOWARN_DEPRECATED_POP QgsRenderContext * context
Render context, if available.