Skip to content

Commit 5410774

Browse files
committed
Add icons in json for markers
1 parent 9651efa commit 5410774

File tree

2 files changed

+71
-2
lines changed

2 files changed

+71
-2
lines changed

src/core/layertree/qgslayertreemodellegendnode.cpp

+61-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ QgsLayerTreeModelLegendNode::ItemMetrics QgsLayerTreeModelLegendNode::draw( cons
7373

7474
void QgsLayerTreeModelLegendNode::draw( const QgsLegendSettings &settings, QJsonObject &json )
7575
{
76+
drawSymbol( settings, json );
7677
drawSymbolText( settings, json );
77-
json[ "symbol" ] = "TODO";
7878
}
7979

8080
QSizeF QgsLayerTreeModelLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const
@@ -89,6 +89,19 @@ QSizeF QgsLayerTreeModelLegendNode::drawSymbol( const QgsLegendSettings &setting
8989
return settings.symbolSize();
9090
}
9191

92+
void QgsLayerTreeModelLegendNode::drawSymbol( const QgsLegendSettings &settings, QJsonObject &json ) const
93+
{
94+
QIcon icon = data( Qt::DecorationRole ).value<QIcon>();
95+
if ( icon.isNull() )
96+
return;
97+
98+
QImage image( icon.pixmap( settings.symbolSize().width(), settings.symbolSize().height() ).toImage() );
99+
QByteArray byteArray;
100+
QBuffer buffer( &byteArray );
101+
image.save( &buffer, "PNG" );
102+
QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
103+
json[ "symbol" ] = base64;
104+
}
92105

93106
QSizeF QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize ) const
94107
{
@@ -134,7 +147,7 @@ QSizeF QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings &set
134147
return labelSize;
135148
}
136149

137-
void QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings &settings, QJsonObject &json ) const
150+
void QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings &, QJsonObject &json ) const
138151
{
139152
QgsExpressionContext tempContext;
140153
const QString text = data( Qt::DisplayRole ).toString();
@@ -502,6 +515,40 @@ QSizeF QgsSymbolLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemC
502515
std::max( height + 2 * heightOffset, static_cast< double >( settings.symbolSize().height() ) ) );
503516
}
504517

518+
void QgsSymbolLegendNode::drawSymbol( const QgsLegendSettings &settings, QJsonObject &json ) const
519+
{
520+
QgsSymbol *s = mItem.symbol();
521+
if ( !s )
522+
{
523+
return;
524+
}
525+
526+
QgsRenderContext context;
527+
context.setScaleFactor( settings.dpi() / 25.4 );
528+
context.setRendererScale( settings.mapScale() );
529+
context.setMapToPixel( QgsMapToPixel( 1 / ( settings.mmPerMapUnit() * context.scaleFactor() ) ) );
530+
context.setForceVectorOutput( true );
531+
532+
// setup a minimal expression context
533+
QgsExpressionContext expContext;
534+
expContext.appendScopes( QgsExpressionContextUtils::globalProjectLayerScopes( nullptr ) );
535+
context.setExpressionContext( expContext );
536+
537+
QImage tempImage = QImage( minimumIconSize(), QImage::Format_ARGB32 );
538+
tempImage.fill( Qt::transparent );
539+
QPainter imagePainter( &tempImage );
540+
imagePainter.setRenderHint( QPainter::Antialiasing );
541+
context.setPainter( &imagePainter );
542+
543+
QPixmap pix = QgsSymbolLayerUtils::symbolPreviewPixmap( mItem.symbol(), minimumIconSize(), 0, &context );
544+
545+
QByteArray byteArray;
546+
QBuffer buffer( &byteArray );
547+
QImage img( pix.toImage().convertToFormat( QImage::Format_ARGB32_Premultiplied ) );
548+
img.save( &buffer, "PNG" );
549+
QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
550+
json[ "icon" ] = base64;
551+
}
505552

506553
void QgsSymbolLegendNode::setEmbeddedInParent( bool embedded )
507554
{
@@ -610,6 +657,10 @@ QSizeF QgsImageLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemCo
610657
return settings.wmsLegendSize();
611658
}
612659

660+
void QgsImageLegendNode::drawSymbol( const QgsLegendSettings &, QJsonObject & ) const
661+
{
662+
}
663+
613664
// -------------------------------------------------------------------------
614665

615666
QgsRasterSymbolLegendNode::QgsRasterSymbolLegendNode( QgsLayerTreeLayer *nodeLayer, const QColor &color, const QString &label, QObject *parent )
@@ -666,6 +717,10 @@ QSizeF QgsRasterSymbolLegendNode::drawSymbol( const QgsLegendSettings &settings,
666717
return settings.symbolSize();
667718
}
668719

720+
void QgsRasterSymbolLegendNode::drawSymbol( const QgsLegendSettings &, QJsonObject & ) const
721+
{
722+
}
723+
669724
// -------------------------------------------------------------------------
670725

671726
QgsWmsLegendNode::QgsWmsLegendNode( QgsLayerTreeLayer *nodeLayer, QObject *parent )
@@ -734,6 +789,10 @@ QSizeF QgsWmsLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemCont
734789
return settings.wmsLegendSize();
735790
}
736791

792+
void QgsWmsLegendNode::drawSymbol( const QgsLegendSettings &, QJsonObject & ) const
793+
{
794+
}
795+
737796
/* private */
738797
QImage QgsWmsLegendNode::renderMessage( const QString &msg ) const
739798
{

src/core/layertree/qgslayertreemodellegendnode.h

+10
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
121121
*/
122122
virtual QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const;
123123

124+
virtual void drawSymbol( const QgsLegendSettings &settings, QJsonObject &json ) const;
125+
124126
/**
125127
* Draws label on the right side of the item
126128
* \param settings Legend layout configuration
@@ -179,6 +181,8 @@ class CORE_EXPORT QgsSymbolLegendNode : public QgsLayerTreeModelLegendNode
179181

180182
QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
181183

184+
void drawSymbol( const QgsLegendSettings &settings, QJsonObject &json ) const override;
185+
182186
void setEmbeddedInParent( bool embedded ) override;
183187

184188
void setUserLabel( const QString &userLabel ) override { mUserLabel = userLabel; updateLabel(); }
@@ -358,6 +362,8 @@ class CORE_EXPORT QgsImageLegendNode : public QgsLayerTreeModelLegendNode
358362

359363
QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
360364

365+
void drawSymbol( const QgsLegendSettings &settings, QJsonObject &json ) const override;
366+
361367
private:
362368
QImage mImage;
363369
};
@@ -387,6 +393,8 @@ class CORE_EXPORT QgsRasterSymbolLegendNode : public QgsLayerTreeModelLegendNode
387393

388394
QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
389395

396+
void drawSymbol( const QgsLegendSettings &settings, QJsonObject &json ) const override;
397+
390398
private:
391399
QColor mColor;
392400
QString mLabel;
@@ -417,6 +425,8 @@ class CORE_EXPORT QgsWmsLegendNode : public QgsLayerTreeModelLegendNode
417425

418426
QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
419427

428+
void drawSymbol( const QgsLegendSettings &settings, QJsonObject &json ) const override;
429+
420430
void invalidateMapBasedData() override;
421431

422432
private slots:

0 commit comments

Comments
 (0)