Skip to content

Commit 8d4a656

Browse files
committed
[BACKPORT] to 1.8. Further improvements to multiple layer removal in one operation support for the registry and apply suggested improvements from Jürgen.
1 parent 985e453 commit 8d4a656

File tree

9 files changed

+256
-148
lines changed

9 files changed

+256
-148
lines changed

python/core/qgsmaplayerregistry.sip

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,23 @@ public:
2626
//! Retrieve the mapLayers collection (mainly intended for use by projection)
2727
QMap<QString,QgsMapLayer*> & mapLayers();
2828

29+
/** Add a list of layers to the map of loaded layers
30+
@returns QList<QgsMapLayer *> - a list of the map layers that were added
31+
successfully. If a layer is invalid, or already exists in the registry,
32+
it will not be part of the returned QList.
33+
@note added in QGIS 1.8
34+
35+
As a side-effect QgsProject is made dirty.
36+
37+
If theEmitSignal is true (by default), a layersAdded( QList<QgsMapLayer *>)
38+
signal will be emitted indicating that a batch of layers were added.
39+
Not emitting signal is useful when you want to use registry for layers
40+
on a different canvas and don't want them added to the main canvas automatically.
41+
*/
42+
QList<QgsMapLayer *> addMapLayers( QList<QgsMapLayer *> theMapLayers,
43+
bool theEmitSignal = true ) /Deprecated/;
44+
45+
2946
/** Add a layer to the map of loaded layers
3047
@returns NULL if unable to add layer, otherwise pointer to newly added layer
3148
@note
@@ -38,17 +55,26 @@ public:
3855
*/
3956
QgsMapLayer * addMapLayer(QgsMapLayer * theMapLayer /Transfer/, bool theEmitSignal = TRUE);
4057

41-
/** Remove a layer from qgis
58+
/** Remove a set of layers from qgis
59+
@note As a side-effect QgsProject is made dirty.
60+
Any canvases using the affected layers will need to remove them
4261

43-
@note
62+
If theEmitSignal is true (by default), a layersRemoved( QStringList theLayerIds )
63+
signal will be emitted indicating to any listeners that the layers are being removed.
4464

45-
As a side-effect QgsProject is made dirty.
65+
The layer being removed is deleted as well as the registry
66+
table entry.
67+
*/
68+
void removeMapLayers( QStringList theLayerIds, bool theEmitSignal = true );
4669

70+
71+
/** Remove a layer from qgis
72+
@note
73+
As a side-effect QgsProject is made dirty.
4774
Any canvases using that layer will need to remove it
48-
4975
theEmitSignal - see addMapLayer()
5076
*/
51-
void removeMapLayer(QString theLayerId, bool theEmitSignal = TRUE);
77+
void removeMapLayer(QString theLayerId, bool theEmitSignal = TRUE) /Deprecated/;
5278

5379
/** Remove all registered layers
5480

@@ -72,17 +98,26 @@ public:
7298
void reloadAllLayers();
7399

74100
signals:
101+
/** Emitted when one or more layers are removed from the registry
102+
@note intended to replace layerWillBeRemoved in QGIS 1.8
103+
*/
104+
void layersWillBeRemoved( QStringList theLayerIds );
75105

76-
/** emitted when a layer is removed from the registry
77-
78-
connected to main map canvas and overview map canvas remove()
79-
*/
106+
/** emitted when a layer is removed from the registry
107+
connected to main map canvas and overview map canvas remove()
108+
@note rather use layersWillBeRemoved
109+
*/
80110
void layerWillBeRemoved(QString theLayerId);
81111

82-
/** emitted when a layer is added to the registry
112+
/** Emitted when one or more layers are added to the registry
113+
@note intended to replace layerWasAdded in QGIS 1.8
114+
*/
115+
void layersAdded( QList<QgsMapLayer *> theMapLayers );
83116

84-
connected to main map canvas and overview map canvas addLayer()
85-
*/
117+
/** emitted when a layer is added to the registry
118+
connected to main map canvas and overview map canvas addLayer()
119+
@note rather use layersWereAdded
120+
*/
86121
void layerWasAdded(QgsMapLayer * theMapLayer);
87122

