[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