[QGIS Commit] r14167 - in trunk/qgis/src/app: . legend

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Aug 28 19:16:02 EDT 2010


Author: jef
Date: 2010-08-28 23:16:02 +0000 (Sat, 28 Aug 2010)
New Revision: 14167

Modified:
   trunk/qgis/src/app/legend/qgslegend.cpp
   trunk/qgis/src/app/legend/qgslegend.h
   trunk/qgis/src/app/qgisapp.cpp
Log:
[FEATURE] allow selection and removal of several layers at once

Modified: trunk/qgis/src/app/legend/qgslegend.cpp
===================================================================
--- trunk/qgis/src/app/legend/qgslegend.cpp	2010-08-28 23:14:16 UTC (rev 14166)
+++ trunk/qgis/src/app/legend/qgslegend.cpp	2010-08-28 23:16:02 UTC (rev 14167)
@@ -93,6 +93,7 @@
   mInsertionLine->setPalette( pal );
 
   setSortingEnabled( false );
+  setSelectionMode( QAbstractItemView::ExtendedSelection );
   setDragEnabled( false );
   setAutoScroll( true );
   QFont f( "Arial", 10, QFont::Normal );
@@ -600,6 +601,20 @@
   }
 }
 
+QList<QgsMapLayer *> QgsLegend::selectedLayers()
+{
+  QList<QgsMapLayer *> layers;
+
+  foreach( QTreeWidgetItem *item, selectedItems() )
+  {
+    QgsLegendLayer *ll = dynamic_cast<QgsLegendLayer *>( item );
+    if ( ll )
+      layers << ll->layer();
+  }
+
+  return layers;
+}
+
 bool QgsLegend::setCurrentLayer( QgsMapLayer *layer )
 {
   QgsLegendLayer *ll = findLegendLayer( layer );
@@ -1746,3 +1761,29 @@
   }
 }
 
+void QgsLegend::removeSelectedLayers()
+{
+  // Turn off rendering to improve speed.
+  bool renderFlagState = mMapCanvas->renderFlag();
+  mMapCanvas->setRenderFlag( false );
+
+  foreach( QTreeWidgetItem *item, selectedItems() )
+  {
+    QgsLegendGroup* lg = dynamic_cast<QgsLegendGroup *>( item );
+    if ( lg )
+    {
+      removeGroup( lg );
+      continue;
+    }
+
+    QgsLegendLayer *ll = dynamic_cast<QgsLegendLayer *>( item );
+    if ( ll && ll->layer() )
+    {
+      QgsMapLayerRegistry::instance()->removeMapLayer( ll->layer()->getLayerID() );
+      continue;
+    }
+  }
+
+  // Turn on rendering (if it was on previously)
+  mMapCanvas->setRenderFlag( renderFlagState );
+}

Modified: trunk/qgis/src/app/legend/qgslegend.h
===================================================================
--- trunk/qgis/src/app/legend/qgslegend.h	2010-08-28 23:14:16 UTC (rev 14166)
+++ trunk/qgis/src/app/legend/qgslegend.h	2010-08-28 23:16:02 UTC (rev 14167)
@@ -109,6 +109,10 @@
     Else, 0 is returned.*/
     QgsMapLayer* currentLayer();
 
+    /*!Returns the currently selected layer QgsLegendLayers.
+    Else, an empty list is returned.*/
+    QList<QgsMapLayer *> selectedLayers();
+
     /*!set the current layer
     returns true if the layer exists, false otherwise*/
     bool setCurrentLayer( QgsMapLayer *layer );
@@ -263,6 +267,9 @@
 
     /**Updates check states when the map canvas layer set is changed */
     void refreshCheckStates();
+
+    /** Remove selected layers */
+    void removeSelectedLayers();
   protected:
 
     /*!Event handler for mouse movements.

Modified: trunk/qgis/src/app/qgisapp.cpp
===================================================================
--- trunk/qgis/src/app/qgisapp.cpp	2010-08-28 23:14:16 UTC (rev 14166)
+++ trunk/qgis/src/app/qgisapp.cpp	2010-08-28 23:16:02 UTC (rev 14167)
@@ -1072,9 +1072,9 @@
   connect( mActionLayerSelectionSaveAs, SIGNAL( triggered() ), this, SLOT( saveSelectionAsVectorFile() ) );
   mActionLayerSelectionSaveAs->setEnabled( false );
 
-  mActionRemoveLayer = new QAction( getThemeIcon( "mActionRemoveLayer.png" ), tr( "Remove Layer" ), this );
-  shortcuts->registerAction( mActionRemoveLayer, tr( "Ctrl+D", "Remove a Layer" ) );
-  mActionRemoveLayer->setStatusTip( tr( "Remove a Layer" ) );
+  mActionRemoveLayer = new QAction( getThemeIcon( "mActionRemoveLayer.png" ), tr( "Remove Layer(s)" ), this );
+  shortcuts->registerAction( mActionRemoveLayer, tr( "Ctrl+D", "Remove Layer(s)" ) );
+  mActionRemoveLayer->setStatusTip( tr( "Remove Layer(s)" ) );
   connect( mActionRemoveLayer, SIGNAL( triggered() ), this, SLOT( removeLayer() ) );
   mActionRemoveLayer->setEnabled( false );
 
@@ -3964,7 +3964,7 @@
   if ( !mMapLegend )
     return;
 
-  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( activeLayer() );
+  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( activeLayer() ); // FIXME: output of multiple layers at once?
   if ( !vlayer )
     return;
 
@@ -4741,7 +4741,7 @@
   if ( mMapCanvas && mMapCanvas->isDrawing() )
     return;
 
-  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( activeLayer() );
+  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( activeLayer() ); // FIXME: save edits of all selected layers
   if ( !vlayer || !vlayer->isEditable() || !vlayer->isModified() )
     return;
 
@@ -4989,18 +4989,20 @@
     return;
   }
 
-  QgsMapLayer *layer = activeLayer();
-
-  if ( !layer )
+  if ( !mMapLegend )
   {
     return;
   }
 
-  QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer*>( layer );
-  if ( vlayer && vlayer->isEditable() && !toggleEditing( vlayer, true ) )
-    return;
+  foreach( QgsMapLayer *layer, mMapLegend->selectedLayers() )
+  {
+    QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer*>( layer );
+    if ( vlayer && vlayer->isEditable() && !toggleEditing( vlayer, true ) )
+      return;
+  }
 
-  QgsMapLayerRegistry::instance()->removeMapLayer( layer->getLayerID() );
+  mMapLegend->removeSelectedLayers();
+
   mMapCanvas->refresh();
 }
 
@@ -5903,6 +5905,8 @@
 
 void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
 {
+  mActionRemoveLayer->setEnabled( mMapLegend && mMapLegend->selectedItems().size() > 0 );
+
   if ( !layer )
   {
     mActionSelect->setEnabled( false );
@@ -5917,7 +5921,6 @@
     mActionSaveEdits->setEnabled( false );
     mActionLayerSaveAs->setEnabled( false );
     mActionLayerSelectionSaveAs->setEnabled( false );
-    mActionRemoveLayer->setEnabled( false );
     mActionLayerProperties->setEnabled( false );
     mActionLayerSubsetString->setEnabled( false );
     mActionAddToOverview->setEnabled( false );
@@ -5951,7 +5954,6 @@
     return;
   }
 
-  mActionRemoveLayer->setEnabled( true );
   mActionLayerProperties->setEnabled( true );
   mActionAddToOverview->setEnabled( true );
 



More information about the QGIS-commit mailing list