Skip to content

Commit dee5882

Browse files
authoredMay 13, 2020
Merge pull request #36370 from pblottiere/legend_json
Update the API to export a legend in JSON
2 parents 55efa3c + 3cfe500 commit dee5882

File tree

10 files changed

+118
-78
lines changed

10 files changed

+118
-78
lines changed
 

‎python/core/auto_generated/layertree/qgslayertreemodellegendnode.sip.in

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -160,14 +160,13 @@ Default implementation calls drawSymbol() and drawSymbolText() methods.
160160
If ctx is ``None``, this is just first stage when preparing layout - without actual rendering.
161161
%End
162162

163-
void exportToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json );
163+
QJsonObject exportToJson( const QgsLegendSettings &settings, const QgsRenderContext &context );
164164
%Docstring
165165
Entry point called from QgsLegendRenderer to do the rendering in a
166166
JSON object.
167167

168168
:param settings: Legend layout configuration
169169
:param context: Rendering context
170-
:param json: The json object to update
171170

172171
.. versionadded:: 3.8
173172
%End
@@ -183,13 +182,12 @@ Draws symbol on the left side of the item
183182
:return: Real size of the symbol (may be bigger than "normal" symbol size from settings)
184183
%End
185184

186-
virtual void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const;
185+
virtual QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const;
187186
%Docstring
188187
Adds a symbol in base64 string within a JSON object with the key "icon".
189188

190189
:param settings: Legend layout configuration
191190
:param context: Rendering context
192-
:param json: The json object to update
193191

194192
.. versionadded:: 3.8
195193
%End
@@ -203,16 +201,6 @@ Draws label on the right side of the item
203201
:param symbolSize: Real size of the associated symbol - used for correct positioning when rendering
204202

205203
:return: Size of the label (may span multiple lines)
206-
%End
207-
208-
void exportSymbolTextToJson( const QgsLegendSettings &settings, QJsonObject &json ) const;
209-
%Docstring
210-
Adds a label in a JSON object with the key "title".
211-
212-
:param settings: Legend layout configuration
213-
:param json: The json object to update
214-
215-
.. versionadded:: 3.8
216204
%End
217205

218206
signals:
@@ -269,7 +257,7 @@ Constructor for QgsSymbolLegendNode.
269257
virtual QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const;
270258

271259

272-
virtual void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const;
260+
virtual QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const;
273261

274262

275263
virtual void setEmbeddedInParent( bool embedded );
@@ -519,7 +507,7 @@ Constructor for QgsImageLegendNode.
519507
virtual QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const;
520508

521509

522-
virtual void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const;
510+
virtual QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const;
523511

524512

525513
};
@@ -553,7 +541,7 @@ Constructor for QgsRasterSymbolLegendNode.
553541
virtual QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const;
554542

555543

556-
virtual void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const;
544+
virtual QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const;
557545

558546

559547
};
@@ -586,7 +574,7 @@ Constructor for QgsWmsLegendNode.
586574
virtual QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const;
587575

588576

589-
virtual void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const;
577+
virtual QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const;
590578

591579

592580
virtual void invalidateMapBasedData();

‎python/core/auto_generated/qgslegendrenderer.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Draws the legend using a given render ``context``. The legend will occupy the ar
8181
.. versionadded:: 3.6
8282
%End
8383

84-
void exportLegendToJson( const QgsRenderContext &context, QJsonObject &json );
84+
QJsonObject exportLegendToJson( const QgsRenderContext &context );
8585
%Docstring
8686
Renders the legend in a ``json`` object.
8787

‎src/core/layertree/qgslayertreemodellegendnode.cpp

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,12 @@ QgsLayerTreeModelLegendNode::ItemMetrics QgsLayerTreeModelLegendNode::draw( cons
8484
return im;
8585
}
8686

87-
void QgsLayerTreeModelLegendNode::exportToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json )
87+
QJsonObject QgsLayerTreeModelLegendNode::exportToJson( const QgsLegendSettings &settings, const QgsRenderContext &context )
8888
{
89-
exportSymbolToJson( settings, context, json );
90-
exportSymbolTextToJson( settings, json );
89+
QJsonObject json = exportSymbolToJson( settings, context );
90+
const QString text = data( Qt::DisplayRole ).toString();
91+
json[ QStringLiteral( "title" ) ] = text;
92+
return json;
9193
}
9294