88123
/** emitted when ALL layers are removed at once

src/app/gps/qgsgpsinformationwidget.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,13 +1073,17 @@ void QgsGPSInformationWidget::updateCloseFeatureButton( QgsMapLayer * lyr )
10731073
{
10741074
if ( mpLastLayer ) // disconnect previous layer
10751075
{
1076-
disconnect( mpLastLayer, SIGNAL( editingStarted() ), this, SLOT( layerEditStateChanged() ) );
1077-
disconnect( mpLastLayer, SIGNAL( editingStopped() ), this, SLOT( layerEditStateChanged() ) );
1076+
disconnect( mpLastLayer, SIGNAL( editingStarted() ),
1077+
this, SLOT( layerEditStateChanged() ) );
1078+
disconnect( mpLastLayer, SIGNAL( editingStopped() ),
1079+
this, SLOT( layerEditStateChanged() ) );
10781080
}
10791081
if ( vlayer ) // connect new layer
10801082
{
1081-
connect( vlayer, SIGNAL( editingStarted() ), this, SLOT( layerEditStateChanged() ) );
1082-
connect( vlayer, SIGNAL( editingStopped() ), this, SLOT( layerEditStateChanged() ) );
1083+
connect( vlayer, SIGNAL( editingStarted() ),
1084+
this, SLOT( layerEditStateChanged() ) );
1085+
connect( vlayer, SIGNAL( editingStopped() ),
1086+
this, SLOT( layerEditStateChanged() ) );
10831087
}
10841088
mpLastLayer = vlayer;
10851089
}

src/app/legend/qgslegend.cpp

Lines changed: 102 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,14 @@ QgsLegend::QgsLegend( QgsMapCanvas *canvas, QWidget * parent, const char *name )
9595
this, SLOT( writeProject( QDomDocument & ) ) );
9696

9797
// connect map layer registry signal to legend
98-
connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWillBeRemoved( QString ) ),
99-
this, SLOT( removeLayer( QString ) ) );
98+
connect( QgsMapLayerRegistry::instance(),
99+
SIGNAL( layersWillBeRemoved( QStringList ) ),
100+
this, SLOT( removeLayers( QStringList ) ) );
100101
connect( QgsMapLayerRegistry::instance(), SIGNAL( removedAll() ),
101102
this, SLOT( removeAll() ) );
102-
connect( QgsMapLayerRegistry::instance(), SIGNAL( layerWasAdded( QgsMapLayer* ) ),
103-
this, SLOT( addLayer( QgsMapLayer * ) ) );
103+
connect( QgsMapLayerRegistry::instance(),
104+
SIGNAL( layersAdded( QList<QgsMapLayer*> ) ),
105+
this, SLOT( addLayers( QList<QgsMapLayer *> ) ) );
104106

105107
connect( mMapCanvas, SIGNAL( layersChanged() ),
106108
this, SLOT( refreshCheckStates() ) );
@@ -279,38 +281,48 @@ void QgsLegend::removeGroup( int groupIndex )
279281
}
280282
}
281283

282-
void QgsLegend::removeLayer( QString layerId )
284+
void QgsLegend::removeLayers( QStringList theLayers )
283285
{
284286
QgsDebugMsg( "Entering." );
285-
286-
bool invLayerRemoved = false;
287-
288-
for ( QTreeWidgetItem* theItem = firstItem(); theItem; theItem = nextItem( theItem ) )
287+
foreach (const QString &myId, theLayers)
289288
{
290-
QgsLegendItem *li = dynamic_cast<QgsLegendItem *>( theItem );
291-
if ( li )
292-
{
293-
// save legend layer (parent of a legend layer file we're going to delete)
294-
QgsLegendLayer* ll = qobject_cast<QgsLegendLayer *>( li );
289+
bool invLayerRemoved = false;
295290

296-
if ( ll && ll->layer() && ll->layer()->id() == layerId )
291+
for ( QTreeWidgetItem* theItem = firstItem();
292+
theItem; theItem = nextItem( theItem ) )
293+
{
294+
QgsLegendItem *li = dynamic_cast<QgsLegendItem *>( theItem );
295+
if ( li )
297296
{
298-
if ( !ll->isVisible() )
297+
// save legend layer (parent of a legend layer file we're going to delete)
298+
QgsLegendLayer* ll = qobject_cast<QgsLegendLayer *>( li );
299+
300+
if ( ll && ll->layer() && ll->layer()->id() == myId )
299301
{
300-
invLayerRemoved = true;
302+
if ( !ll->isVisible() )
303+
{
304+
invLayerRemoved = true;
305+
}
306+
removeItem( ll );
307+
delete ll;
308+
break;
301309
}
302-
removeItem( ll );
303-
delete ll;
304-
break;
305310
}
306311
}
312+
emit itemRemoved();
313+
if ( invLayerRemoved )
314+
emit invisibleLayerRemoved();
307315
}
308316
updateMapCanvasLayerSet();
309317
adjustIconSize();
318+
}
310319

311-
emit itemRemoved();
312-
if ( invLayerRemoved )
313-
emit invisibleLayerRemoved();
320+
//deprecated delegates to removeLayers now
321+
void QgsLegend::removeLayer( QString theLayer )
322+
{
323+
QStringList myList;
324+
myList << theLayer;
325+
removeLayers(myList);
314326
}
315327

316328
void QgsLegend::mousePressEvent( QMouseEvent * e )
@@ -846,77 +858,98 @@ int QgsLegend::getItemPos( QTreeWidgetItem* item )
846858
return -1;
847859
}
848860

849-
void QgsLegend::addLayer( QgsMapLayer * layer )
861+
//introduced in QGIS 1.8 - add layers in a batch
862+
void QgsLegend::addLayers( QList<QgsMapLayer *> theLayerList )
850863
{
851864
QgsDebugMsg( "Entering." );
852865
if ( !mMapCanvas || mMapCanvas->isDrawing() )
853866
{
854867
return;
855868
}
856869

857-
QgsLegendLayer* llayer = new QgsLegendLayer( layer );
858-
if ( !QgsProject::instance()->layerIsEmbedded( layer->id() ).isEmpty() )
859-
{
860-
QFont itemFont;
861-
itemFont.setItalic( true );
862-
llayer->setFont( 0, itemFont );
863-
}
870+
QSettings settings;
864871

865-
//set the correct check states
866-
blockSignals( true );
867-
llayer->setCheckState( 0, llayer->isVisible() ? Qt::Checked : Qt::Unchecked );
868-
blockSignals( false );
872+
//Note if the canvas was previously blank so we can
873+
//zoom to all layers at the end if neeeded
874+
bool myFirstLayerFlag = false;
875+
if ( layers().count() > 0 ) myFirstLayerFlag = true;
869876

870-
QgsLegendGroup *lg = dynamic_cast<QgsLegendGroup *>( currentItem() );
871-
if ( !lg && currentItem() )
877+
//iteratively add the layers to the canvas
878+
for (int i = 0; i < theLayerList.size(); ++i)
872879
{
873-
lg = dynamic_cast<QgsLegendGroup *>( currentItem()->parent() );
874-
}
880+
QgsMapLayer * layer = theLayerList.at(i);
881+
QgsLegendLayer* llayer = new QgsLegendLayer( layer );
882+
if ( !QgsProject::instance()->layerIsEmbedded( layer->id() ).isEmpty() )
883+
{
884+
QFont itemFont;
885+
itemFont.setItalic( true );
886+
llayer->setFont( 0, itemFont );
887+
}
875888

876-
int index;
877-
if ( lg )
878-
{
879-
index = lg->indexOfChild( currentItem() );
880-
}
881-
else
882-
{
883-
index = indexOfTopLevelItem( currentItem() );
884-
}
889+
//set the correct check states
890+
blockSignals( true );
891+
llayer->setCheckState( 0, llayer->isVisible() ? Qt::Checked : Qt::Unchecked );
892+
blockSignals( false );
885893

886-
if ( index < 0 )
887-
{
888-
index = 0;
889-
}
894+
QgsLegendGroup *lg = dynamic_cast<QgsLegendGroup *>( currentItem() );
895+
if ( !lg && currentItem() )
896+
{
897+
lg = dynamic_cast<QgsLegendGroup *>( currentItem()->parent() );
898+
}
890899

891-
QSettings settings;
892-
if ( lg && settings.value( "/qgis/addNewLayersToCurrentGroup", false ).toBool() )
893-
{
894-
lg->insertChild( index, llayer );
895-
}
896-
else
897-
{
898-
insertTopLevelItem( index, llayer );
899-
setCurrentItem( llayer );
900-
}
900+
int index = 0;
901+
if ( lg )
902+
{
903+
index = lg->indexOfChild( currentItem() );
904+
}
905+
else
906+
{
907+
index = indexOfTopLevelItem( currentItem() );
908+
}
901909

902-
setItemExpanded( llayer, true );
903-
//don't expand raster items by default, there could be too many
904-
refreshLayerSymbology( layer->id(), layer->type() != QgsMapLayer::RasterLayer );
910+
if ( index < 0 )
911+
{
912+
index = 0;
913+
}
905914

906-
updateMapCanvasLayerSet();
915+
if ( lg && settings.value( "/qgis/addNewLayersToCurrentGroup", false ).toBool() )
916+
{
917+
lg->insertChild( index, llayer );
918+
}
919+
else
920+
{
921+
insertTopLevelItem( index, llayer );
922+
setCurrentItem( llayer );
923+
}
924+
925+
setItemExpanded( llayer, true );
926+
//don't expand raster items by default, there could be too many
927+
refreshLayerSymbology( layer->id(), layer->type() != QgsMapLayer::RasterLayer );
907928

929+
updateMapCanvasLayerSet();
930+
emit itemAdded( indexFromItem( llayer ) );
931+
}
908932
// first layer?
909-
if ( layers().count() == 1 )
933+
if ( myFirstLayerFlag )
910934
{
935+
QgsMapLayer * myFirstLayer = theLayerList.at(0);
911936
if ( !mMapCanvas->mapRenderer()->hasCrsTransformEnabled() )
912-
mMapCanvas->mapRenderer()->setDestinationCrs( layer->crs() );
937+
mMapCanvas->mapRenderer()->setDestinationCrs( myFirstLayer->crs() );
913938
mMapCanvas->zoomToFullExtent();
914939
mMapCanvas->clearExtentHistory();
915940
}
916941
//make the QTreeWidget item up-to-date
917942
doItemsLayout();
918943

919-
emit itemAdded( indexFromItem( llayer ) );
944+
945+
}
946+
947+
//deprecated since 1.8 - delegates to addLayers
948+
void QgsLegend::addLayer( QgsMapLayer * layer )
949+
{
950+
QList<QgsMapLayer *> myList;
951+
myList << layer;
952+
addLayers( myList );
920953
}
921954

922955
void QgsLegend::setLayerVisible( QgsMapLayer * layer, bool visible )

src/app/legend/qgslegend.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,13 @@ class QgsLegend : public QTreeWidget
207207

208208
public slots:
209209

210-
/*!Adds a new layer group with the maplayer to the canvas*/
210+
211+
/*!Adds a new layer group with the maplayers to the canvas*/
212+
void addLayers( QList<QgsMapLayer *> );
213+
214+
/** Adds a new layer group with the maplayer to the canvas
215+
* @note Deprecated since 1.8 - use addLayers rather
216+
*/
211217
void addLayer( QgsMapLayer * layer );
212218

213219
void setLayerVisible( QgsMapLayer * layer, bool visible );
@@ -264,8 +270,14 @@ class QgsLegend : public QTreeWidget
264270
*/
265271
void removeGroup( int groupIndex );
266272

273+
/*!
274+
* @deprecated - use removeLayers() rather
275+
*/
267276
void removeLayer( QString );
268277

278+
/** Remove one or more layers from the legend */
279+
void removeLayers( QStringList theLayers );
280+
269281
/** called to read legend settings from project */
270282
void readProject( const QDomDocument & );
271283

0 commit comments

Comments
 (0)