Skip to content

Commit a0dfcec

Browse files
author
wonder
committedNov 21, 2008
Delete parent legend layer item if a map layer has been removed from registry and
it was the only (last) legend layer file. git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@9682 c8812cc2-4d05-0410-92ff-de0c093fc19c

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed
 

‎src/app/legend/qgslegend.cpp

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)
Please sign in to comment.