@@ -156,12 +156,18 @@ void QgsLegend::removeLayer( QString layer_key )
156156
157157 QTreeWidgetItem* theItem = firstItem ();
158158 QgsDebugMsg ( " called." );
159+
160+ QgsLegendLayer* lastLL = NULL ;
159161
160162 while ( theItem )
161163 {
162164 QgsLegendItem *li = dynamic_cast <QgsLegendItem*>( theItem );
163165 if ( li )
164166 {
167+ // save legend layer (parent of a legend layer file we're going to delete)
168+ QgsLegendLayer* ll = dynamic_cast <QgsLegendLayer*>( li );
169+ if ( ll ) lastLL = ll;
170+
165171 QgsLegendLayerFile* llf = dynamic_cast <QgsLegendLayerFile*>( li );
166172 if ( llf )
167173 {
@@ -171,6 +177,15 @@ void QgsLegend::removeLayer( QString layer_key )
171177 mStateOfCheckBoxes .erase ( llf );
172178 removeItem ( llf );
173179 delete llf;
180+
181+ // delete also parent legend layer if now it's empty
182+ if (lastLL->mapLayers ().size () == 0 )
183+ {
184+ mStateOfCheckBoxes .erase ( lastLL );
185+ removeItem ( lastLL );
186+ delete lastLL;
187+ }
188+
174189 break ;
175190 }
176191 }
@@ -609,28 +624,28 @@ void QgsLegend::legendLayerRemove()
609624 if ( ll )
610625 {
611626 std::list<QgsMapLayer*> maplayers = ll->mapLayers ();
612- mStateOfCheckBoxes .erase ( ll );
613-
614- // also remove the entries for the QgsLegendLayerFiles from the map
615- std::list<QgsLegendLayerFile*> llfiles = ll->legendLayerFiles ();
616- for ( std::list<QgsLegendLayerFile*>::iterator it = llfiles.begin (); it != llfiles.end (); ++it )
617- {
618- mStateOfCheckBoxes .erase ( *it );
619- }
627+ int layerCount = maplayers.size ();
620628
621629 for ( std::list<QgsMapLayer*>::iterator it = maplayers.begin (); it != maplayers.end (); ++it )
622630 {
623631 // remove the layer
624632 if ( *it )
625633 {
626- // the map layer registry emits a signal an this will remove the legend layer
634+ // the map layer registry emits a signal and this will remove the legend layer file
627635 // from the legend and from memory by calling QgsLegend::removeLayer(QString layer key)
628636 QgsMapLayerRegistry::instance ()->removeMapLayer (( *it )->getLayerID () );
629637 }
630638 }
631639
632- removeItem ( ll );
633- delete ll;
640+ if (layerCount == 0 )
641+ {
642+ // delete the item only when it didn't have any child legend layer files
643+ // (otherwise it is deleted in QgsLegend::removeLayer when deleting last legend layer file)
644+ mStateOfCheckBoxes .erase ( ll );
645+ removeItem ( ll );
646+ delete ll;
647+ }
648+
634649 adjustIconSize ();
635650 return ;
636651 }
0 commit comments