9395
QSizeF QgsLayerTreeModelLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const
@@ -130,18 +132,21 @@ QSizeF QgsLayerTreeModelLegendNode::drawSymbol( const QgsLegendSettings &setting
130132
return size;
131133
}
132134

133-
void QgsLayerTreeModelLegendNode::exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &, QJsonObject &json ) const
135+
QJsonObject QgsLayerTreeModelLegendNode::exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext & ) const
134136
{
135137
const QIcon icon = data( Qt::DecorationRole ).value<QIcon>();
136138
if ( icon.isNull() )
137-
return;
139+
return QJsonObject();
138140

139141
const QImage image( icon.pixmap( settings.symbolSize().width(), settings.symbolSize().height() ).toImage() );
140142
QByteArray byteArray;
141143
QBuffer buffer( &byteArray );
142144
image.save( &buffer, "PNG" );
143145
const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
144-
json[ "icon" ] = base64;
146+
147+
QJsonObject json;
148+
json[ QStringLiteral( "icon" ) ] = base64;
149+
return json;
145150
}
146151

147152
QSizeF QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize ) const
@@ -225,12 +230,6 @@ QSizeF QgsLayerTreeModelLegendNode::drawSymbolText( const QgsLegendSettings &set
225230
return labelSize;
226231
}
227232

228-
void QgsLayerTreeModelLegendNode::exportSymbolTextToJson( const QgsLegendSettings &, QJsonObject &json ) const
229-
{
230-
const QString text = data( Qt::DisplayRole ).toString();
231-
json[ "title" ] = text;
232-
}
233-
234233
// -------------------------------------------------------------------------
235234

236235
QgsSymbolLegendNode::QgsSymbolLegendNode( QgsLayerTreeLayer *nodeLayer, const QgsLegendSymbolItem &item, QObject *parent )
@@ -661,12 +660,12 @@ QSizeF QgsSymbolLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemC
661660
std::max( height + 2 * heightOffset, static_cast< double >( desiredHeight ) ) );
662661
}
663662

664-
void QgsSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const
663+
QJsonObject QgsSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const
665664
{
666665
const QgsSymbol *s = mCustomSymbol ? mCustomSymbol.get() : mItem.symbol();
667666
if ( !s )
668667
{
669-
return;
668+
return QJsonObject();
670669
}
671670

672671

@@ -704,7 +703,10 @@ void QgsSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &settings,
704703
QBuffer buffer( &byteArray );
705704
img.save( &buffer, "PNG" );
706705
const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
707-
json[ "icon" ] = base64;
706+
707+
QJsonObject json;
708+
json[ QStringLiteral( "icon" ) ] = base64;
709+
return json;
708710
}
709711

710712
void QgsSymbolLegendNode::setEmbeddedInParent( bool embedded )
@@ -862,13 +864,16 @@ QSizeF QgsImageLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemCo
862864
return settings.wmsLegendSize();
863865
}
864866

865-
void QgsImageLegendNode::exportSymbolToJson( const QgsLegendSettings &, const QgsRenderContext &, QJsonObject &json ) const
867+
QJsonObject QgsImageLegendNode::exportSymbolToJson( const QgsLegendSettings &, const QgsRenderContext & ) const
866868
{
867869
QByteArray byteArray;
868870
QBuffer buffer( &byteArray );
869871
mImage.save( &buffer, "PNG" );
870872
const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
871-
json[ "icon" ] = base64;
873+
874+
QJsonObject json;
875+
json[ QStringLiteral( "icon" ) ] = base64;
876+
return json;
872877
}
873878

874879
// -------------------------------------------------------------------------
@@ -954,7 +959,7 @@ QSizeF QgsRasterSymbolLegendNode::drawSymbol( const QgsLegendSettings &settings,
954959
return size;
955960
}
956961

