18#include "moc_qgscolorramplegendnode.cpp" 
   35  , mParentKey( parentKey )
 
 
   46  , mSettings( settings )
 
   47  , mMinimumValue( minimumValue )
 
   48  , mMaximumValue( maximumValue )
 
   50  , mParentKey( parentKey )
 
 
   60  connect( nodeLayer, &QObject::destroyed, 
this, [
this]() { 
mLayerNode = 
nullptr; } );
 
   78QString QgsColorRampLegendNode::labelForMinimum()
 const 
   87QString QgsColorRampLegendNode::labelForMaximum()
 const 
   98  if ( role == Qt::DisplayRole )
 
  102  else if ( role == Qt::EditRole )
 
  106  else if ( role == Qt::DecorationRole )
 
  108    if ( mPixmap.isNull() || mPixmap.size() != mIconSize )
 
  110      const QFont font = 
data( Qt::FontRole ).value< QFont >();
 
  112      const QString minLabel = labelForMinimum();
 
  113      const QString maxLabel = labelForMaximum();
 
  115      const QFontMetrics fm( font );
 
  117      const QRect minBoundingRect = fm.boundingRect( minLabel );
 
  118      const QRect maxBoundingRect = fm.boundingRect( maxLabel );
 
  120      const int minLabelWidth = minBoundingRect.width();
 
  121      const int maxLabelWidth = maxBoundingRect.width();
 
  122      const int maxTextWidth = std::max( minLabelWidth, maxLabelWidth );
 
  123      const int labelGapFromRamp = fm.boundingRect( QStringLiteral( 
"x" ) ).width();
 
  124      const int extraAllowance = labelGapFromRamp * 0.4; 
 
  130          labelRect = QRect( mIconSize.width() + labelGapFromRamp, 0, maxTextWidth + extraAllowance, mIconSize.height() );
 
  131          mPixmap = QPixmap( mIconSize.width() + maxTextWidth + labelGapFromRamp + extraAllowance, mIconSize.height() );
 
  132          rampSize = mIconSize;
 
  136          labelRect = QRect( 0, mIconSize.height() + labelGapFromRamp, std::max( mIconSize.width(), minLabelWidth + maxLabelWidth + labelGapFromRamp ), std::max( minBoundingRect.height(),
 
  137                             maxBoundingRect.height() ) + extraAllowance );
 
  138          mPixmap = QPixmap( std::max( mIconSize.width(), minLabelWidth + maxLabelWidth + labelGapFromRamp ), mIconSize.height() + maxTextWidth + labelGapFromRamp + extraAllowance );
 
  139          rampSize = QSize( labelRect.width(), mIconSize.height() );
 
  143      mPixmap.fill( Qt::transparent );
 
  156        pix = QPixmap( rampSize );
 
  157        pix.fill( Qt::transparent );
 
  160      QPainter p( &mPixmap );
 
  161      p.drawPixmap( 0, 0, pix );
 
  163      p.setPen( qApp->palette().color( QPalette::Text ) );
 
 
  202  std::unique_ptr< QgsRenderContext > tempRenderContext;
 
  207    tempRenderContext = std::make_unique< QgsRenderContext >();
 
  210    tempRenderContext->setScaleFactor( 
settings.dpi() / 25.4 );
 
  211    tempRenderContext->setRendererScale( 
settings.mapScale() );
 
  213    tempRenderContext->setMapToPixel( 
QgsMapToPixel( 1 / ( 
settings.mmPerMapUnit() * tempRenderContext->scaleFactor() ) ) );
 
  216    tempRenderContext->setPainter( ctx ? ctx->
painter : nullptr );
 
  221    tempRenderContext->setExpressionContext( expContext );
 
  222    context = tempRenderContext.get();
 
  226  const QString minLabel = labelForMinimum();
 
  227  const QString maxLabel = labelForMaximum();
 
  232  double minHeightMm = 0;
 
  233  double minWidthMm = 0;
 
  234  double rampHeight = 0;
 
  235  double rampWidth = 0;
 
  241      rampHeight = ctx && ctx->
patchSize.height() > 0 ? std::max( minHeightMm / 2, ctx->
patchSize.height() ) : std::max( minHeightMm, 
settings.symbolSize().height() );
 
  242      rampWidth = patchWidth;
 
  249      rampHeight = patchHeight;
 
  250      rampWidth = std::max( minWidthMm, patchWidth );
 
  256    const double currentYCoord = ctx->
