@@ -156,12 +156,18 @@ void QgsLegend::removeLayer( QString layer_key )
156
156
157
157
QTreeWidgetItem* theItem = firstItem ();
158
158
QgsDebugMsg ( " called." );
159
+
160
+ QgsLegendLayer* lastLL = NULL ;
159
161
160
162
while ( theItem )
161
163
{
162
164
QgsLegendItem *li = dynamic_cast <QgsLegendItem*>( theItem );
163
165
if ( li )
164
166
{
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
+
165
171
QgsLegendLayerFile* llf = dynamic_cast <QgsLegendLayerFile*>( li );
166
172
if ( llf )
167
173
{
@@ -171,6 +177,15 @@ void QgsLegend::removeLayer( QString layer_key )
171
177
mStateOfCheckBoxes .erase ( llf );
172
178
removeItem ( llf );
173
179
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
+
174
189
break ;
175
190
}
176
191
}
@@ -609,28 +624,28 @@ void QgsLegend::legendLayerRemove()
609
624
if ( ll )
610
625
{
611
626
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 ();
620
628
621
629
for ( std::list<QgsMapLayer*>::iterator it = maplayers.begin (); it != maplayers.end (); ++it )
622
630
{
623
631
// remove the layer
624
632
if ( *it )
625
633
{
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
627
635
// from the legend and from memory by calling QgsLegend::removeLayer(QString layer key)
628
636
QgsMapLayerRegistry::instance ()->removeMapLayer (( *it )->getLayerID () );
629
637
}
630
638
}
631
639
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
+
634
649
adjustIconSize ();
635
650
return ;
636
651
}
0 commit comments