Skip to content

Commit 26afb2e

Browse files
committed
Use QgsMapLayerStore within QgsProject
1 parent f9bd83c commit 26afb2e

File tree

6 files changed

+81
-143
lines changed

6 files changed

+81
-143
lines changed

python/core/qgsmaplayerstore.sip

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ class QgsMapLayerStore : QObject
7777
%End
7878

7979

80-
QList<QgsMapLayer *> addMapLayers( const QList<QgsMapLayer *> &layers /Transfer/ );
80+
QList<QgsMapLayer *> addMapLayers( const QList<QgsMapLayer *> &layers /Transfer/);
81+
8182
%Docstring
8283
\brief
8384
Add a list of ``layers`` to the store. Ownership of the layers is transferred
@@ -86,6 +87,9 @@ class QgsMapLayerStore : QObject
8687
The layersAdded() and layerWasAdded() signals will always be emitted.
8788

8889
\param layers A list of layer which should be added to the store.
90+
\param takeOwnership Ownership will be transferred to the layer store.
91+
If you specify false here you have take care of deleting
92+
the layers yourself. Not available in Python.
8993

9094
:return: a list of the map layers that were added
9195
successfully. If a layer is invalid, or already exists in the store,
@@ -95,7 +99,8 @@ class QgsMapLayerStore : QObject
9599
:rtype: list of QgsMapLayer
96100
%End
97101

98-
QgsMapLayer *addMapLayer( QgsMapLayer *layer /Transfer/ );
102+
QgsMapLayer *addMapLayer( QgsMapLayer *layer /Transfer/);
103+
99104
%Docstring
100105
\brief
101106
Add a ``layer`` to the store. Ownership of the layer is transferred to the
@@ -106,6 +111,9 @@ class QgsMapLayerStore : QObject
106111
addMapLayers() instead.
107112

108113
\param layer A layer to add to the store
114+
\param takeOwnership Ownership will be transferred to the layer store.
115+
If you specify false here you have take care of deleting
116+
the layers yourself. Not available in Python.
109117

110118
:return: None if unable to add layer, otherwise pointer to newly added layer
111119

@@ -137,6 +145,19 @@ class QgsMapLayerStore : QObject
137145
%End
138146

139147
void removeMapLayers( const QList<QgsMapLayer *> &layers );
148+
%Docstring
149+
\brief
150+
Remove a set of ``layers`` from the store.
151+
152+
The specified layers will be removed from the store.
153+
These layers will also be deleted.
154+
155+
\param layers A list of layers to remove. Null pointers are ignored.
156+
157+
.. seealso:: takeMapLayer()
158+
.. seealso:: removeMapLayer()
159+
.. seealso:: removeAllMapLayers()
160+
%End
140161

141162
void removeMapLayer( const QString &id );
142163
%Docstring

src/core/qgsmaplayerstore.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ QList<QgsMapLayer *> QgsMapLayerStore::mapLayersByName( const QString &layerName
5050
return myResultList;
5151
}
5252