top;
 
  264      opacity = layer->opacity();
 
  269    double rampLeftMm = 0;
 
  270    const double rampTopMm = currentYCoord;
 
  271    switch ( 
settings.symbolAlignment() )
 
  283    p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
 
  285    QLinearGradient gradient;
 
  290        const double gradientTop = rampTopMm * dotsPerMM;
 
  291        const double gradientBottom = gradientTop + rampHeight * dotsPerMM;
 
  299        const double gradientLeft = rampLeftMm * dotsPerMM;
 
  300        const double gradientRight = gradientLeft + rampWidth * dotsPerMM;
 
  318      pen.setColor( 
settings.rasterStrokeColor() );
 
  319      pen.setWidthF( 
settings.rasterStrokeWidth() * dotsPerMM );
 
  320      pen.setJoinStyle( Qt::MiterJoin );
 
  325      ctx->
painter->setPen( Qt::NoPen );
 
  328    p->setBrush( QBrush( gradient ) );
 
  329    p->drawRect( rampLeftMm * dotsPerMM, rampTopMm * dotsPerMM, rampWidth * dotsPerMM, rampHeight * dotsPerMM );
 
  332  double labelHeight = 0;
 
  338      const double currentYCoord = ctx->
top;
 
  347      p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
 
  349      double labelXMin = 0;
 
  350      double labelXMax = 0;
 
  358      switch ( 
settings.symbolAlignment() )
 
  372      const QRectF textRect( labelXMin * dotsPerMM, labelYMin * dotsPerMM, ( labelXMax - labelXMin ) * dotsPerMM, labelHeight * dotsPerMM );
 
  390  return QSizeF( rampWidth, rampHeight + labelHeight );
 
 
  395  if ( !mRamp || mSettings.
orientation() == Qt::Horizontal )
 
  402  std::unique_ptr< QgsRenderContext > tempRenderContext;
 
  407    tempRenderContext = std::make_unique< QgsRenderContext >();
 
  410    tempRenderContext->setScaleFactor( 
settings.dpi() / 25.4 );
 
  411    tempRenderContext->setRendererScale( 
settings.mapScale() );
 
  413    tempRenderContext->setMapToPixel( 
QgsMapToPixel( 1 / ( 
settings.mmPerMapUnit() * tempRenderContext->scaleFactor() ) ) );
 
  416    tempRenderContext->setPainter( ctx ? ctx->
painter : nullptr );
 
  421    tempRenderContext->setExpressionContext( expContext );
 
  422    context = tempRenderContext.get();
 
  427  const QString minLabel = labelForMinimum();
 
  428  const QString maxLabel = labelForMaximum();
 
  430  const double rampHeight = symbolSize.height();
 
  431  const double rampWidth = symbolSize.width();
 
  432  double textWidth = 0;
 
  433  double textHeight = 0;
 
  437    const double currentYCoord = ctx->
top;
 
  446    p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
 
  448    double labelXMin = 0;
 
  449    double labelXMax = 0;
 
  450    switch ( 
settings.symbolAlignment() )
 
  471    const QRectF textRect( labelXMin * dotsPerMM, currentYCoord * dotsPerMM, ( labelXMax - labelXMin ) * dotsPerMM, rampHeight * dotsPerMM );
 
  483    textHeight = rampHeight;
 
  486  return QSizeF( textWidth, textHeight );
 
 
  496  const QPixmap icon = 
data( Qt::DecorationRole ).value<QPixmap>();
 
  498  if ( ! icon.isNull() )
 
  500    const QImage image( icon.toImage() );
 
  501    QByteArray byteArray;
 
  502    QBuffer buffer( &byteArray );
 
  503    image.save( &buffer, 
"PNG" );
 
  504    const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
 
  505    json[ QStringLiteral( 
"icon" ) ] = base64;
 
  508  json [ QStringLiteral( 
"min" ) ] = mMinimumValue;
 
  509  json [ QStringLiteral( 
"max" ) ] = mMaximumValue;
 
 
@ PreferVector
Prefer vector-based rendering, when the result will still be visually near-identical to a raster-base...
 