957-
void QgsRasterSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &, QJsonObject &json ) const
962+
QJsonObject QgsRasterSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext & ) const
958963
{
959964
QImage img = QImage( settings.symbolSize().toSize(), QImage::Format_ARGB32 );
960965
img.fill( Qt::transparent );
@@ -989,7 +994,10 @@ void QgsRasterSymbolLegendNode::exportSymbolToJson( const QgsLegendSettings &set
989994
QBuffer buffer( &byteArray );
990995
img.save( &buffer, "PNG" );
991996
const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
992-
json[ "icon" ] = base64;
997+
998+
QJsonObject json;
999+
json[ QStringLiteral( "icon" ) ] = base64;
1000+
return json;
9931001
}
9941002

9951003
// -------------------------------------------------------------------------
@@ -1078,13 +1086,16 @@ QSizeF QgsWmsLegendNode::drawSymbol( const QgsLegendSettings &settings, ItemCont
10781086
return settings.wmsLegendSize();
10791087
}
10801088

1081-
void QgsWmsLegendNode::exportSymbolToJson( const QgsLegendSettings &, const QgsRenderContext &, QJsonObject &json ) const
1089+
QJsonObject QgsWmsLegendNode::exportSymbolToJson( const QgsLegendSettings &, const QgsRenderContext & ) const
10821090
{
10831091
QByteArray byteArray;
10841092
QBuffer buffer( &byteArray );
10851093
mImage.save( &buffer, "PNG" );
10861094
const QString base64 = QString::fromLatin1( byteArray.toBase64().data() );
1087-
json[ "icon" ] = base64;
1095+
1096+
QJsonObject json;
1097+
json[ QStringLiteral( "icon" ) ] = base64;
1098+
return json;
10881099
}
10891100

10901101
/* private */

‎src/core/layertree/qgslayertreemodellegendnode.h

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,9 @@ class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
220220
* JSON object.
221221
* \param settings Legend layout configuration
222222
* \param context Rendering context
223-
* \param json The json object to update
224223
* \since QGIS 3.8
225224
*/
226-
void exportToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json );
225+
QJsonObject exportToJson( const QgsLegendSettings &settings, const QgsRenderContext &context );
227226

228227
/**
229228
* Draws symbol on the left side of the item
@@ -238,10 +237,9 @@ class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
238237
* Adds a symbol in base64 string within a JSON object with the key "icon".
239238
* \param settings Legend layout configuration
240239
* \param context Rendering context
241-
* \param json The json object to update
242240
* \since QGIS 3.8
243241
*/
244-
virtual void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const;
242+
virtual QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const;
245243

246244
/**
247245
* Draws label on the right side of the item
@@ -252,14 +250,6 @@ class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
252250
*/
253251
virtual QSizeF drawSymbolText( const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize ) const;
254252

255-
/**
256-
* Adds a label in a JSON object with the key "title".
257-
* \param settings Legend layout configuration
258-
* \param json The json object to update
259-
* \since QGIS 3.8
260-
*/
261-
void exportSymbolTextToJson( const QgsLegendSettings &settings, QJsonObject &json ) const;
262-
263253
signals:
264254
//! Emitted on internal data change so the layer tree model can forward the signal to views
265255
void dataChanged();
@@ -311,7 +301,7 @@ class CORE_EXPORT QgsSymbolLegendNode : public QgsLayerTreeModelLegendNode
311301

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

314-
void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const override;
304+
QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
315305

316306
void setEmbeddedInParent( bool embedded ) override;
317307

@@ -554,7 +544,7 @@ class CORE_EXPORT QgsImageLegendNode : public QgsLayerTreeModelLegendNode
554544

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

557-
void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const override;
547+
QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
558548

559549
private:
560550
QImage mImage;
@@ -585,7 +575,7 @@ class CORE_EXPORT QgsRasterSymbolLegendNode : public QgsLayerTreeModelLegendNode
585575

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

588-
void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const override;
578+
QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
589579

590580
private:
591581
QColor mColor;
@@ -617,7 +607,7 @@ class CORE_EXPORT QgsWmsLegendNode : public QgsLayerTreeModelLegendNode
617607

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