53-
QList<QgsMapLayer *> QgsMapLayerStore::addMapLayers(
54-
const QList<QgsMapLayer *> &layers )
53+
QList<QgsMapLayer *> QgsMapLayerStore::addMapLayers( const QList<QgsMapLayer *> &layers, bool takeOwnership )
5554
{
5655
QList<QgsMapLayer *> myResultList;
5756
Q_FOREACH ( QgsMapLayer *myLayer, layers )
@@ -66,7 +65,10 @@ QList<QgsMapLayer *> QgsMapLayerStore::addMapLayers(
6665
{
6766
mMapLayers[myLayer->id()] = myLayer;
6867
myResultList << mMapLayers[myLayer->id()];
69-
myLayer->setParent( this );
68+
if ( takeOwnership )
69+
{
70+
myLayer->setParent( this );
71+
}
7072
connect( myLayer, &QObject::destroyed, this, &QgsMapLayerStore::onMapLayerDeleted );
7173
emit layerWasAdded( myLayer );
7274
}
@@ -79,10 +81,10 @@ QList<QgsMapLayer *> QgsMapLayerStore::addMapLayers(
7981
}
8082

8183
QgsMapLayer *
82-
QgsMapLayerStore::addMapLayer( QgsMapLayer *layer )
84+
QgsMapLayerStore::addMapLayer( QgsMapLayer *layer, bool takeOwnership )
8385
{
8486
QList<QgsMapLayer *> addedLayers;
85-
addedLayers = addMapLayers( QList<QgsMapLayer *>() << layer );
87+
addedLayers = addMapLayers( QList<QgsMapLayer *>() << layer, takeOwnership );
8688
return addedLayers.isEmpty() ? nullptr : addedLayers[0];
8789
}
8890

src/core/qgsmaplayerstore.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,18 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
124124
* The layersAdded() and layerWasAdded() signals will always be emitted.
125125
*
126126
* \param layers A list of layer which should be added to the store.
127+
* \param takeOwnership Ownership will be transferred to the layer store.
128+
* If you specify false here you have take care of deleting
129+
* the layers yourself. Not available in Python.
127130
*
128131
* \returns a list of the map layers that were added
129132
* successfully. If a layer is invalid, or already exists in the store,
130133
* it will not be part of the returned list.
131134
*
132135
* \see addMapLayer()
133136
*/
134-
QList<QgsMapLayer *> addMapLayers( const QList<QgsMapLayer *> &layers SIP_TRANSFER );
137+
QList<QgsMapLayer *> addMapLayers( const QList<QgsMapLayer *> &layers SIP_TRANSFER,
138+
bool takeOwnership SIP_PYARGREMOVE = true );
135139

136140
/**
137141
* \brief
@@ -143,6 +147,9 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
143147
* addMapLayers() instead.
144148
*
145149
* \param layer A layer to add to the store
150+
* \param takeOwnership Ownership will be transferred to the layer store.
151+
* If you specify false here you have take care of deleting
152+
* the layers yourself. Not available in Python.
146153
*
147154
* \returns nullptr if unable to add layer, otherwise pointer to newly added layer
148155
*
@@ -151,7 +158,8 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
151158
* \note Use addMapLayers() if adding more than one layer at a time.
152159
* \see addMapLayers()
153160
*/
154-
QgsMapLayer *addMapLayer( QgsMapLayer *layer SIP_TRANSFER );
161+
QgsMapLayer *addMapLayer( QgsMapLayer *layer SIP_TRANSFER,
162+
bool takeOwnership SIP_PYARGREMOVE = true );
155163

156164
/**
157165
* \brief
@@ -182,7 +190,6 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
182190
* \see removeMapLayer()
183191
* \see removeAllMapLayers()
184192
*/
185-
//TODO QGIS 3.0 - add PyName alias to avoid list type conversion error
186193
void removeMapLayers( const QList<QgsMapLayer *> &layers );
187194

188195
/**

src/core/qgsproject.cpp

Lines changed: 37 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#include "qgssettings.h"
4747
#include "qgsmaplayerlistutils.h"
4848
#include "qgslayoutmanager.h"
49+
#include "qgsmaplayerstore.h"
4950

5051
#include <QApplication>
5152
#include <QFileInfo>
@@ -322,6 +323,7 @@ void removeKey_( const QString &scope,
322323

323324
QgsProject::QgsProject( QObject *parent )
324325
: QObject( parent )
326+
, mLayerStore( new QgsMapLayerStore( this ) )
325327
, mBadLayerHandler( new QgsProjectBadLayerHandler() )
326328
, mSnappingConfig( this )
327329
, mRelationManager( new QgsRelationManager( this ) )
@@ -343,6 +345,21 @@ QgsProject::QgsProject( QObject *parent )
343345
connect( this, &QgsProject::layersAdded, this, &QgsProject::onMapLayersAdded );
344346
connect( this, &QgsProject::layersRemoved, this, [ = ] { cleanTransactionGroups(); } );
345347
connect( this, static_cast < void ( QgsProject::* )( const QList<QgsMapLayer *> & ) >( &QgsProject::layersWillBeRemoved ), this, &QgsProject::onMapLayersRemoved );
348+
349+
// proxy map layer store signals to this
350+
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( const QStringList & )>( &QgsMapLayerStore::layersWillBeRemoved ),
351+
this, static_cast<void ( QgsProject::* )( const QStringList & )>( &QgsProject::layersWillBeRemoved ) );
352+
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( const QList<QgsMapLayer *> & )>( &QgsMapLayerStore::layersWillBeRemoved ),
353+
this, static_cast<void ( QgsProject::* )( const QList<QgsMapLayer *> & )>( &QgsProject::layersWillBeRemoved ) );
354+
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( const QString & )>( &QgsMapLayerStore::layerWillBeRemoved ),
355+
this, static_cast<void ( QgsProject::* )( const QString & )>( &QgsProject::layerWillBeRemoved ) );
356+
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( QgsMapLayer * )>( &QgsMapLayerStore::layerWillBeRemoved ),
357+
this, static_cast<void ( QgsProject::* )( QgsMapLayer * )>( &QgsProject::layerWillBeRemoved ) );
358+
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( const QStringList & )>( &QgsMapLayerStore::layersRemoved ), this, &QgsProject::layersRemoved );
359+
connect( mLayerStore.get(), &QgsMapLayerStore::layerRemoved, this, &QgsProject::layerRemoved );
360+
connect( mLayerStore.get(), &QgsMapLayerStore::allLayersRemoved, this, &QgsProject::removeAll );
361+
connect( mLayerStore.get(), &QgsMapLayerStore::layersAdded, this, &QgsProject::layersAdded );
362+
connect( mLayerStore.get(), &QgsMapLayerStore::layerWasAdded, this, &QgsProject::layerWasAdded );
346363
}
347364

348365

@@ -884,7 +901,8 @@ bool QgsProject::read()
884901

885902
// Resolve references to other vector layers
886903
// Needs to be done here once all dependent layers are loaded
887-
for ( QMap<QString, QgsMapLayer *>::iterator it = mMapLayers.begin(); it != mMapLayers.end(); it++ )
904+
QMap<QString, QgsMapLayer *> layers = mLayerStore->mapLayers();
905+
for ( QMap<QString, QgsMapLayer *>::iterator it = layers.begin(); it != layers.end(); it++ )
888906
{
889907
if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( it.value() ) )
890908
vl->resolveReferences( this );
@@ -2066,63 +2084,33 @@ QMap<QPair<QString, QString>, QgsTransactionGroup *> QgsProject::transactionGrou
20662084

20672085

20682086
//
2069-
// QgsMapLayerRegistry methods
2087+
// QgsMapLayerStore methods
20702088
//
20712089

20722090

20732091
int QgsProject::count() const
20742092
{
2075-
return mMapLayers.size();
2093+
return mLayerStore->count();
20762094
}
20772095

20782096
QgsMapLayer *QgsProject::mapLayer( const QString &layerId ) const
20792097
{
2080-
return mMapLayers.value( layerId );
2098+
return mLayerStore->mapLayer( layerId );
20812099
}
20822100

20832101
QList<QgsMapLayer *> QgsProject::mapLayersByName( const QString &layerName ) const
20842102
{
2085-
QList<QgsMapLayer *> myResultList;
2086-
Q_FOREACH ( QgsMapLayer *layer, mMapLayers )
2087-
{
2088-
if ( layer->name() == layerName )
2089-
{
2090-
myResultList << layer;
2091-
}
2092-
}
2093-
return myResultList;
2103+
return mLayerStore->mapLayersByName( layerName );
20942104
}
20952105

20962106
QList<QgsMapLayer *> QgsProject::addMapLayers(
20972107
const QList<QgsMapLayer *> &layers,
20982108
bool addToLegend,
20992109
bool takeOwnership )
21002110
{
2101-
QList<QgsMapLayer *> myResultList;
2102-
Q_FOREACH ( QgsMapLayer *myLayer, layers )
2103-
{
2104-
if ( !myLayer || !myLayer->isValid() )
2105-
{
2106-
QgsDebugMsg( "Cannot add invalid layers" );
2107-
continue;
2108-
}
2109-
//check the layer is not already registered!
2110-
if ( !mMapLayers.contains( myLayer->id() ) )
2111-
{
2112-
mMapLayers[myLayer->id()] = myLayer;
2113-
myResultList << mMapLayers[myLayer->id()];
2114-
if ( takeOwnership )
2115-
{
2116-
myLayer->setParent( this );
2117-
}
2118-
connect( myLayer, &QObject::destroyed, this, &QgsProject::onMapLayerDeleted );
2119-
emit layerWasAdded( myLayer );
2120-
}
2121-
}
2111+
QList<QgsMapLayer *> myResultList = mLayerStore->addMapLayers( layers, takeOwnership );
21222112
if ( !myResultList.isEmpty() )
21232113
{
2124-
emit layersAdded( myResultList );
2125-
21262114
if ( addToLegend )
21272115
emit legendLayersAdded( myResultList );
21282116
}
@@ -2141,116 +2129,47 @@ QgsProject::addMapLayer( QgsMapLayer *layer,
21412129

21422130
void QgsProject::removeMapLayers( const QStringList &layerIds )
21432131
{
2144-
QList<QgsMapLayer *> layers;
2145-
Q_FOREACH ( const QString &myId, layerIds )
2146-
{
2147-
layers << mMapLayers.value( myId );
2148-
}
2149-
2150-
removeMapLayers( layers );
2132+
mLayerStore->removeMapLayers( layerIds );
21512133
}
21522134

21532135
void QgsProject::removeMapLayers( const QList<QgsMapLayer *> &layers )
21542136
{
2155-
if ( layers.isEmpty() )
2156-
return;
2157-
2158-
QStringList layerIds;
2159-
QList<QgsMapLayer *> layerList;
2160-
2161-
Q_FOREACH ( QgsMapLayer *layer, layers )
2162-
{
2163-
// check layer and the registry contains it
2164-
if ( layer && mMapLayers.contains( layer->id() ) )
2165-
{
2166-
layerIds << layer->id();
2167-
layerList << layer;
2168-
}
2169-
}
2170-
2171-
if ( layerIds.isEmpty() )
2172-
return;
2173-
2174-
emit layersWillBeRemoved( layerIds );
2175-
emit layersWillBeRemoved( layerList );
2176-
2177-
Q_FOREACH ( QgsMapLayer *lyr, layerList )
2178-
{
2179-
QString myId( lyr->id() );
2180-
emit layerWillBeRemoved( myId );
2181-
emit layerWillBeRemoved( lyr );
2182-
mMapLayers.remove( myId );
2183-
if ( lyr->parent() == this )
2184-
{
2185-
delete lyr;
2186-
}
2187-
emit layerRemoved( myId );
2188-
}
2189-
2190-
emit layersRemoved( layerIds );
2137+
mLayerStore->removeMapLayers( layers );
21912138
}
21922139

21932140
void QgsProject::removeMapLayer( const QString &layerId )
21942141
{
2195-
removeMapLayers( QList<QgsMapLayer *>() << mMapLayers.value( layerId ) );
2142+
mLayerStore->removeMapLayer( layerId );
21962143
}
21972144

21982145
void QgsProject::removeMapLayer( QgsMapLayer *layer )
21992146
{
2200-
if ( layer )
2201-
removeMapLayers( QList<QgsMapLayer *>() << layer );
2147+
mLayerStore->removeMapLayer( layer );
22022148
}
22032149

22042150
QgsMapLayer *QgsProject::takeMapLayer( QgsMapLayer *layer )
22052151
{
2206-
if ( !layer )
2207-
return nullptr;
2208-
2209-
if ( mMapLayers.contains( layer->id() ) )
2210-
{
2211-
emit layersWillBeRemoved( QStringList() << layer->id() );
2212-
emit layersWillBeRemoved( QList<QgsMapLayer *>() << layer );
2213-
emit layerWillBeRemoved( layer->id() );
2214-
emit layerWillBeRemoved( layer );
2215-
2216-
mMapLayers.remove( layer->id() );
2217-
layer->setParent( nullptr );
2218-
emit layerRemoved( layer->id() );
2219-
emit layersRemoved( QStringList() << layer->id() );
2220-
return layer;
2221-
}
2222-
return nullptr; //don't return layer - it wasn't owned and accordingly we aren't transferring ownership
2152+
return mLayerStore->takeMapLayer( layer );
22232153
}
22242154

22252155
void QgsProject::removeAllMapLayers()
22262156
{
2227-
emit removeAll();
2228-
// now let all observers know to clear themselves,
2229-
// and then consequently any of their map legends
2230-
removeMapLayers( mMapLayers.keys() );
2231-
mMapLayers.clear();
2157+
mLayerStore->removeAllMapLayers();
22322158
}
22332159

22342160
void QgsProject::reloadAllLayers()
22352161
{
2236-
Q_FOREACH ( QgsMapLayer *layer, mMapLayers )
2237-
{
2238-
layer->reload();
2239-
}
2240-
}
2241-
2242-
void QgsProject::onMapLayerDeleted( QObject *obj )
2243-
{
2244-
QString id = mMapLayers.key( static_cast<QgsMapLayer *>( obj ) );
2245-
2246-
if ( !id.isNull() )
2162+
QMap<QString, QgsMapLayer *> layers = mLayerStore->mapLayers();
2163+
QMap<QString, QgsMapLayer *>::const_iterator it = layers.constBegin();
2164+
for ( ; it != layers.constEnd(); ++it )
22472165
{
2248-
QgsDebugMsg( QString( "Map layer deleted without unregistering! %1" ).arg( id ) );
2249-
mMapLayers.remove( id );
2166+
it.value()->reload();
22502167
}
22512168
}
22522169

22532170
QMap<QString, QgsMapLayer *> QgsProject::mapLayers() const
22542171
{
2255-
return mMapLayers;
2172+
return mLayerStore->mapLayers();
22562173
}
2174+
2175+

0 commit comments

Comments
 (0)