@@ -95,12 +95,14 @@ QgsLegend::QgsLegend( QgsMapCanvas *canvas, QWidget * parent, const char *name )
9595 this , SLOT ( writeProject ( QDomDocument & ) ) );
9696
9797 // connect map layer registry signal to legend
98- connect ( QgsMapLayerRegistry::instance (), SIGNAL ( layerWillBeRemoved ( QString ) ),
99- this , SLOT ( removeLayer ( QString ) ) );
98+ connect ( QgsMapLayerRegistry::instance (),
99+ SIGNAL ( layersWillBeRemoved ( QStringList ) ),
100+ this , SLOT ( removeLayers ( QStringList ) ) );
100101 connect ( QgsMapLayerRegistry::instance (), SIGNAL ( removedAll () ),
101102 this , SLOT ( removeAll () ) );
102- connect ( QgsMapLayerRegistry::instance (), SIGNAL ( layerWasAdded ( QgsMapLayer* ) ),
103- this , SLOT ( addLayer ( QgsMapLayer * ) ) );
103+ connect ( QgsMapLayerRegistry::instance (),
104+ SIGNAL ( layersAdded ( QList<QgsMapLayer*> ) ),
105+ this , SLOT ( addLayers ( QList<QgsMapLayer *> ) ) );
104106
105107 connect ( mMapCanvas , SIGNAL ( layersChanged () ),
106108 this , SLOT ( refreshCheckStates () ) );
@@ -279,38 +281,48 @@ void QgsLegend::removeGroup( int groupIndex )
279281 }
280282}
281283
282- void QgsLegend::removeLayer ( QString layerId )
284+ void QgsLegend::removeLayers ( QStringList theLayers )
283285{
284286 QgsDebugMsg ( " Entering." );
285-
286- bool invLayerRemoved = false ;
287-
288- for ( QTreeWidgetItem* theItem = firstItem (); theItem; theItem = nextItem ( theItem ) )
287+ foreach (const QString &myId, theLayers)
289288 {
290- QgsLegendItem *li = dynamic_cast <QgsLegendItem *>( theItem );
291- if ( li )
292- {
293- // save legend layer (parent of a legend layer file we're going to delete)
294- QgsLegendLayer* ll = qobject_cast<QgsLegendLayer *>( li );
289+ bool invLayerRemoved = false ;
295290
296- if ( ll && ll->layer () && ll->layer ()->id () == layerId )
291+ for ( QTreeWidgetItem* theItem = firstItem ();
292+ theItem; theItem = nextItem ( theItem ) )
293+ {
294+ QgsLegendItem *li = dynamic_cast <QgsLegendItem *>( theItem );
295+ if ( li )
297296 {
298- if ( !ll->isVisible () )
297+ // save legend layer (parent of a legend layer file we're going to delete)
298+ QgsLegendLayer* ll = qobject_cast<QgsLegendLayer *>( li );
299+
300+ if ( ll && ll->layer () && ll->layer ()->id () == myId )
299301 {
300- invLayerRemoved = true ;
302+ if ( !ll->isVisible () )
303+ {
304+ invLayerRemoved = true ;
305+ }
306+ removeItem ( ll );
307+ delete ll;
308+ break ;
301309 }
302- removeItem ( ll );
303- delete ll;
304- break ;
305310 }
306311 }
312+ emit itemRemoved ();
313+ if ( invLayerRemoved )
314+ emit invisibleLayerRemoved ();
307315 }
308316 updateMapCanvasLayerSet ();
309317 adjustIconSize ();
318+ }
310319
311- emit itemRemoved ();
312- if ( invLayerRemoved )
313- emit invisibleLayerRemoved ();
320+ // deprecated delegates to removeLayers now
321+ void QgsLegend::removeLayer ( QString theLayer )
322+ {
323+ QStringList myList;
324+ myList << theLayer;
325+ removeLayers (myList);
314326}
315327
316328void QgsLegend::mousePressEvent ( QMouseEvent * e )
@@ -846,77 +858,98 @@ int QgsLegend::getItemPos( QTreeWidgetItem* item )
846858 return -1 ;
847859}
848860
849- void QgsLegend::addLayer ( QgsMapLayer * layer )
861+ // introduced in QGIS 1.8 - add layers in a batch
862+ void QgsLegend::addLayers ( QList<QgsMapLayer *> theLayerList )
850863{
851864 QgsDebugMsg ( " Entering." );
852865 if ( !mMapCanvas || mMapCanvas ->isDrawing () )
853866 {
854867 return ;
855868 }
856869
857- QgsLegendLayer* llayer = new QgsLegendLayer ( layer );
858- if ( !QgsProject::instance ()->layerIsEmbedded ( layer->id () ).isEmpty () )
859- {
860- QFont itemFont;
861- itemFont.setItalic ( true );
862- llayer->setFont ( 0 , itemFont );
863- }
870+ QSettings settings;
864871
865- // set the correct check states
866- blockSignals ( true );
867- llayer-> setCheckState ( 0 , llayer-> isVisible () ? Qt::Checked : Qt::Unchecked ) ;
868- blockSignals ( false ) ;
872+ // Note if the canvas was previously blank so we can
873+ // zoom to all layers at the end if neeeded
874+ bool myFirstLayerFlag = false ;
875+ if ( layers (). count () > 0 ) myFirstLayerFlag = true ;
869876
870- QgsLegendGroup *lg = dynamic_cast <QgsLegendGroup *>( currentItem () );
871- if ( !lg && currentItem () )
877+ // iteratively add the layers to the canvas
878+ for ( int i = 0 ; i < theLayerList. size (); ++i )
872879 {
873- lg = dynamic_cast <QgsLegendGroup *>( currentItem ()->parent () );
874- }
880+ QgsMapLayer * layer = theLayerList.at (i);
881+ QgsLegendLayer* llayer = new QgsLegendLayer ( layer );
882+ if ( !QgsProject::instance ()->layerIsEmbedded ( layer->id () ).isEmpty () )
883+ {
884+ QFont itemFont;
885+ itemFont.setItalic ( true );
886+ llayer->setFont ( 0 , itemFont );
887+ }
875888
876- int index;
877- if ( lg )
878- {
879- index = lg->indexOfChild ( currentItem () );
880- }
881- else
882- {
883- index = indexOfTopLevelItem ( currentItem () );
884- }
889+ // set the correct check states
890+ blockSignals ( true );
891+ llayer->setCheckState ( 0 , llayer->isVisible () ? Qt::Checked : Qt::Unchecked );
892+ blockSignals ( false );
885893
886- if ( index < 0 )
887- {
888- index = 0 ;
889- }
894+ QgsLegendGroup *lg = dynamic_cast <QgsLegendGroup *>( currentItem () );
895+ if ( !lg && currentItem () )
896+ {
897+ lg = dynamic_cast <QgsLegendGroup *>( currentItem ()->parent () );
898+ }
890899
891- QSettings settings;
892- if ( lg && settings.value ( " /qgis/addNewLayersToCurrentGroup" , false ).toBool () )
893- {
894- lg->insertChild ( index, llayer );
895- }
896- else
897- {
898- insertTopLevelItem ( index, llayer );
899- setCurrentItem ( llayer );
900- }
900+ int index = 0 ;
901+ if ( lg )
902+ {
903+ index = lg->indexOfChild ( currentItem () );
904+ }
905+ else
906+ {
907+ index = indexOfTopLevelItem ( currentItem () );
908+ }
901909
902- setItemExpanded ( llayer, true );
903- // don't expand raster items by default, there could be too many
904- refreshLayerSymbology ( layer->id (), layer->type () != QgsMapLayer::RasterLayer );
910+ if ( index < 0 )
911+ {
912+ index = 0 ;
913+ }
905914
906- updateMapCanvasLayerSet ();
915+ if ( lg && settings.value ( " /qgis/addNewLayersToCurrentGroup" , false ).toBool () )
916+ {
917+ lg->insertChild ( index, llayer );
918+ }
919+ else
920+ {
921+ insertTopLevelItem ( index, llayer );
922+ setCurrentItem ( llayer );
923+ }
924+
925+ setItemExpanded ( llayer, true );
926+ // don't expand raster items by default, there could be too many
927+ refreshLayerSymbology ( layer->id (), layer->type () != QgsMapLayer::RasterLayer );
907928
929+ updateMapCanvasLayerSet ();
930+ emit itemAdded ( indexFromItem ( llayer ) );
931+ }
908932 // first layer?
909- if ( layers (). count () == 1 )
933+ if ( myFirstLayerFlag )
910934 {
935+ QgsMapLayer * myFirstLayer = theLayerList.at (0 );
911936 if ( !mMapCanvas ->mapRenderer ()->hasCrsTransformEnabled () )
912- mMapCanvas ->mapRenderer ()->setDestinationCrs ( layer ->crs () );
937+ mMapCanvas ->mapRenderer ()->setDestinationCrs ( myFirstLayer ->crs () );
913938 mMapCanvas ->zoomToFullExtent ();
914939 mMapCanvas ->clearExtentHistory ();
915940 }
916941 // make the QTreeWidget item up-to-date
917942 doItemsLayout ();
918943
919- emit itemAdded ( indexFromItem ( llayer ) );
944+
945+ }
946+
947+ // deprecated since 1.8 - delegates to addLayers
948+ void QgsLegend::addLayer ( QgsMapLayer * layer )
949+ {
950+ QList<QgsMapLayer *> myList;
951+ myList << layer;
952+ addLayers ( myList );
920953}
921954
922955void QgsLegend::setLayerVisible ( QgsMapLayer * layer, bool visible )
0 commit comments