Index: src/app/legend/qgslegend.cpp =================================================================== --- src/app/legend/qgslegend.cpp (revision 15079) +++ src/app/legend/qgslegend.cpp (working copy) @@ -549,6 +549,9 @@ } else if ( li->type() == QgsLegendItem::LEGEND_GROUP ) { + theMenu.addAction( QgisApp::getThemeIcon( "/mActionZoomToLayer.png" ), + tr( "Zoom to group" ), this, SLOT( legendLayerZoom() ) ); + theMenu.addAction( QgisApp::getThemeIcon( "/mActionRemoveLayer.png" ), tr( "&Remove" ), this, SLOT( legendGroupRemove() ) ); } @@ -1656,24 +1659,62 @@ return; } - //find current Layer - QgsLegendLayer* currentLayer = dynamic_cast( currentItem() ); - if ( !currentLayer ) - return; + QgsRectangle extent; - QgsMapLayer* theLayer = currentLayer->layer(); - QgsRectangle extent = theLayer->extent(); + QgsLegendItem* li = dynamic_cast( currentItem() ); - //transform extent if otf-projection is on - if ( mMapCanvas->hasCrsTransformEnabled() ) + if ( li->type() == QgsLegendItem::LEGEND_LAYER ) { - QgsMapRenderer* renderer = mMapCanvas->mapRenderer(); - if ( renderer ) + QgsLegendLayer* currentLayer = dynamic_cast( currentItem() ); + if ( !currentLayer ) + return; + + QgsMapLayer* theLayer = currentLayer->layer(); + extent = theLayer->extent(); + + //transform extent if otf-projection is on + if ( mMapCanvas->hasCrsTransformEnabled() ) { - extent = renderer->layerExtentToOutputExtent( theLayer, extent ); + QgsMapRenderer* renderer = mMapCanvas->mapRenderer(); + if ( renderer ) + { + extent = renderer->layerExtentToOutputExtent( theLayer, extent ); + } } } + else if ( li->type() == QgsLegendItem::LEGEND_GROUP ) + { + QgsLegendGroup* currentGroup = dynamic_cast( currentItem() ); + QgsRectangle layerExtent; + + QList layers = currentGroup->legendLayers(); + for (int i = 0; i < layers.size(); ++i ) + { + QgsMapLayer* theLayer = layers.at( i )->layer(); + layerExtent = theLayer->extent(); + + //transform extent if otf-projection is on + if ( mMapCanvas->hasCrsTransformEnabled() ) + { + QgsMapRenderer* renderer = mMapCanvas->mapRenderer(); + if ( renderer ) + { + layerExtent = renderer->layerExtentToOutputExtent( theLayer, layerExtent ); + } + } + + if ( i == 0 ) + { + extent = layerExtent; + } + else + { + extent.combineExtentWith( &layerExtent ); + } + } + } + // Increase bounding box with 5%, so that layer is a bit inside the borders extent.scale( 1.05 );