93
93
94
94
namespace QgsWms
95
95
{
96
-
97
- namespace
98
- {
99
-
100
- QgsLayerTreeModelLegendNode *_findLegendNodeForRule ( QgsLayerTreeModel *legendModel, const QString &rule )
101
- {
102
- for ( QgsLayerTreeLayer *nodeLayer : legendModel->rootGroup ()->findLayers () )
103
- {
104
- for ( QgsLayerTreeModelLegendNode *legendNode : legendModel->layerLegendNodes ( nodeLayer ) )
105
- {
106
- if ( legendNode->data ( Qt::DisplayRole ).toString () == rule )
107
- return legendNode;
108
- }
109
- }
110
- return nullptr ;
111
- }
112
-
113
- } // namespace
114
-
115
96
QgsRenderer::QgsRenderer ( const QgsWmsRenderContext &context )
116
97
: mContext ( context )
117
98
{
@@ -126,80 +107,6 @@ namespace QgsWms
126
107
removeTemporaryLayers ();
127
108
}
128
109
129
- QImage *QgsRenderer::getLegendGraphics ()
130
- {
131
- // get layers
132
- std::unique_ptr<QgsLayerRestorer> restorer;
133
- restorer.reset ( new QgsLayerRestorer ( mContext .layers () ) );
134
-
135
- // configure layers
136
- QList<QgsMapLayer *> layers = mContext .layersToRender ();
137
- configureLayers ( layers );
138
-
139
- // build layer tree model for legend
140
- QgsLayerTree rootGroup;
141
- QgsLegendSettings legendSettings = mContext .parameters ().legendSettings ();
142
- std::unique_ptr<QgsLayerTreeModel> legendModel;
143
- legendModel.reset ( buildLegendTreeModel ( layers, mContext .scaleDenominator (), rootGroup ) );
144
-
145
- // rendering step
146
- const qreal dpmm = mContext .dotsPerMm ();
147
- std::unique_ptr<QImage> image;
148
- std::unique_ptr<QPainter> painter;
149
-
150
- // getting scale from bbox
151
- if ( !mWmsParameters .bbox ().isEmpty () )
152
- {
153
- QgsMapSettings mapSettings;
154
- image.reset ( createImage ( width (), height (), false ) );
155
- configureMapSettings ( image.get (), mapSettings );
156
- legendSettings.setMapScale ( mapSettings.scale () );
157
- legendSettings.setMapUnitsPerPixel ( mapSettings.mapUnitsPerPixel () );
158
- }
159
-
160
- if ( !mWmsParameters .rule ().isEmpty () )
161
- {
162
- QString rule = mWmsParameters .rule ();
163
- int width = mWmsParameters .widthAsInt ();
164
- int height = mWmsParameters .heightAsInt ();
165
-
166
- image.reset ( createImage ( width, height, false ) );
167
- painter.reset ( new QPainter ( image.get () ) );
168
- painter->setRenderHint ( QPainter::Antialiasing, true );
169
- painter->scale ( dpmm, dpmm );
170
-
171
- QgsLayerTreeModelLegendNode *legendNode = _findLegendNodeForRule ( legendModel.get (), rule );
172
- if ( legendNode )
173
- {
174
- QgsLayerTreeModelLegendNode::ItemContext ctx;
175
- ctx.painter = painter.get ();
176
- ctx.labelXOffset = 0 ;
177
- ctx.point = QPointF ();
178
- double itemHeight = height / dpmm;
179
- legendNode->drawSymbol ( legendSettings, &ctx, itemHeight );
180
- painter->end ();
181
- }
182
- }
183
- else
184
- {
185
- QgsLegendRenderer legendRendererNew ( legendModel.get (), legendSettings );
186
-
187
- QSizeF minSize = legendRendererNew.minimumSize ();
188
- QSize s ( minSize.width () * dpmm, minSize.height () * dpmm );
189
-
190
- image.reset ( createImage ( s.width (), s.height (), false ) );
191
- painter.reset ( new QPainter ( image.get () ) );
192
- painter->setRenderHint ( QPainter::Antialiasing, true );
193
- painter->scale ( dpmm, dpmm );
194
-
195
- legendRendererNew.drawLegend ( painter.get () );
196
- painter->end ();
197
- }
198
-
199
- rootGroup.clear ();
200
- return image.release ();
201
- }
202
-
203
110
QImage *QgsRenderer::getLegendGraphics ( QgsLayerTreeModel &model )
204
111
{
205
112
// get layers
@@ -244,7 +151,7 @@ namespace QgsWms
244
151
return image.release ();
245
152
}
246
153
247
- QImage *QgsRenderer::getLegendGraphics ( QgsLayerTreeModelLegendNode &node )
154
+ QImage *QgsRenderer::getLegendGraphics ( QgsLayerTreeModelLegendNode &nodeModel )
248
155
{
249
156
// get layers
250
157
std::unique_ptr<QgsLayerRestorer> restorer;
@@ -282,11 +189,12 @@ namespace QgsWms
282
189
ctx.painter = painter.get ();
283
190
ctx.labelXOffset = 0 ;
284
191
ctx.point = QPointF ();
285
- node .drawSymbol ( settings, &ctx, height / dpmm );
192
+ nodeModel .drawSymbol ( settings, &ctx, height / dpmm );
286
193
painter->end ();
287
194
288
195
return image.release ();
289
196
}
197
+
290
198
void QgsRenderer::runHitTest ( const QgsMapSettings &mapSettings, HitTest &hitTest ) const
291
199
{
292
200
QgsRenderContext context = QgsRenderContext::fromMapSettings ( mapSettings );
@@ -2988,136 +2896,6 @@ namespace QgsWms
2988
2896
return scaledImage;
2989
2897
}
2990
2898
2991
- QgsLayerTreeModel *QgsRenderer::buildLegendTreeModel ( const QList<QgsMapLayer *> &layers, double scaleDenominator, QgsLayerTree &rootGroup )
2992
- {
2993
- // get params
2994
- bool showFeatureCount = mWmsParameters .showFeatureCountAsBool ();
2995
- bool drawLegendLayerLabel = mWmsParameters .layerTitleAsBool ();
2996
- bool drawLegendItemLabel = mWmsParameters .ruleLabelAsBool ();
2997
-
2998
- bool ruleDefined = false ;
2999
- if ( !mWmsParameters .rule ().isEmpty () )
3000
- ruleDefined = true ;
3001
-
3002
- bool contentBasedLegend = false ;
3003
- QgsRectangle contentBasedLegendExtent;
3004
- if ( ! mWmsParameters .bbox ().isEmpty () )
3005
- {
3006
- contentBasedLegend = true ;
3007
- contentBasedLegendExtent = mWmsParameters .bboxAsRectangle ();
3008
- if ( contentBasedLegendExtent.isEmpty () )
3009
- throw QgsBadRequestException ( QgsServiceException::QGIS_INVALID_PARAMETER_VALUE,
3010
- mWmsParameters [QgsWmsParameter::BBOX] );
3011
-
3012
- if ( !mWmsParameters .rule ().isEmpty () )
3013
- throw QgsBadRequestException ( QgsServiceException::QGIS_INVALID_PARAMETER_VALUE,
3014
- QStringLiteral ( " BBOX parameter cannot be combined with RULE." ) );
3015
- }
3016
-
3017
- // build layer tree
3018
- rootGroup.clear ();
3019
- QList<QgsVectorLayerFeatureCounter *> counters;
3020
- for ( QgsMapLayer *ml : layers )
3021
- {
3022
- QgsLayerTreeLayer *lt = rootGroup.addLayer ( ml );
3023
- lt->setCustomProperty ( QStringLiteral ( " showFeatureCount" ), showFeatureCount );
3024
-
3025
- if ( !ml->title ().isEmpty () )
3026
- lt->setName ( ml->title () );
3027
-
3028
- if ( ml->type () != QgsMapLayerType::VectorLayer || !showFeatureCount )
3029
- continue ;
3030
-
3031
- QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( ml );
3032
- QgsVectorLayerFeatureCounter *counter = vl->countSymbolFeatures ();
3033
- if ( !counter )
3034
- continue ;
3035
- counters.append ( counter );
3036
- }
3037
-
3038
- // build legend model
3039
- QgsLayerTreeModel *legendModel = new QgsLayerTreeModel ( &rootGroup );
3040
- if ( scaleDenominator > 0 )
3041
- legendModel->setLegendFilterByScale ( scaleDenominator );
3042
-
3043
- QgsMapSettings contentBasedMapSettings;
3044
- if ( contentBasedLegend )
3045
- {
3046
- HitTest hitTest;
3047
- getMap ( contentBasedMapSettings, &hitTest );
3048
-
3049
- for ( QgsLayerTreeNode *node : rootGroup.children () )
3050
- {
3051
- Q_ASSERT ( QgsLayerTree::isLayer ( node ) );
3052
- QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer ( node );
3053
-
3054
- QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( nodeLayer->layer () );
3055
- if ( !vl || !vl->renderer () )
3056
- continue ;
3057
-
3058
- const SymbolSet &usedSymbols = hitTest[vl];
3059
- QList<int > order;
3060
- int i = 0 ;
3061
- for ( const QgsLegendSymbolItem &legendItem : vl->renderer ()->legendSymbolItems () )
3062
- {
3063
- QString sProp = QgsSymbolLayerUtils::symbolProperties ( legendItem.legacyRuleKey () );
3064
- if ( usedSymbols.contains ( sProp ) )
3065
- order.append ( i );
3066
- ++i;
3067
- }
3068
-
3069
- // either remove the whole layer or just filter out some items
3070
- if ( order.isEmpty () )
3071
- rootGroup.removeChildNode ( nodeLayer );
3072
- else
3073
- {
3074
- QgsMapLayerLegendUtils::setLegendNodeOrder ( nodeLayer, order );
3075
- legendModel->refreshLayerLegend ( nodeLayer );
3076
- }
3077
- }
3078
- }
3079
-
3080
- // if legend is not based on rendering rules
3081
- if ( ! ruleDefined )
3082
- {
3083
- QList<QgsLayerTreeNode *> rootChildren = rootGroup.children ();
3084
- for ( QgsLayerTreeNode *node : rootChildren )
3085
- {
3086
- if ( QgsLayerTree::isLayer ( node ) )
3087
- {
3088
- QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer ( node );
3089
-
3090
- // layer titles - hidden or not
3091
- QgsLegendRenderer::setNodeLegendStyle ( nodeLayer, drawLegendLayerLabel ? QgsLegendStyle::Subgroup : QgsLegendStyle::Hidden );
3092
-
3093
- // rule item titles
3094
- if ( !drawLegendItemLabel )
3095
- {
3096
- for ( QgsLayerTreeModelLegendNode *legendNode : legendModel->layerLegendNodes ( nodeLayer ) )
3097
- {
3098
- legendNode->setUserLabel ( QStringLiteral ( " " ) ); // empty string = no override, so let's use one space
3099
- }
3100
- }
3101
- else if ( !drawLegendLayerLabel )
3102
- {
3103
- for ( QgsLayerTreeModelLegendNode *legendNode : legendModel->layerLegendNodes ( nodeLayer ) )
3104
- {
3105
- if ( legendNode->isEmbeddedInParent () )
3106
- legendNode->setEmbeddedInParent ( false );
3107
- }
3108
- }
3109
- }
3110
- }
3111
- }
3112
-
3113
- for ( QgsVectorLayerFeatureCounter *c : counters )
3114
- {
3115
- c->waitForFinished ();
3116
- }
3117
-
3118
- return legendModel;
3119
- }
3120
-
3121
2899
void QgsRenderer::handlePrintErrors ( const QgsLayout *layout ) const
3122
2900
{
3123
2901
if ( !layout )
0 commit comments