620-
void exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context, QJsonObject &json ) const override;
610+
QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
621611

622612
void invalidateMapBasedData() override;
623613

‎src/core/qgslegendrenderer.cpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,22 @@ void QgsLegendRenderer::drawLegend( QPainter *painter )
6868
paintAndDetermineSize( context );
6969
}
7070

71-
void QgsLegendRenderer::exportLegendToJson( const QgsRenderContext &context, QJsonObject &json )
71+
QJsonObject QgsLegendRenderer::exportLegendToJson( const QgsRenderContext &context )
7272
{
73+
QJsonObject json;
74+
7375
QgsLayerTreeGroup *rootGroup = mLegendModel->rootGroup();
7476
if ( !rootGroup )
75-
return;
77+
return json;
7678

79+
json = exportLegendToJson( context, rootGroup );
7780
json[QStringLiteral( "title" )] = mSettings.title();
78-
exportLegendToJson( context, rootGroup, json );
81+
return json;
7982
}
8083

81-
void QgsLegendRenderer::exportLegendToJson( const QgsRenderContext &context, QgsLayerTreeGroup *nodeGroup, QJsonObject &json )
84+
QJsonObject QgsLegendRenderer::exportLegendToJson( const QgsRenderContext &context, QgsLayerTreeGroup *nodeGroup )
8285
{
86+
QJsonObject json;
8387
QJsonArray nodes;
8488
const QList<QgsLayerTreeNode *> childNodes = nodeGroup->children();
8589
for ( QgsLayerTreeNode *node : childNodes )
@@ -90,17 +94,13 @@ void QgsLegendRenderer::exportLegendToJson( const QgsRenderContext &context, Qgs
9094
const QModelIndex idx = mLegendModel->node2index( nodeGroup );
9195
const QString text = mLegendModel->data( idx, Qt::DisplayRole ).toString();
9296

93-
QJsonObject group;
97+
QJsonObject group = exportLegendToJson( context, nodeGroup );
9498
group[ QStringLiteral( "type" ) ] = QStringLiteral( "group" );
9599
group[ QStringLiteral( "title" ) ] = text;
96-
exportLegendToJson( context, nodeGroup, group );
97100
nodes.append( group );
98101
}
99102
else if ( QgsLayerTree::isLayer( node ) )
100103
{
101-
QJsonObject group;
102-
group[ QStringLiteral( "type" ) ] = QStringLiteral( "layer" );
103-
104104
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
105105

106106
QString text;
@@ -117,27 +117,32 @@ void QgsLegendRenderer::exportLegendToJson( const QgsRenderContext &context, Qgs
117117

118118
if ( legendNodes.count() == 1 )
119119
{
120-
legendNodes.at( 0 )->exportToJson( mSettings, context, group );
120+
QJsonObject group = legendNodes.at( 0 )->exportToJson( mSettings, context );
121+
group[ QStringLiteral( "type" ) ] = QStringLiteral( "layer" );
121122
nodes.append( group );
122123
}
123124
else if ( legendNodes.count() > 1 )
124125
{
126+
QJsonObject group;
127+
group[ QStringLiteral( "type" ) ] = QStringLiteral( "layer" );
128+
group[ QStringLiteral( "title" ) ] = text;
129+
125130
QJsonArray symbols;
126131
for ( int j = 0; j < legendNodes.count(); j++ )
127132
{
128133
QgsLayerTreeModelLegendNode *legendNode = legendNodes.at( j );
129-
QJsonObject symbol;
130-
legendNode->exportToJson( mSettings, context, symbol );
134+
QJsonObject symbol = legendNode->exportToJson( mSettings, context );
131135
symbols.append( symbol );
132136
}
133-
group[ QStringLiteral( "title" ) ] = text;
134137
group[ QStringLiteral( "symbols" ) ] = symbols;
138+
135139
nodes.append( group );
136140
}
137141
}
138142
}
139143

140144
json[QStringLiteral( "nodes" )] = nodes;
145+
return json;
141146
}
142147

143148
QSizeF QgsLegendRenderer::paintAndDetermineSize( QgsRenderContext &context )

0 commit comments

Comments
 (0)
Please sign in to comment.