@ Symbol
Symbol icon (excluding label)
 
@ SymbolLabel
Symbol label (excluding icon)
 
@ Rectangle
Text within rectangle layout mode.
 
@ Antialiasing
Use antialiasing while drawing.
 
Settings for a color ramp legend node.
 
void setMaximumLabel(const QString &label)
Sets the label for the maximum value on the ramp.
 
const QgsNumericFormat * numericFormat() const
Returns the numeric format used for numbers in the scalebar.
 
QString maximumLabel() const
Returns the label for the maximum value on the ramp.
 
QString suffix() const
Returns the suffix to show after legend text.
 
@ MaximumToMinimum
Maximum value on bottom, minimum value on top.
 
@ MinimumToMaximum
Minimum value on bottom, maximum value on top.
 
QString prefix() const
Returns the prefix to show before legend text.
 
Qt::Orientation orientation() const
Returns the ramp orientation (i.e.
 
QgsColorRampLegendNodeSettings::Direction direction() const
Returns the direction of the ramp.
 
QgsTextFormat textFormat() const
Returns the text format used to render text in the legend item.
 
void setMinimumLabel(const QString &label)
Sets the label for the minimum value on the ramp.
 
QString minimumLabel() const
Returns the label for the minimum value on the ramp.
 
QSizeF drawSymbolText(const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize) const override
Draws label on the right side of the item.
 
const QgsColorRamp * ramp() const
Returns the color ramp used by the node.
 
QSize iconSize() const
Returns the icon size, which is how large the ramp will render in a layer tree widget.
 
void setSettings(const QgsColorRampLegendNodeSettings &settings)
Sets the node's settings.
 
QgsColorRampLegendNode(QgsLayerTreeLayer *nodeLayer, QgsColorRamp *ramp, const QString &minimumLabel, const QString &maximumLabel, QObject *parent=nullptr, const QString &key=QString(), const QString &parentKey=QString())
Constructor for QgsColorRampLegendNode.
 
QJsonObject exportSymbolToJson(const QgsLegendSettings &settings, const QgsRenderContext &context) const override
Adds a symbol in base64 string within a JSON object with the key "icon".
 
QgsColorRampLegendNodeSettings settings() const
Returns the node's settings.
 
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.
 
Abstract base class for color ramps.
 
static QString typeString()
Returns the string identifier for QgsCptCityColorRamp.
 
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 appendScopes(const QList< QgsExpressionContextScope * > &scopes)
Appends a list of scopes to the end of the context.
 
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
 
static QString typeString()
Returns the string identifier for QgsGradientColorRamp.
 
void addStopsToGradient(QGradient *gradient, double opacity=1) const
Copy color ramp stops to a QGradient.
 
Layer tree node points to a map layer.
 
An abstract interface for legend items returned from QgsMapLayerLegend implementation.
 
@ ColorRampLegend
Color ramp legend.
 
@ 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)
 
QgsLayerTreeLayer * mLayerNode
 
QgsLayerTreeLayer * layerNode() const
Returns pointer to the parent layer node.
 
static int scaleIconSize(int standardSize)
Scales an layer tree model icon size to compensate for display pixel density, making the icon size hi...
 
Stores the appearance and layout settings for legend drawing with QgsLegendRenderer.
 
Base class for all map layer types.
 
Perform transforms between map coordinates and device coordinates.
 
A context for numeric formats.
 
Contains information about the context of a rendering operation.
 
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
 
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
 
Scoped object for saving and restoring a QPainter object's state.
 
static QPixmap colorRampPreviewPixmap(QgsColorRamp *ramp, QSize size, int padding=0, Qt::Orientation direction=Qt::Horizontal, bool flipDirection=false, bool drawTransparentBackground=true)
Returns a pixmap preview for a color ramp.
 
Container for all settings relating to text rendering.
 
bool isValid() const
Returns true if the format is valid.
 
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 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 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 Qgis::TextHorizontalAlignment convertQtHAlignment(Qt::Alignment alignment)
Converts a Qt horizontal alignment flag to a Qgis::TextHorizontalAlignment value.
 
#define Q_NOWARN_DEPRECATED_POP
 
#define Q_NOWARN_DEPRECATED_PUSH
 
QPainter * painter
Painter.
 
double top
Top y-position of legend item.
 
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.