[QGIS Commit] r9682 - trunk/qgis/src/app/legend

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri Nov 21 17:26:14 EST 2008


Author: wonder
Date: 2008-11-21 17:26:14 -0500 (Fri, 21 Nov 2008)
New Revision: 9682

Modified:
   trunk/qgis/src/app/legend/qgslegend.cpp
Log:
Delete parent legend layer item if a map layer has been removed from registry and
it was the only (last) legend layer file.


Modified: trunk/qgis/src/app/legend/qgslegend.cpp
===================================================================
--- trunk/qgis/src/app/legend/qgslegend.cpp	2008-11-21 17:34:48 UTC (rev 9681)
+++ trunk/qgis/src/app/legend/qgslegend.cpp	2008-11-21 22:26:14 UTC (rev 9682)
@@ -156,12 +156,18 @@
 
   QTreeWidgetItem* theItem = firstItem();
   QgsDebugMsg( "called." );
+  
+  QgsLegendLayer* lastLL = NULL;
 
   while ( theItem )
   {
     QgsLegendItem *li = dynamic_cast<QgsLegendItem*>( theItem );
     if ( li )
     {
+      // save legend layer (parent of a legend layer file we're going to delete)
+      QgsLegendLayer* ll = dynamic_cast<QgsLegendLayer*>( li );
+      if ( ll ) lastLL = ll;
+
       QgsLegendLayerFile* llf = dynamic_cast<QgsLegendLayerFile*>( li );
       if ( llf )
       {
@@ -171,6 +177,15 @@
           mStateOfCheckBoxes.erase( llf );
           removeItem( llf );
           delete llf;
+          
+          // delete also parent legend layer if now it's empty
+          if (lastLL->mapLayers().size() == 0)
+          {
+            mStateOfCheckBoxes.erase( lastLL );
+            removeItem( lastLL );
+            delete lastLL;
+          }
+          
           break;
         }
       }
@@ -609,28 +624,28 @@
   if ( ll )
   {
     std::list<QgsMapLayer*> maplayers = ll->mapLayers();
-    mStateOfCheckBoxes.erase( ll );
+    int layerCount = maplayers.size();
 
-    //also remove the entries for the QgsLegendLayerFiles from the map
-    std::list<QgsLegendLayerFile*> llfiles = ll->legendLayerFiles();
-    for ( std::list<QgsLegendLayerFile*>::iterator it = llfiles.begin(); it != llfiles.end(); ++it )
-    {
-      mStateOfCheckBoxes.erase( *it );
-    }
-
     for ( std::list<QgsMapLayer*>::iterator it = maplayers.begin(); it != maplayers.end(); ++it )
     {
       //remove the layer
       if ( *it )
       {
-        //the map layer registry emits a signal an this will remove the legend layer
+        //the map layer registry emits a signal and this will remove the legend layer file
         //from the legend and from memory by calling QgsLegend::removeLayer(QString layer key)
         QgsMapLayerRegistry::instance()->removeMapLayer(( *it )->getLayerID() );
       }
     }
 
-    removeItem( ll );
-    delete ll;
+    if (layerCount == 0)
+    {
+      // delete the item only when it didn't have any child legend layer files
+      // (otherwise it is deleted in QgsLegend::removeLayer when deleting last legend layer file)
+      mStateOfCheckBoxes.erase( ll );
+      removeItem( ll );
+      delete ll;
+    }
+    
     adjustIconSize();
     return;
   }



More information about the QGIS-commit mailing list