32#include "moc_qgscolorramplegendnode.cpp"
34using namespace Qt::StringLiterals;
37 QgsLayerTreeLayer *nodeLayer,
QgsColorRamp *
ramp,
const QString &minimumLabel,
const QString &maximumLabel, QObject *parent,
const QString &key,
const QString &parentKey
42 , mParentKey( parentKey )
44 mSettings.setMinimumLabel( minimumLabel );
45 mSettings.setMaximumLabel( maximumLabel );
56 , mMinimumValue( minimumValue )
57 , mMaximumValue( maximumValue )
59 , mParentKey( parentKey )
69 connect( nodeLayer, &QObject::destroyed,
this, [
this]() {
mLayerNode =
nullptr; } );
87QString QgsColorRampLegendNode::labelForMinimum()
const
96QString QgsColorRampLegendNode::labelForMaximum()
const
98 if ( !mSettings.maximumLabel().isEmpty() )
99 return mSettings.prefix() + mSettings.maximumLabel() + mSettings.suffix();
101 const QgsNumericFormatContext numericContext;
102 return mSettings.prefix() + mSettings.numericFormat()->formatDouble( mMaximumValue, numericContext ) + mSettings.suffix();
107 if ( role == Qt::DisplayRole )
111 else if ( role == Qt::EditRole )
115 else if ( role == Qt::DecorationRole )
117 if ( mPixmap.isNull() || mPixmap.size() != mIconSize )
119 const QFont font =
data( Qt::FontRole ).value< QFont >();
121 const QString minLabel = labelForMinimum();
122 const QString maxLabel = labelForMaximum();
124 const QFontMetrics fm( font );
126 const QRect minBoundingRect = fm.boundingRect( minLabel );
127 const QRect maxBoundingRect = fm.boundingRect( maxLabel );
129 const int minLabelWidth = minBoundingRect.width();
130 const int maxLabelWidth = maxBoundingRect.width();
131 const int maxTextWidth = std::max( minLabelWidth, maxLabelWidth );
132 const int labelGapFromRamp = fm.boundingRect( u
"x"_s ).width();
133 const int extraAllowance = labelGapFromRamp * 0.4;
136 switch ( mSettings.orientation() )
139 labelRect = QRect( mIconSize.width() + labelGapFromRamp, 0, maxTextWidth + extraAllowance, mIconSize.height() );
140 mPixmap = QPixmap( mIconSize.width() + maxTextWidth + labelGapFromRamp + extraAllowance, mIconSize.height() );
141 rampSize = mIconSize;
146 = QRect( 0, mIconSize.height() + labelGapFromRamp, std::max( mIconSize.width(), minLabelWidth + maxLabelWidth + labelGapFromRamp ), std::max( minBoundingRect.height(), maxBoundingRect.height() ) + extraAllowance );
147 mPixmap = QPixmap( std::max( mIconSize.width(), minLabelWidth + maxLabelWidth + labelGapFromRamp ), mIconSize.height() + maxTextWidth + labelGapFromRamp + extraAllowance );
148 rampSize = QSize( labelRect.width(), mIconSize.height() );
152 mPixmap.fill( Qt::transparent );
162 mSettings.orientation(),
169 pix = QPixmap( rampSize );
170 pix.fill( Qt::transparent );
173 QPainter p( &mPixmap );
174 p.drawPixmap( 0, 0, pix );
176 p.setPen( qApp->palette().color( QPalette::Text ) );
178 switch ( mSettings.orientation() )
215 std::unique_ptr< QgsRenderContext > tempRenderContext;
220 tempRenderContext = std::make_unique< QgsRenderContext >();
223 tempRenderContext->setScaleFactor(
settings.dpi() / 25.4 );
224 tempRenderContext->setRendererScale(
settings.mapScale() );
226 tempRenderContext->setMapToPixel(
QgsMapToPixel( 1 / (
settings.mmPerMapUnit() * tempRenderContext->scaleFactor() ) ) );
229 tempRenderContext->setPainter( ctx ? ctx->
painter :
nullptr );
234 tempRenderContext->setExpressionContext( expContext );
235 context = tempRenderContext.get();
239 const QString minLabel = labelForMinimum();
240 const QString maxLabel = labelForMaximum();
245 double minHeightMm = 0;
246 double minWidthMm = 0;
247 double rampHeight = 0;
248 double rampWidth = 0;
249 switch ( mSettings.orientation() )
254 rampHeight = ctx && ctx->
patchSize.height() > 0 ? std::max( minHeightMm / 2, ctx->
patchSize.height() ) : std::max( minHeightMm,
settings.symbolSize().height() );
255 rampWidth = patchWidth;
261 rampHeight = patchHeight;
262 rampWidth = std::max( minWidthMm, patchWidth );
268 const double currentYCoord = ctx->
top;
276 opacity = layer->opacity();
281 double rampLeftMm = 0;
282 const double rampTopMm = currentYCoord;
283 switch (
settings.symbolAlignment() )
295 p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
297 QLinearGradient gradient;
298 switch ( mSettings.orientation() )
302 const double gradientTop = rampTopMm * dotsPerMM;
303 const double gradientBottom = gradientTop + rampHeight * dotsPerMM;
311 const double gradientLeft = rampLeftMm * dotsPerMM;
312 const double gradientRight = gradientLeft + rampWidth * dotsPerMM;
330 pen.setColor(
settings.rasterStrokeColor() );
331 pen.setWidthF(
settings.rasterStrokeWidth() * dotsPerMM );
332 pen.setJoinStyle( Qt::MiterJoin );
337 ctx->
painter->setPen( Qt::NoPen );
340 p->setBrush( QBrush( gradient ) );
341 p->drawRect( rampLeftMm * dotsPerMM, rampTopMm * dotsPerMM, rampWidth * dotsPerMM, rampHeight * dotsPerMM );
344 double labelHeight = 0;
345 if ( mSettings.orientation() == Qt::Horizontal )
350 const double currentYCoord = ctx->
top;
359 p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
361 double labelXMin = 0;
362 double labelXMax = 0;
366 const double labelYMin = currentYCoord
372 switch (
settings.symbolAlignment() )
386 const QRectF textRect( labelXMin * dotsPerMM, labelYMin * dotsPerMM, ( labelXMax - labelXMin ) * dotsPerMM, labelHeight * dotsPerMM );
402 return QSizeF( rampWidth, rampHeight + labelHeight );
407 if ( !mRamp || mSettings.orientation() == Qt::Horizontal )
414 std::unique_ptr< QgsRenderContext > tempRenderContext;
419 tempRenderContext = std::make_unique< QgsRenderContext >();
422 tempRenderContext->setScaleFactor(
settings.dpi() / 25.4 );
423 tempRenderContext->setRendererScale(
settings.mapScale() );
425 tempRenderContext->setMapToPixel(
QgsMapToPixel( 1 / (
settings.mmPerMapUnit() * tempRenderContext->scaleFactor() ) ) );
428 tempRenderContext->setPainter( ctx ? ctx->
painter :
nullptr );
433 tempRenderContext->setExpressionContext( expContext );
434 context = tempRenderContext.get();
439 const QString minLabel = labelForMinimum();
440 const QString maxLabel = labelForMaximum();
442 const double rampHeight = symbolSize.height();
443 const double rampWidth = symbolSize.width();
444 double textWidth = 0;
445 double textHeight = 0;
449 const double currentYCoord = ctx->
top;
458 p->scale( 1.0 / dotsPerMM, 1.0 / dotsPerMM );
460 double labelXMin = 0;
461 double labelXMax = 0;
462 switch (
settings.symbolAlignment() )
485 const QRectF textRect( labelXMin * dotsPerMM, currentYCoord * dotsPerMM, ( labelXMax - labelXMin ) * dotsPerMM, rampHeight * dotsPerMM );
511 textHeight = rampHeight;
514 return QSizeF( textWidth, textHeight );
524 const QPixmap icon =
data( Qt::DecorationRole ).value<QPixmap>();
526 if ( !icon.isNull() )
528 const QImage image( icon.toImage() );
529 QByteArray byteArray;
530 QBuffer buffer( &byteArray );
531 image.save( &buffer,
"PNG" );
532 const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
533 json[u
"icon"_s] = base64;
536 json[u
"min"_s] = mMinimumValue;
537 json[u
"max"_s] = 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.