@@ -121,6 +121,7 @@ QStandardItem* QgsLegendModel::addGroup( QString text, int position )
121
121
text = tr ( " Group" );
122
122
123
123
QgsComposerGroupItem* groupItem = new QgsComposerGroupItem ( text );
124
+ groupItem->setUserText ( text );
124
125
125
126
if ( position == -1 )
126
127
{
@@ -159,19 +160,18 @@ int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLa
159
160
160
161
QgsLegendSymbolList lst = renderer->legendSymbolItems ();
161
162
QgsLegendSymbolList::const_iterator symbolIt = lst.constBegin ();
163
+ int row = 0 ;
162
164
for ( ; symbolIt != lst.constEnd (); ++symbolIt )
163
165
{
164
- QString label = symbolIt->first ;
165
- if ( lItem->showFeatureCount () )
166
+ QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item ( " " );
167
+
168
+ // Get userText from old item if exists
169
+ QgsComposerSymbolV2Item* oldSymbolItem = dynamic_cast <QgsComposerSymbolV2Item*>( layerItem->child ( row, 0 ) );
170
+ if ( oldSymbolItem )
166
171
{
167
- // Add counts to multi symbols layers only or labeled single symbols,
168
- // so that single symbol layers are still drawn on single line
169
- if ( lst.size () > 1 || !label.isEmpty () )
170
- {
171
- label += QString ( " [%1]" ).arg ( vlayer->featureCount ( symbolIt->second ) );
172
- }
172
+ currentSymbolItem->setUserText ( oldSymbolItem->userText () );
173
173
}
174
- QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item ( label );
174
+
175
175
currentSymbolItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
176
176
if ( symbolIt->second )
177
177
{
@@ -181,14 +181,23 @@ int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLa
181
181
}
182
182
currentSymbolItem->setSymbolV2 ( symbolIt->second ->clone () );
183
183
}
184
- layerItem->setChild ( layerItem->rowCount (), 0 , currentSymbolItem );
184
+ layerItem->setChild ( row, 0 , currentSymbolItem );
185
+
186
+ // updateSymbolV2ItemText needs layer set
187
+ updateSymbolV2ItemText ( currentSymbolItem );
188
+
189
+ row++;
190
+ }
191
+
192
+ // Delete following old items (if current number of items decreased)
193
+ for ( int i = layerItem->rowCount () - 1 ; i >= row; --i )
194
+ {
195
+ layerItem->removeRow ( i );
185
196
}
186
197
187
198
return 0 ;
188
199
}
189
200
190
-
191
-
192
201
int QgsLegendModel::addRasterLayerItems ( QStandardItem* layerItem, QgsMapLayer* rlayer )
193
202
{
194
203
if ( !layerItem || !rlayer )
@@ -204,9 +213,18 @@ int QgsLegendModel::addRasterLayerItems( QStandardItem* layerItem, QgsMapLayer*
204
213
205
214
QList< QPair< QString, QColor > > rasterItemList = rasterLayer->legendSymbologyItems ();
206
215
QList< QPair< QString, QColor > >::const_iterator itemIt = rasterItemList.constBegin ();
216
+ int row = 0 ;
207
217
for ( ; itemIt != rasterItemList.constEnd (); ++itemIt )
208
218
{
209
219
QgsComposerRasterSymbolItem* currentSymbolItem = new QgsComposerRasterSymbolItem ( itemIt->first );
220
+
221
+ QgsComposerRasterSymbolItem* oldSymbolItem = dynamic_cast <QgsComposerRasterSymbolItem*>( layerItem->child ( row, 0 ) );
222
+ if ( oldSymbolItem )
223
+ {
224
+ currentSymbolItem->setUserText ( oldSymbolItem->userText () );
225
+ currentSymbolItem->setText ( currentSymbolItem->userText () );
226
+ }
227
+
210
228
if ( mHasTopLevelWindow )
211
229
{
212
230
QPixmap itemPixmap ( 20 , 20 );
@@ -217,11 +235,76 @@ int QgsLegendModel::addRasterLayerItems( QStandardItem* layerItem, QgsMapLayer*
217
235
currentSymbolItem->setColor ( itemIt->second );
218
236
int currentRowCount = layerItem->rowCount ();
219
237
layerItem->setChild ( currentRowCount, 0 , currentSymbolItem );
238
+ row++;
239
+ }
240
+
241
+ // Delete following old items (if current number of items decreased)
242
+ for ( int i = layerItem->rowCount () - 1 ; i >= row; --i )
243
+ {
244
+ layerItem->removeRow ( i );
220
245
}
221
246
222
247
return 0 ;
223
248
}
224
249
250
+ void QgsLegendModel::updateSymbolV2ItemText ( QStandardItem* symbolItem )
251
+ {
252
+ QgsComposerSymbolV2Item* sv2Item = dynamic_cast <QgsComposerSymbolV2Item*>( symbolItem );
253
+ if ( !sv2Item ) return ;
254
+
255
+ QgsComposerLayerItem* lItem = dynamic_cast <QgsComposerLayerItem*>( sv2Item->parent () );
256
+ if ( !lItem ) return ;
257
+
258
+ QgsMapLayer* mapLayer = QgsMapLayerRegistry::instance ()->mapLayer ( lItem->layerID () );
259
+ if ( !mapLayer ) return ;
260
+
261
+ QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( mapLayer );
262
+ if ( !vLayer ) return ;
263
+
264
+ QgsFeatureRendererV2* renderer = vLayer->rendererV2 ();
265
+ if ( !renderer ) return ;
266
+
267
+ if ( lItem->showFeatureCount () ) vLayer->countSymbolFeatures ();
268
+
269
+ QgsLegendSymbolList symbolList = renderer->legendSymbolItems ();
270
+
271
+ QPair<QString, QgsSymbolV2*> symbol = symbolList.value ( symbolItem->row () );
272
+
273
+ QString label = sv2Item->userText ().isEmpty () ? symbol.first : sv2Item->userText ();
274
+
275
+ if ( lItem->showFeatureCount () )
276
+ {
277
+ // Add counts to multi symbols layers only or labeled single symbols,
278
+ // so that single symbol layers are still drawn on single line
279
+ if ( symbolList.size () > 1 || !label.isEmpty () )
280
+ {
281
+ label += QString ( " [%1]" ).arg ( vLayer->featureCount ( symbol.second ) );
282
+ }
283
+ }
284
+ symbolItem->setText ( label );
285
+ }
286
+
287
+ void QgsLegendModel::updateRasterSymbolItemText ( QStandardItem* symbolItem )
288
+ {
289
+ QgsComposerRasterSymbolItem* rItem = dynamic_cast <QgsComposerRasterSymbolItem*>( symbolItem );
290
+ if ( !rItem ) return ;
291
+
292
+ QgsComposerLayerItem* lItem = dynamic_cast <QgsComposerLayerItem*>( rItem->parent () );
293
+ if ( !lItem ) return ;
294
+
295
+ QgsMapLayer* mapLayer = QgsMapLayerRegistry::instance ()->mapLayer ( lItem->layerID () );
296
+ if ( !mapLayer ) return ;
297
+
298
+ QgsRasterLayer* rLayer = qobject_cast<QgsRasterLayer*>( mapLayer );
299
+ if ( !rLayer ) return ;
300
+
301
+ QPair< QString, QColor> symbol = rLayer->legendSymbologyItems ().value ( symbolItem->row () );
302
+
303
+ QString label = rItem->userText ().isEmpty () ? symbol.first : rItem->userText ();
304
+
305
+ symbolItem->setText ( label );
306
+ }
307
+
225
308
void QgsLegendModel::updateItem ( QStandardItem* item )
226
309
{
227
310
if ( !item )
@@ -243,6 +326,45 @@ void QgsLegendModel::updateItem( QStandardItem* item )
243
326
}
244
327
}
245
328
329
+ void QgsLegendModel::updateItemText ( QStandardItem* item )
330
+ {
331
+ if ( !item )
332
+ {
333
+ return ;
334
+ }
335
+
336
+ // only layer items are supported for update
337
+ QgsComposerLegendItem* cItem = dynamic_cast <QgsComposerLegendItem*>( item );
338
+ if ( ! cItem )
339
+ {
340
+ return ;
341
+ }
342
+
343
+ QgsComposerLayerItem* lItem = dynamic_cast <QgsComposerLayerItem*>( cItem );
344
+ if ( lItem )
345
+ {
346
+ updateLayerItemText ( lItem );
347
+ return ;
348
+ }
349
+
350
+ QgsComposerSymbolV2Item* sv2Item = dynamic_cast <QgsComposerSymbolV2Item*>( cItem );
351
+ if ( sv2Item )
352
+ {
353
+ updateSymbolV2ItemText ( sv2Item );
354
+ return ;
355
+ }
356
+
357
+ QgsComposerRasterSymbolItem* rItem = dynamic_cast <QgsComposerRasterSymbolItem*>( cItem );
358
+ if ( rItem )
359
+ {
360
+ updateRasterSymbolItemText ( rItem );
361
+ return ;
362
+ }
363
+
364
+ // group
365
+ cItem->setText ( cItem->userText () );
366
+ }
367
+
246
368
void QgsLegendModel::updateLayer ( QStandardItem* layerItem )
247
369
{
248
370
QgsDebugMsg ( " Entered." );
@@ -252,22 +374,9 @@ void QgsLegendModel::updateLayer( QStandardItem* layerItem )
252
374
QgsMapLayer* mapLayer = QgsMapLayerRegistry::instance ()->mapLayer ( lItem->layerID () );
253
375
if ( mapLayer )
254
376
{
255
- // delete all the entries under layer item
256
- int currentRowCount = lItem->rowCount ();
257
- for ( int i = currentRowCount - 1 ; i >= 0 ; --i )
258
- {
259
- lItem->removeRow ( i );
260
- }
261
-
262
377
QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( mapLayer );
263
378
264
- // set layer name as item text
265
- QString label = mapLayer->name ();
266
- if ( vLayer && lItem->showFeatureCount () )
267
- {
268
- label += QString ( " [%1]" ).arg ( vLayer->featureCount () );
269
- }
270
- layerItem->setText ( label );
379
+ updateLayerItemText ( lItem );
271
380
272
381
if ( vLayer )
273
382
{
@@ -283,6 +392,26 @@ void QgsLegendModel::updateLayer( QStandardItem* layerItem )
283
392
}
284
393
}
285
394
395
+ void QgsLegendModel::updateLayerItemText ( QStandardItem* layerItem )
396
+ {
397
+ QgsComposerLayerItem* lItem = dynamic_cast <QgsComposerLayerItem*>( layerItem );
398
+ if ( !lItem ) return ;
399
+
400
+ QgsMapLayer* mapLayer = QgsMapLayerRegistry::instance ()->mapLayer ( lItem->layerID () );
401
+ if ( !mapLayer ) return ;
402
+
403
+ QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( mapLayer );
404
+ if ( !vLayer ) return ;
405
+
406
+ QString label = lItem->userText ().isEmpty () ? mapLayer->name () : lItem->userText ();
407
+
408
+ if ( vLayer && lItem->showFeatureCount () )
409
+ {
410
+ label += QString ( " [%1]" ).arg ( vLayer->featureCount () );
411
+ }
412
+ lItem->setText ( label );
413
+ }
414
+
286
415
void QgsLegendModel::removeLayer ( const QString& layerId )
287
416
{
288
417
int numRootItems = rowCount ();
0 commit comments