@@ -5372,7 +5372,7 @@ void QgisApp::duplicateLayers( QList<QgsMapLayer *> lyrList )
5372
5372
return ;
5373
5373
}
5374
5374
5375
- QList<QgsMapLayer *> selectedLyrs = lyrList.empty () ? mMapLegend ->selectedLayers () : lyrList;
5375
+ const QList<QgsMapLayer *> selectedLyrs = lyrList.empty () ? mMapLegend ->selectedLayers () : lyrList;
5376
5376
if ( selectedLyrs.empty () )
5377
5377
{
5378
5378
return ;
@@ -5389,16 +5389,6 @@ void QgisApp::duplicateLayers( QList<QgsMapLayer *> lyrList )
5389
5389
unSppType = QString ( " " );
5390
5390
layerDupName = selectedLyr->name () + " " + tr ( " copy" );
5391
5391
5392
- // setup for placing duplicated layer below source layer, regardless of group depth
5393
- mMapLegend ->blockSignals ( true );
5394
- if ( !mMapLegend ->setCurrentLayer ( selectedLyr ) )
5395
- {
5396
- mMapLegend ->blockSignals ( false );
5397
- continue ; // legend item doesn't exist for map layer
5398
- }
5399
- mMapLegend ->blockSignals ( false );
5400
- QgsLegendLayer *sourcellayer = mMapLegend ->currentLegendLayer ();
5401
-
5402
5392
if ( selectedLyr->type () == QgsMapLayer::PluginLayer )
5403
5393
{
5404
5394
unSppType = tr ( " Plugin layer" );
@@ -5409,7 +5399,7 @@ void QgisApp::duplicateLayers( QList<QgsMapLayer *> lyrList )
5409
5399
if ( unSppType.isEmpty () )
5410
5400
{
5411
5401
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer*>( selectedLyr );
5412
- // TODO: check for other layer types that won't duplicate correctly
5402
+ // TODO: add other layer types that can be duplicated
5413
5403
// currently memory and plugin layers are skipped
5414
5404
if ( vlayer && vlayer->storageType () == " Memory storage" )
5415
5405
{
@@ -5421,7 +5411,6 @@ void QgisApp::duplicateLayers( QList<QgsMapLayer *> lyrList )
5421
5411
}
5422
5412
}
5423
5413
5424
-
5425
5414
if ( unSppType.isEmpty () && !dupLayer )
5426
5415
{
5427
5416
QgsRasterLayer *rlayer = qobject_cast<QgsRasterLayer*>( selectedLyr );
@@ -5453,23 +5442,39 @@ void QgisApp::duplicateLayers( QList<QgsMapLayer *> lyrList )
5453
5442
continue ;
5454
5443
}
5455
5444
5456
- // add layer to project and layer registry
5445
+ // add layer to layer registry and legend
5457
5446
QList<QgsMapLayer *> myList;
5458
5447
myList << dupLayer;
5459
5448
QgsMapLayerRegistry::instance ()->addMapLayers ( myList );
5460
5449
5461
- // duplicate the layer style
5462
- copyStyle ( selectedLyr );
5463
- pasteStyle ( dupLayer );
5450
+ // verify layer has been added to legend
5451
+ QgsLegendLayer *duplLayer = 0 ;
5452
+ duplLayer = mMapLegend ->findLegendLayer ( dupLayer );
5453
+ if ( !duplLayer )
5454
+ {
5455
+ // some source layers, like items > 4th in a container, have their layer
5456
+ // registered but do not show up in the legend, so manually add them
5457
+ QgsLegendLayer* llayer = new QgsLegendLayer ( dupLayer );
5458
+ mMapLegend ->insertTopLevelItem ( 0 , llayer );
5459
+ // double-check, or move of non-existent legend layer will segfault
5460
+ duplLayer = mMapLegend ->findLegendLayer ( dupLayer );
5461
+ }
5462
+
5463
+ QgsLegendLayer *srclLayer = mMapLegend ->findLegendLayer ( selectedLyr );
5464
+ if ( duplLayer && srclLayer )
5465
+ {
5466
+ // move layer to just below source layer
5467
+ mMapLegend ->moveItem ( duplLayer, srclLayer );
5464
5468
5465
- // move layer to just below source layer
5466
- QgsLegendLayer *dupllayer = mMapLegend -> currentLegendLayer ( );
5467
- mMapLegend -> moveItem ( dupllayer, sourcellayer );
5469
+ // duplicate the layer style
5470
+ copyStyle ( selectedLyr );
5471
+ pasteStyle ( dupLayer );
5468
5472
5469
- // always set duplicated layers to not visible
5470
- // so layer can be configured before being turned on,
5471
- // and no map canvas refresh needed when doing multiple duplications
5472
- mMapLegend ->setLayerVisible ( dupLayer, false );
5473
+ // always set duplicated layers to not visible
5474
+ // so layer can be configured before being turned on,
5475
+ // and no map canvas refresh needed when doing multiple duplications
5476
+ mMapLegend ->setLayerVisible ( dupLayer, false );
5477
+ }
5473
5478
}
5474
5479
5475
5480
dupLayer = 0 ;
0 commit comments