mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-14 00:07:35 -04:00
Use QgsMapLayerStore within QgsProject
This commit is contained in:
parent
f9bd83c035
commit
26afb2e5b6
@ -77,7 +77,8 @@ class QgsMapLayerStore : QObject
|
||||
%End
|
||||
|
||||
|
||||
QList<QgsMapLayer *> addMapLayers( const QList<QgsMapLayer *> &layers /Transfer/ );
|
||||
QList<QgsMapLayer *> addMapLayers( const QList<QgsMapLayer *> &layers /Transfer/);
|
||||
|
||||
%Docstring
|
||||
\brief
|
||||
Add a list of ``layers`` to the store. Ownership of the layers is transferred
|
||||
@ -86,6 +87,9 @@ class QgsMapLayerStore : QObject
|
||||
The layersAdded() and layerWasAdded() signals will always be emitted.
|
||||
|
||||
\param layers A list of layer which should be added to the store.
|
||||
\param takeOwnership Ownership will be transferred to the layer store.
|
||||
If you specify false here you have take care of deleting
|
||||
the layers yourself. Not available in Python.
|
||||
|
||||
:return: a list of the map layers that were added
|
||||
successfully. If a layer is invalid, or already exists in the store,
|
||||
@ -95,7 +99,8 @@ class QgsMapLayerStore : QObject
|
||||
:rtype: list of QgsMapLayer
|
||||
%End
|
||||
|
||||
QgsMapLayer *addMapLayer( QgsMapLayer *layer /Transfer/ );
|
||||
QgsMapLayer *addMapLayer( QgsMapLayer *layer /Transfer/);
|
||||
|
||||
%Docstring
|
||||
\brief
|
||||
Add a ``layer`` to the store. Ownership of the layer is transferred to the
|
||||
@ -106,6 +111,9 @@ class QgsMapLayerStore : QObject
|
||||
addMapLayers() instead.
|
||||
|
||||
\param layer A layer to add to the store
|
||||
\param takeOwnership Ownership will be transferred to the layer store.
|
||||
If you specify false here you have take care of deleting
|
||||
the layers yourself. Not available in Python.
|
||||
|
||||
:return: None if unable to add layer, otherwise pointer to newly added layer
|
||||
|
||||
@ -137,6 +145,19 @@ class QgsMapLayerStore : QObject
|
||||
%End
|
||||
|
||||
void removeMapLayers( const QList<QgsMapLayer *> &layers );
|
||||
%Docstring
|
||||
\brief
|
||||
Remove a set of ``layers`` from the store.
|
||||
|
||||
The specified layers will be removed from the store.
|
||||
These layers will also be deleted.
|
||||
|
||||
\param layers A list of layers to remove. Null pointers are ignored.
|
||||
|
||||
.. seealso:: takeMapLayer()
|
||||
.. seealso:: removeMapLayer()
|
||||
.. seealso:: removeAllMapLayers()
|
||||
%End
|
||||
|
||||
void removeMapLayer( const QString &id );
|
||||
%Docstring
|
||||
|
@ -50,8 +50,7 @@ QList<QgsMapLayer *> QgsMapLayerStore::mapLayersByName( const QString &layerName
|
||||
return myResultList;
|
||||
}
|
||||
|
||||
QList<QgsMapLayer *> QgsMapLayerStore::addMapLayers(
|
||||
const QList<QgsMapLayer *> &layers )
|
||||
QList<QgsMapLayer *> QgsMapLayerStore::addMapLayers( const QList<QgsMapLayer *> &layers, bool takeOwnership )
|
||||
{
|
||||
QList<QgsMapLayer *> myResultList;
|
||||
Q_FOREACH ( QgsMapLayer *myLayer, layers )
|
||||
@ -66,7 +65,10 @@ QList<QgsMapLayer *> QgsMapLayerStore::addMapLayers(
|
||||
{
|
||||
mMapLayers[myLayer->id()] = myLayer;
|
||||
myResultList << mMapLayers[myLayer->id()];
|
||||
myLayer->setParent( this );
|
||||
if ( takeOwnership )
|
||||
{
|
||||
myLayer->setParent( this );
|
||||
}
|
||||
connect( myLayer, &QObject::destroyed, this, &QgsMapLayerStore::onMapLayerDeleted );
|
||||
emit layerWasAdded( myLayer );
|
||||
}
|
||||
@ -79,10 +81,10 @@ QList<QgsMapLayer *> QgsMapLayerStore::addMapLayers(
|
||||
}
|
||||
|
||||
QgsMapLayer *
|
||||
QgsMapLayerStore::addMapLayer( QgsMapLayer *layer )
|
||||
QgsMapLayerStore::addMapLayer( QgsMapLayer *layer, bool takeOwnership )
|
||||
{
|
||||
QList<QgsMapLayer *> addedLayers;
|
||||
addedLayers = addMapLayers( QList<QgsMapLayer *>() << layer );
|
||||
addedLayers = addMapLayers( QList<QgsMapLayer *>() << layer, takeOwnership );
|
||||
return addedLayers.isEmpty() ? nullptr : addedLayers[0];
|
||||
}
|
||||
|
||||
|
@ -124,6 +124,9 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
|
||||
* The layersAdded() and layerWasAdded() signals will always be emitted.
|
||||
*
|
||||
* \param layers A list of layer which should be added to the store.
|
||||
* \param takeOwnership Ownership will be transferred to the layer store.
|
||||
* If you specify false here you have take care of deleting
|
||||
* the layers yourself. Not available in Python.
|
||||
*
|
||||
* \returns a list of the map layers that were added
|
||||
* successfully. If a layer is invalid, or already exists in the store,
|
||||
@ -131,7 +134,8 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
|
||||
*
|
||||
* \see addMapLayer()
|
||||
*/
|
||||
QList<QgsMapLayer *> addMapLayers( const QList<QgsMapLayer *> &layers SIP_TRANSFER );
|
||||
QList<QgsMapLayer *> addMapLayers( const QList<QgsMapLayer *> &layers SIP_TRANSFER,
|
||||
bool takeOwnership SIP_PYARGREMOVE = true );
|
||||
|
||||
/**
|
||||
* \brief
|
||||
@ -143,6 +147,9 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
|
||||
* addMapLayers() instead.
|
||||
*
|
||||
* \param layer A layer to add to the store
|
||||
* \param takeOwnership Ownership will be transferred to the layer store.
|
||||
* If you specify false here you have take care of deleting
|
||||
* the layers yourself. Not available in Python.
|
||||
*
|
||||
* \returns nullptr if unable to add layer, otherwise pointer to newly added layer
|
||||
*
|
||||
@ -151,7 +158,8 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
|
||||
* \note Use addMapLayers() if adding more than one layer at a time.
|
||||
* \see addMapLayers()
|
||||
*/
|
||||
QgsMapLayer *addMapLayer( QgsMapLayer *layer SIP_TRANSFER );
|
||||
QgsMapLayer *addMapLayer( QgsMapLayer *layer SIP_TRANSFER,
|
||||
bool takeOwnership SIP_PYARGREMOVE = true );
|
||||
|
||||
/**
|
||||
* \brief
|
||||
@ -182,7 +190,6 @@ class CORE_EXPORT QgsMapLayerStore : public QObject
|
||||
* \see removeMapLayer()
|
||||
* \see removeAllMapLayers()
|
||||
*/
|
||||
//TODO QGIS 3.0 - add PyName alias to avoid list type conversion error
|
||||
void removeMapLayers( const QList<QgsMapLayer *> &layers );
|
||||
|
||||
/**
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "qgssettings.h"
|
||||
#include "qgsmaplayerlistutils.h"
|
||||
#include "qgslayoutmanager.h"
|
||||
#include "qgsmaplayerstore.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QFileInfo>
|
||||
@ -322,6 +323,7 @@ void removeKey_( const QString &scope,
|
||||
|
||||
QgsProject::QgsProject( QObject *parent )
|
||||
: QObject( parent )
|
||||
, mLayerStore( new QgsMapLayerStore( this ) )
|
||||
, mBadLayerHandler( new QgsProjectBadLayerHandler() )
|
||||
, mSnappingConfig( this )
|
||||
, mRelationManager( new QgsRelationManager( this ) )
|
||||
@ -343,6 +345,21 @@ QgsProject::QgsProject( QObject *parent )
|
||||
connect( this, &QgsProject::layersAdded, this, &QgsProject::onMapLayersAdded );
|
||||
connect( this, &QgsProject::layersRemoved, this, [ = ] { cleanTransactionGroups(); } );
|
||||
connect( this, static_cast < void ( QgsProject::* )( const QList<QgsMapLayer *> & ) >( &QgsProject::layersWillBeRemoved ), this, &QgsProject::onMapLayersRemoved );
|
||||
|
||||
// proxy map layer store signals to this
|
||||
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( const QStringList & )>( &QgsMapLayerStore::layersWillBeRemoved ),
|
||||
this, static_cast<void ( QgsProject::* )( const QStringList & )>( &QgsProject::layersWillBeRemoved ) );
|
||||
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( const QList<QgsMapLayer *> & )>( &QgsMapLayerStore::layersWillBeRemoved ),
|
||||
this, static_cast<void ( QgsProject::* )( const QList<QgsMapLayer *> & )>( &QgsProject::layersWillBeRemoved ) );
|
||||
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( const QString & )>( &QgsMapLayerStore::layerWillBeRemoved ),
|
||||
this, static_cast<void ( QgsProject::* )( const QString & )>( &QgsProject::layerWillBeRemoved ) );
|
||||
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( QgsMapLayer * )>( &QgsMapLayerStore::layerWillBeRemoved ),
|
||||
this, static_cast<void ( QgsProject::* )( QgsMapLayer * )>( &QgsProject::layerWillBeRemoved ) );
|
||||
connect( mLayerStore.get(), static_cast<void ( QgsMapLayerStore::* )( const QStringList & )>( &QgsMapLayerStore::layersRemoved ), this, &QgsProject::layersRemoved );
|
||||
connect( mLayerStore.get(), &QgsMapLayerStore::layerRemoved, this, &QgsProject::layerRemoved );
|
||||
connect( mLayerStore.get(), &QgsMapLayerStore::allLayersRemoved, this, &QgsProject::removeAll );
|
||||
connect( mLayerStore.get(), &QgsMapLayerStore::layersAdded, this, &QgsProject::layersAdded );
|
||||
connect( mLayerStore.get(), &QgsMapLayerStore::layerWasAdded, this, &QgsProject::layerWasAdded );
|
||||
}
|
||||
|
||||
|
||||
@ -884,7 +901,8 @@ bool QgsProject::read()
|
||||
|
||||
// Resolve references to other vector layers
|
||||
// Needs to be done here once all dependent layers are loaded
|
||||
for ( QMap<QString, QgsMapLayer *>::iterator it = mMapLayers.begin(); it != mMapLayers.end(); it++ )
|
||||
QMap<QString, QgsMapLayer *> layers = mLayerStore->mapLayers();
|
||||
for ( QMap<QString, QgsMapLayer *>::iterator it = layers.begin(); it != layers.end(); it++ )
|
||||
{
|
||||
if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( it.value() ) )
|
||||
vl->resolveReferences( this );
|
||||
@ -2066,31 +2084,23 @@ QMap<QPair<QString, QString>, QgsTransactionGroup *> QgsProject::transactionGrou
|
||||
|
||||
|
||||
//
|
||||
// QgsMapLayerRegistry methods
|
||||
// QgsMapLayerStore methods
|
||||
//
|
||||
|
||||
|
||||
int QgsProject::count() const
|
||||
{
|
||||
return mMapLayers.size();
|
||||
return mLayerStore->count();
|
||||
}
|
||||
|
||||
QgsMapLayer *QgsProject::mapLayer( const QString &layerId ) const
|
||||
{
|
||||
return mMapLayers.value( layerId );
|
||||
return mLayerStore->mapLayer( layerId );
|
||||
}
|
||||
|
||||
QList<QgsMapLayer *> QgsProject::mapLayersByName( const QString &layerName ) const
|
||||
{
|
||||
QList<QgsMapLayer *> myResultList;
|
||||
Q_FOREACH ( QgsMapLayer *layer, mMapLayers )
|
||||
{
|
||||
if ( layer->name() == layerName )
|
||||
{
|
||||
myResultList << layer;
|
||||
}
|
||||
}
|
||||
return myResultList;
|
||||
return mLayerStore->mapLayersByName( layerName );
|
||||
}
|
||||
|
||||
QList<QgsMapLayer *> QgsProject::addMapLayers(
|
||||
@ -2098,31 +2108,9 @@ QList<QgsMapLayer *> QgsProject::addMapLayers(
|
||||
bool addToLegend,
|
||||
bool takeOwnership )
|
||||
{
|
||||
QList<QgsMapLayer *> myResultList;
|
||||
Q_FOREACH ( QgsMapLayer *myLayer, layers )
|
||||
{
|
||||
if ( !myLayer || !myLayer->isValid() )
|
||||
{
|
||||
QgsDebugMsg( "Cannot add invalid layers" );
|
||||
continue;
|
||||
}
|
||||
//check the layer is not already registered!
|
||||
if ( !mMapLayers.contains( myLayer->id() ) )
|
||||
{
|
||||
mMapLayers[myLayer->id()] = myLayer;
|
||||
myResultList << mMapLayers[myLayer->id()];
|
||||
if ( takeOwnership )
|
||||
{
|
||||
myLayer->setParent( this );
|
||||
}
|
||||
connect( myLayer, &QObject::destroyed, this, &QgsProject::onMapLayerDeleted );
|
||||
emit layerWasAdded( myLayer );
|
||||
}
|
||||
}
|
||||
QList<QgsMapLayer *> myResultList = mLayerStore->addMapLayers( layers, takeOwnership );
|
||||
if ( !myResultList.isEmpty() )
|
||||
{
|
||||
emit layersAdded( myResultList );
|
||||
|
||||
if ( addToLegend )
|
||||
emit legendLayersAdded( myResultList );
|
||||
}
|
||||
@ -2141,116 +2129,47 @@ QgsProject::addMapLayer( QgsMapLayer *layer,
|
||||
|
||||
void QgsProject::removeMapLayers( const QStringList &layerIds )
|
||||
{
|
||||
QList<QgsMapLayer *> layers;
|
||||
Q_FOREACH ( const QString &myId, layerIds )
|
||||
{
|
||||
layers << mMapLayers.value( myId );
|
||||
}
|
||||
|
||||
removeMapLayers( layers );
|
||||
mLayerStore->removeMapLayers( layerIds );
|
||||
}
|
||||
|
||||
void QgsProject::removeMapLayers( const QList<QgsMapLayer *> &layers )
|
||||
{
|
||||
if ( layers.isEmpty() )
|
||||
return;
|
||||
|
||||
QStringList layerIds;
|
||||
QList<QgsMapLayer *> layerList;
|
||||
|
||||
Q_FOREACH ( QgsMapLayer *layer, layers )
|
||||
{
|
||||
// check layer and the registry contains it
|
||||
if ( layer && mMapLayers.contains( layer->id() ) )
|
||||
{
|
||||
layerIds << layer->id();
|
||||
layerList << layer;
|
||||
}
|
||||
}
|
||||
|
||||
if ( layerIds.isEmpty() )
|
||||
return;
|
||||
|
||||
emit layersWillBeRemoved( layerIds );
|
||||
emit layersWillBeRemoved( layerList );
|
||||
|
||||
Q_FOREACH ( QgsMapLayer *lyr, layerList )
|
||||
{
|
||||
QString myId( lyr->id() );
|
||||
emit layerWillBeRemoved( myId );
|
||||
emit layerWillBeRemoved( lyr );
|
||||
mMapLayers.remove( myId );
|
||||
if ( lyr->parent() == this )
|
||||
{
|
||||
delete lyr;
|
||||
}
|
||||
emit layerRemoved( myId );
|
||||
}
|
||||
|
||||
emit layersRemoved( layerIds );
|
||||
mLayerStore->removeMapLayers( layers );
|
||||
}
|
||||
|
||||
void QgsProject::removeMapLayer( const QString &layerId )
|
||||
{
|
||||
removeMapLayers( QList<QgsMapLayer *>() << mMapLayers.value( layerId ) );
|
||||
mLayerStore->removeMapLayer( layerId );
|
||||
}
|
||||
|
||||
void QgsProject::removeMapLayer( QgsMapLayer *layer )
|
||||
{
|
||||
if ( layer )
|
||||
removeMapLayers( QList<QgsMapLayer *>() << layer );
|
||||
mLayerStore->removeMapLayer( layer );
|
||||
}
|
||||
|
||||
QgsMapLayer *QgsProject::takeMapLayer( QgsMapLayer *layer )
|
||||
{
|
||||
if ( !layer )
|
||||
return nullptr;
|
||||
|
||||
if ( mMapLayers.contains( layer->id() ) )
|
||||
{
|
||||
emit layersWillBeRemoved( QStringList() << layer->id() );
|
||||
emit layersWillBeRemoved( QList<QgsMapLayer *>() << layer );
|
||||
emit layerWillBeRemoved( layer->id() );
|
||||
emit layerWillBeRemoved( layer );
|
||||
|
||||
mMapLayers.remove( layer->id() );
|
||||
layer->setParent( nullptr );
|
||||
emit layerRemoved( layer->id() );
|
||||
emit layersRemoved( QStringList() << layer->id() );
|
||||
return layer;
|
||||
}
|
||||
return nullptr; //don't return layer - it wasn't owned and accordingly we aren't transferring ownership
|
||||
return mLayerStore->takeMapLayer( layer );
|
||||
}
|
||||
|
||||
void QgsProject::removeAllMapLayers()
|
||||
{
|
||||
emit removeAll();
|
||||
// now let all observers know to clear themselves,
|
||||
// and then consequently any of their map legends
|
||||
removeMapLayers( mMapLayers.keys() );
|
||||
mMapLayers.clear();
|
||||
mLayerStore->removeAllMapLayers();
|
||||
}
|
||||
|
||||
void QgsProject::reloadAllLayers()
|
||||
{
|
||||
Q_FOREACH ( QgsMapLayer *layer, mMapLayers )
|
||||
QMap<QString, QgsMapLayer *> layers = mLayerStore->mapLayers();
|
||||
QMap<QString, QgsMapLayer *>::const_iterator it = layers.constBegin();
|
||||
for ( ; it != layers.constEnd(); ++it )
|
||||
{
|
||||
layer->reload();
|
||||
}
|
||||
}
|
||||
|
||||
void QgsProject::onMapLayerDeleted( QObject *obj )
|
||||
{
|
||||
QString id = mMapLayers.key( static_cast<QgsMapLayer *>( obj ) );
|
||||
|
||||
if ( !id.isNull() )
|
||||
{
|
||||
QgsDebugMsg( QString( "Map layer deleted without unregistering! %1" ).arg( id ) );
|
||||
mMapLayers.remove( id );
|
||||
it.value()->reload();
|
||||
}
|
||||
}
|
||||
|
||||
QMap<QString, QgsMapLayer *> QgsProject::mapLayers() const
|
||||
{
|
||||
return mMapLayers;
|
||||
return mLayerStore->mapLayers();
|
||||
}
|
||||
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "qgscoordinatereferencesystem.h"
|
||||
#include "qgsprojectproperty.h"
|
||||
#include "qgsmaplayer.h"
|
||||
#include "qgsmaplayerstore.h"
|
||||
|
||||
class QFileInfo;
|
||||
class QDomDocument;
|
||||
@ -567,17 +568,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
|
||||
template <typename T>
|
||||
QVector<T> layers() const
|
||||
{
|
||||
QVector<T> layers;
|
||||
QMap<QString, QgsMapLayer *>::const_iterator layerIt = mMapLayers.constBegin();
|
||||
for ( ; layerIt != mMapLayers.constEnd(); ++layerIt )
|
||||
{
|
||||
T tLayer = qobject_cast<T>( layerIt.value() );
|
||||
if ( tLayer )
|
||||
{
|
||||
layers << tLayer;
|
||||
}
|
||||
}
|
||||
return layers;
|
||||
return mLayerStore->layers<T>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -968,8 +959,6 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
|
||||
void onMapLayersRemoved( const QList<QgsMapLayer *> &layers );
|
||||
void cleanTransactionGroups( bool force = false );
|
||||
|
||||
void onMapLayerDeleted( QObject *obj );
|
||||
|
||||
private:
|
||||
|
||||
static QgsProject *sProject;
|
||||
@ -1002,7 +991,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
|
||||
//! \note not available in Python bindings
|
||||
void loadEmbeddedNodes( QgsLayerTreeGroup *group );
|
||||
|
||||
QMap<QString, QgsMapLayer *> mMapLayers;
|
||||
std::unique_ptr< QgsMapLayerStore > mLayerStore;
|
||||
|
||||
QString mErrorMessage;
|
||||
|
||||
|
@ -511,7 +511,7 @@ class TestQgsProjectMapLayers(unittest.TestCase):
|
||||
# add one layer to project
|
||||
p.addMapLayer(l1)
|
||||
self.assertEqual(p.mapLayers(), {l1.id(): l1})
|
||||
self.assertEqual(l1.parent(), p)
|
||||
self.assertEqual(l1.parent().parent(), p)
|
||||
|
||||
# try taking some layers which don't exist in project
|
||||
self.assertFalse(p.takeMapLayer(None))
|
||||
|
Loading…
x
Reference in New Issue
Block a user