31#include "moc_qgscolorramplegendnode.cpp"
37 , mParentKey( parentKey )
39 mSettings.setMinimumLabel( minimumLabel );
40 mSettings.setMaximumLabel( maximumLabel );
49 , mMinimumValue( minimumValue )
50 , mMaximumValue( maximumValue )
52 , mParentKey( parentKey )
62 connect( nodeLayer, &QObject::destroyed,
this, [
this]() {
mLayerNode =
nullptr; } );
80QString QgsColorRampLegendNode::labelForMinimum()
const
89QString QgsColorRampLegendNode::labelForMaximum()
const
91 if ( !mSettings.maximumLabel().isEmpty() )
92 return mSettings.prefix() + mSettings.maximumLabel() + mSettings.suffix();
94 const QgsNumericFormatContext numericContext;
95 return mSettings.prefix() + mSettings.numericFormat()->formatDouble( mMaximumValue, numericContext ) + mSettings.suffix();
100 if ( role == Qt::DisplayRole )
104 else if ( role == Qt::EditRole )
108 else if ( role == Qt::DecorationRole )
110 if ( mPixmap.isNull() || mPixmap.size() != mIconSize )
112 const QFont font =
data( Qt::FontRole ).value< QFont >();
114 const QString minLabel = labelForMinimum();
115 const QString maxLabel = labelForMaximum();
117 const QFontMetrics fm( font );
119 const QRect minBoundingRect = fm.boundingRect( minLabel );
120 const QRect maxBoundingRect = fm.boundingRect( maxLabel );
122 const int minLabelWidth = minBoundingRect.width();
123 const int maxLabelWidth = maxBoundingRect.width();
124 const int maxTextWidth = std::max( minLabelWidth, maxLabelWidth );
125 const int labelGapFromRamp = fm.boundingRect( QStringLiteral(
"x" ) ).width();
126 const int extraAllowance = labelGapFromRamp * 0.4;
129 switch ( mSettings.orientation() )
132 labelRect = QRect( mIconSize.width() + labelGapFromRamp, 0, maxTextWidth + extraAllowance, mIconSize.height() );
133 mPixmap = QPixmap( mIconSize.width() + maxTextWidth + labelGapFromRamp + extraAllowance, mIconSize.height() );
134 rampSize = mIconSize;
138 labelRect = QRect( 0, mIconSize.height() + labelGapFromRamp, std::max( mIconSize.width(), minLabelWidth + maxLabelWidth + labelGapFromRamp ), std::max( minBoundingRect.height(),
139 maxBoundingRect.height() ) + extraAllowance );
140 mPixmap = QPixmap( std::max( mIconSize.width(), minLabelWidth + maxLabelWidth + labelGapFromRamp ), mIconSize.height() + maxTextWidth + labelGapFromRamp + extraAllowance );
141 rampSize = QSize( labelRect.width(), mIconSize.height() );
145 mPixmap.fill( Qt::transparent );
158 pix = QPixmap( rampSize );
159 pix.fill( Qt::transparent );
162 QPainter p( &mPixmap );
163 p.drawPixmap( 0, 0, pix );
165 p.setPen( qApp->palette().color( QPalette::Text ) );
167 switch ( mSettings.orientation() )
204 std::unique_ptr< QgsRenderContext > tempRenderContext;
209 tempRenderContext = std::make_unique< QgsRenderContext >();
212 tempRenderContext->setScaleFactor(
settings.dpi() / 25.4 );
213 tempRenderContext->setRendererScale(
settings.mapScale() );
215 tempRenderContext->setMapToPixel(
QgsMapToPixel( 1 / (
settings.mmPerMapUnit() * tempRenderContext->scaleFactor() ) ) );
218 tempRenderContext->setPainter( ctx ? ctx->
painter :
nullptr );
223 tempRenderContext->setExpressionContext( expContext );
224 context = tempRenderContext.get();
228 const QString minLabel = labelForMinimum();
229 const QString maxLabel = labelForMaximum();
234 double minHeightMm = 0;
235 double minWidthMm = 0;
236 double rampHeight = 0;
237 double rampWidth = 0;
238 switch ( mSettings.orientation() )
243 rampHeight = ctx && ctx->
patchSize.height() > 0 ? std::max( minHeightMm / 2, ctx->
patchSize.height() ) : std::max( minHeightMm,
settings.symbolSize().height() );
244 rampWidth = patchWidth;
251 rampHeight = patchHeight;
252 rampWidth = std::max( minWidthMm, patchWidth );
258 const double currentYCoord = ctx->
top;
266 opacity = layer->opacity();
271 double rampLeftMm = 0;
272 const double rampTopMm = currentYCoord;
273 switch (
settings.symbolAlignment() )
285 p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
287 QLinearGradient gradient;
288 switch ( mSettings.orientation() )
292 const double gradientTop = rampTopMm * dotsPerMM;
293 const double gradientBottom = gradientTop + rampHeight * dotsPerMM;
301 const double gradientLeft = rampLeftMm * dotsPerMM;
302 const double gradientRight = gradientLeft + rampWidth * dotsPerMM;
320 pen.setColor(
settings.rasterStrokeColor() );
321 pen.setWidthF(
settings.rasterStrokeWidth() * dotsPerMM );
322 pen.setJoinStyle( Qt::MiterJoin );
327 ctx->
painter->setPen( Qt::NoPen );
330 p->setBrush( QBrush( gradient ) );
331 p->drawRect( rampLeftMm * dotsPerMM, rampTopMm * dotsPerMM, rampWidth * dotsPerMM, rampHeight * dotsPerMM );
334 double labelHeight = 0;
335 if ( mSettings.orientation() == Qt::Horizontal )
340 const double currentYCoord = ctx->
top;
349 p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
351 double labelXMin = 0;
352 double labelXMax = 0;
360 switch (
settings.symbolAlignment() )
374 const QRectF textRect( labelXMin * dotsPerMM, labelYMin * dotsPerMM, ( labelXMax - labelXMin ) * dotsPerMM, labelHeight * dotsPerMM );
392 return QSizeF( rampWidth, rampHeight + labelHeight );
397 if ( !mRamp || mSettings.orientation() == Qt::Horizontal )
404 std::unique_ptr< QgsRenderContext > tempRenderContext;
409 tempRenderContext = std::make_unique< QgsRenderContext >();
412 tempRenderContext->setScaleFactor(
settings.dpi() / 25.4 );
413 tempRenderContext->setRendererScale(
settings.mapScale() );
415 tempRenderContext->setMapToPixel(
QgsMapToPixel( 1 / (
settings.mmPerMapUnit() * tempRenderContext->scaleFactor() ) ) );
418 tempRenderContext->setPainter( ctx ? ctx->
painter :
nullptr );
423 tempRenderContext->setExpressionContext( expContext );
424 context = tempRenderContext.get();
429 const QString minLabel = labelForMinimum();
430 const QString maxLabel = labelForMaximum();
432 const double rampHeight = symbolSize.height();
433 const double rampWidth = symbolSize.width();
434 double textWidth = 0;
435 double textHeight = 0;
439 const double currentYCoord = ctx->
top;
448 p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
450 double labelXMin = 0;
451 double labelXMax = 0;
452 switch (
settings.symbolAlignment() )
473 const QRectF textRect( labelXMin * dotsPerMM, currentYCoord * dotsPerMM, ( labelXMax - labelXMin ) * dotsPerMM, rampHeight * dotsPerMM );
485 textHeight = rampHeight;
488 return QSizeF( textWidth, textHeight );
498 const QPixmap icon =
data( Qt::DecorationRole ).value<QPixmap>();
500 if ( ! icon.isNull() )
502 const QImage image( icon.toImage() );
503 QByteArray byteArray;
504 QBuffer buffer( &byteArray );
505 image.save( &buffer,
"PNG" );
506 const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
507 json[ QStringLiteral(
"icon" ) ] = base64;
510 json [ QStringLiteral(
"min" ) ] = mMinimumValue;
511 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.
const QgsNumericFormat * numericFormat() const
Returns the numeric format used for numbers in the scalebar.
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.
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.
@ 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
QgsLayerTreeModelLegendNode(QgsLayerTreeLayer *nodeL, QObject *parent=nullptr)
Construct the node with pointer to its parent layer node.
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.