Skip to content

Commit 798817e

Browse files
author
Hugo Mercier
authored
Merge pull request #3442 from mhugo/fix_dependencies
Cleanup layer dependency api
2 parents 7a8ab40 + a86611b commit 798817e

9 files changed

+91
-102
lines changed

python/core/qgsmaplayer.sip

+12-14
Original file line numberDiff line numberDiff line change
@@ -677,28 +677,21 @@ class QgsMapLayer : QObject
677677
void emitStyleChanged();
678678

679679
/**
680-
* Sets the list of layers that may modify data/geometries of this layer when modified.
680+
* Sets the list of dependencies.
681681
* @see dependencies()
682682
*
683-
* @param layersIds IDs of the layers that this layer depends on
684-
* @returns false if a dependency cycle has been detected (the change dependency set is not changed in that case)
683+
* @param layers set of QgsMapLayerDependency. Only user-defined dependencies will be added
684+
* @returns false if a dependency cycle has been detected
685+
* @note added in QGIS 3.0
685686
*/
686-
virtual bool setDataDependencies( const QSet<QString>& layersIds );
687-
688-
/**
689-
* Sets the list of layers that may modify data/geometries of this layer when modified.
690-
* @see dependencies()
691-
*
692-
* @param set of QgsMapLayerDependency. Only user-defined dependencies will be added
693-
* @returns false if a dependency cycle has been detected (the change dependency set is not changed in that case)
694-
*/
695-
bool setDataDependencies( const QSet<QgsMapLayerDependency>& layers );
687+
virtual bool setDependencies( const QSet<QgsMapLayerDependency>& layers );
696688

697689
/**
698690
* Gets the list of dependencies. This includes data dependencies set by the user (@see setDataDependencies)
699691
* as well as dependencies given by the provider
700692
*
701693
* @returns a set of QgsMapLayerDependency
694+
* @note added in QGIS 3.0
702695
*/
703696
virtual QSet<QgsMapLayerDependency> dependencies() const;
704697

@@ -756,6 +749,11 @@ class QgsMapLayer : QObject
756749
*/
757750
void configChanged();
758751

752+
/**
753+
* Emitted when dependencies are changed.
754+
*/
755+
void dependenciesChanged();
756+
759757
protected:
760758
/** Set the extent */
761759
virtual void setExtent( const QgsRectangle &rect );
@@ -794,5 +792,5 @@ class QgsMapLayer : QObject
794792
void setError( const QgsError &error );
795793

796794
//! Checks if new change dependency candidates introduce a cycle
797-
bool hasDataDependencyCycle( const QSet<QgsMapLayerDependency>& layersIds ) const;
795+
bool hasDependencyCycle( const QSet<QgsMapLayerDependency>& layersIds ) const;
798796
};

python/core/qgsvectorlayer.sip

+7-7
Original file line numberDiff line numberDiff line change
@@ -422,21 +422,21 @@ class QgsVectorLayer : QgsMapLayer
422422
const QList<QgsVectorJoinInfo> vectorJoins() const;
423423

424424
/**
425-
* Sets the list of layers that may modify data/geometries of this layer when modified.
426-
* This is meant mainly to declare database triggers between layers.
427-
* When one of these layers is modified (feature added/deleted or geometry changed),
428-
* dataChanged() will be emitted, allowing users of this layer to refresh / update it.
425+
* Sets the list of dependencies.
426+
* @see dependencies()
429427
*
430-
* @param layersIds IDs of the layers that this layer depends on
431-
* @returns false if a dependency cycle has been detected (the change dependency set is not changed in that case)
428+
* @param layers set of QgsMapLayerDependency. Only user-defined dependencies will be added
429+
* @returns false if a dependency cycle has been detected
430+
* @note added in QGIS 3.0
432431
*/
433-
bool setDataDependencies( const QSet<QString>& layersIds );
432+
virtual bool setDependencies( const QSet<QgsMapLayerDependency>& layers );
434433

435434
/**
436435
* Gets the list of dependencies. This includes data dependencies set by the user (@see setDataDependencies)
437436
* as well as dependencies given by the provider
438437
*
439438
* @returns a set of QgsMapLayerDependency
439+
* @note added in QGIS 3.0
440440
*/
441441
virtual QSet<QgsMapLayerDependency> dependencies() const;
442442

src/app/qgsvectorlayerproperties.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -580,14 +580,14 @@ void QgsVectorLayerProperties::apply()
580580
QgsExpressionContextUtils::setLayerVariables( mLayer, mVariableEditor->variablesInActiveScope() );
581581
updateVariableEditor();
582582

583-
// save layer dependencies
584-
QSet<QString> deps;
583+
// save dependencies
584+
QSet<QgsMapLayerDependency> deps;
585585
Q_FOREACH ( const QgsLayerTreeLayer* layer, mLayersDependenciesTreeGroup->findLayers() )
586586
{
587587
if ( layer->isVisible() )
588-
deps << layer->layerId();
588+
deps << QgsMapLayerDependency( layer->layerId() );
589589
}
590-
if ( ! mLayer->setDataDependencies( deps ) )
590+
if ( ! mLayer->setDependencies( deps ) )
591591
{
592592
QMessageBox::warning( nullptr, tr( "Dependency cycle" ), tr( "This configuration introduces a cycle in data dependencies and will be ignored" ) );
593593
}

src/core/qgsmaplayer.cpp

+9-18
Original file line numberDiff line numberDiff line change
@@ -1720,38 +1720,29 @@ static bool _depHasCycleDFS( const QgsMapLayer* n, QHash<const QgsMapLayer*, int
17201720
return false;
17211721
}
17221722

1723-
bool QgsMapLayer::hasDataDependencyCycle( const QSet<QgsMapLayerDependency>& layers ) const
1723+
bool QgsMapLayer::hasDependencyCycle( const QSet<QgsMapLayerDependency>& layers ) const
17241724
{
17251725
QHash<const QgsMapLayer*, int> marks;
17261726
return _depHasCycleDFS( this, marks, this, layers );
17271727
}
17281728

17291729
QSet<QgsMapLayerDependency> QgsMapLayer::dependencies() const
17301730
{
1731-
return mDataDependencies;
1731+
return mDependencies;
17321732
}
17331733

1734-
bool QgsMapLayer::setDataDependencies( const QSet<QString>& layersIds )
1734+
bool QgsMapLayer::setDependencies( const QSet<QgsMapLayerDependency>& oDeps )
17351735
{
17361736
QSet<QgsMapLayerDependency> deps;
1737-
Q_FOREACH ( QString layerId, layersIds )
1737+
Q_FOREACH ( const QgsMapLayerDependency& dep, oDeps )
17381738
{
1739-
deps << QgsMapLayerDependency( layerId );
1739+
if ( dep.origin() == QgsMapLayerDependency::FromUser )
1740+
deps << dep;
17401741
}
1741-
if ( hasDataDependencyCycle( deps ) )
1742+
if ( hasDependencyCycle( deps ) )
17421743
return false;
17431744

1744-
mDataDependencies = deps;
1745+
mDependencies = deps;
1746+
emit dependenciesChanged();
17451747
return true;
17461748
}
1747-
1748-
bool QgsMapLayer::setDataDependencies( const QSet<QgsMapLayerDependency>& layers )
1749-
{
1750-
QSet<QString> deps;
1751-
Q_FOREACH ( const QgsMapLayerDependency& dep, layers )
1752-
{
1753-
if ( dep.origin() == QgsMapLayerDependency::FromUser && dep.type() == QgsMapLayerDependency::DataDependency )
1754-
deps << dep.layerId();
1755-
}
1756-
return setDataDependencies( deps );
1757-
}

src/core/qgsmaplayer.h

+13-15
Original file line numberDiff line numberDiff line change
@@ -700,28 +700,21 @@ class CORE_EXPORT QgsMapLayer : public QObject
700700
void emitStyleChanged();
701701

702702
/**
703-
* Sets the list of layers that may modify data/geometries of this layer when modified.
704-
* @see dependencies()
705-
*
706-
* @param layersIds IDs of the layers that this layer depends on
707-
* @returns false if a dependency cycle has been detected (the change dependency set is not changed in that case)
708-
*/
709-
virtual bool setDataDependencies( const QSet<QString>& layersIds );
710-
711-
/**
712-
* Sets the list of layers that may modify data/geometries of this layer when modified.
703+
* Sets the list of dependencies.
713704
* @see dependencies()
714705
*
715706
* @param layers set of QgsMapLayerDependency. Only user-defined dependencies will be added
716-
* @returns false if a dependency cycle has been detected (the change dependency set is not changed in that case)
707+
* @returns false if a dependency cycle has been detected
708+
* @note added in QGIS 3.0
717709
*/
718-
bool setDataDependencies( const QSet<QgsMapLayerDependency>& layers );
710+
virtual bool setDependencies( const QSet<QgsMapLayerDependency>& layers );
719711

720712
/**
721713
* Gets the list of dependencies. This includes data dependencies set by the user (@see setDataDependencies)
722714
* as well as dependencies given by the provider
723715
*
724716
* @returns a set of QgsMapLayerDependency
717+
* @note added in QGIS 3.0
725718
*/
726719
virtual QSet<QgsMapLayerDependency> dependencies() const;
727720

@@ -779,6 +772,11 @@ class CORE_EXPORT QgsMapLayer : public QObject
779772
*/
780773
void configChanged();
781774

775+
/**
776+
* Emitted when dependencies are changed.
777+
*/
778+
void dependenciesChanged();
779+
782780
protected:
783781
/** Set the extent */
784782
virtual void setExtent( const QgsRectangle &rect );
@@ -864,10 +862,10 @@ class CORE_EXPORT QgsMapLayer : public QObject
864862
QgsError mError;
865863

866864
//! List of layers that may modify this layer on modification
867-
QSet<QgsMapLayerDependency> mDataDependencies;
865+
QSet<QgsMapLayerDependency> mDependencies;
868866

869-
//! Checks whether a new set of data dependencies will introduce a cycle
870-
bool hasDataDependencyCycle( const QSet<QgsMapLayerDependency>& layers ) const;
867+
//! Checks whether a new set of dependencies will introduce a cycle
868+
bool hasDependencyCycle( const QSet<QgsMapLayerDependency>& layers ) const;
871869

872870
private:
873871
/**

src/core/qgsproject.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ bool QgsProject::read()
893893
QMap<QString, QgsMapLayer*> existingMaps = QgsMapLayerRegistry::instance()->mapLayers();
894894
for ( QMap<QString, QgsMapLayer*>::iterator it = existingMaps.begin(); it != existingMaps.end(); it++ )
895895
{
896-
it.value()->setDataDependencies( it.value()->dependencies() );
896+
it.value()->setDependencies( it.value()->dependencies() );
897897
}
898898

899899
// read the project: used by map canvas and legend
@@ -1001,7 +1001,7 @@ void QgsProject::onMapLayersAdded( const QList<QgsMapLayer*>& layers )
10011001
if ( deps.contains( layer->id() ) )
10021002
{
10031003
// reconnect to change signals
1004-
it.value()->setDataDependencies( deps );
1004+
it.value()->setDependencies( deps );
10051005
}
10061006
}
10071007
}

src/core/qgsvectorlayer.cpp

+15-14
Original file line numberDiff line numberDiff line change
@@ -1458,14 +1458,14 @@ bool QgsVectorLayer::readXml( const QDomNode& layer_node )
14581458

14591459
QDomNode depsNode = layer_node.namedItem( "dataDependencies" );
14601460
QDomNodeList depsNodes = depsNode.childNodes();
1461-
QSet<QString> sources;
1461+
QSet<QgsMapLayerDependency> sources;
14621462
for ( int i = 0; i < depsNodes.count(); i++ )
14631463
{
14641464
QDomNode node = depsNodes.at( i );
14651465
QString source = depsNodes.at( i ).toElement().attribute( "id" );
1466-
sources << source;
1466+
sources << QgsMapLayerDependency( source );
14671467
}
1468-
setDataDependencies( sources );
1468+
setDependencies( sources );
14691469

14701470
setLegend( QgsMapLayerLegend::defaultVectorLegend( this ) );
14711471

@@ -4092,25 +4092,25 @@ QString QgsVectorLayer::loadNamedStyle( const QString &theURI, bool &theResultFl
40924092
QSet<QgsMapLayerDependency> QgsVectorLayer::dependencies() const
40934093
{
40944094
if ( mDataProvider )
4095-
return mDataProvider->dependencies() + mDataDependencies;
4096-
return mDataDependencies;
4095+
return mDataProvider->dependencies() + mDependencies;
4096+
return mDependencies;
40974097
}
40984098

4099-
bool QgsVectorLayer::setDataDependencies( const QSet<QString>& layersIds )
4099+
bool QgsVectorLayer::setDependencies( const QSet<QgsMapLayerDependency>& oDeps )
41004100
{
41014101
QSet<QgsMapLayerDependency> deps;
4102-
Q_FOREACH ( QString layerId, layersIds )
4102+
Q_FOREACH ( const QgsMapLayerDependency& dep, oDeps )
41034103
{
4104-
deps << QgsMapLayerDependency( layerId );
4104+
if ( dep.origin() == QgsMapLayerDependency::FromUser )
4105+
deps << dep;
41054106
}
4106-
4107-
if ( hasDataDependencyCycle( deps ) )
4107+
if ( hasDependencyCycle( deps ) )
41084108
return false;
41094109

41104110
QSet<QgsMapLayerDependency> toAdd = deps - dependencies();
41114111

41124112
// disconnect layers that are not present in the list of dependencies anymore
4113-
Q_FOREACH ( const QgsMapLayerDependency& dep, mDataDependencies )
4113+
Q_FOREACH ( const QgsMapLayerDependency& dep, mDependencies )
41144114
{
41154115
QgsVectorLayer* lyr = static_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( dep.layerId() ) );
41164116
if ( lyr == nullptr )
@@ -4123,12 +4123,13 @@ bool QgsVectorLayer::setDataDependencies( const QSet<QString>& layersIds )
41234123

41244124
// assign new dependencies
41254125
if ( mDataProvider )
4126-
mDataDependencies = mDataProvider->dependencies() + deps;
4126+
mDependencies = mDataProvider->dependencies() + deps;
41274127
else
4128-
mDataDependencies = deps;
4128+
mDependencies = deps;
4129+
emit dependenciesChanged();
41294130

41304131
// connect to new layers
4131-
Q_FOREACH ( const QgsMapLayerDependency& dep, mDataDependencies )
4132+
Q_FOREACH ( const QgsMapLayerDependency& dep, mDependencies )
41324133
{
41334134
QgsVectorLayer* lyr = static_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( dep.layerId() ) );
41344135
if ( lyr == nullptr )

src/core/qgsvectorlayer.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -515,21 +515,21 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
515515
const QList<QgsVectorJoinInfo> vectorJoins() const;
516516

517517
/**
518-
* Sets the list of layers that may modify data/geometries of this layer when modified.
519-
* This is meant mainly to declare database triggers between layers.
520-
* When one of these layers is modified (feature added/deleted or geometry changed),
521-
* dataChanged() will be emitted, allowing users of this layer to refresh / update it.
518+
* Sets the list of dependencies.
519+
* @see dependencies()
522520
*
523-
* @param layersIds IDs of the layers that this layer depends on
524-
* @returns false if a dependency cycle has been detected (the change dependency set is not changed in that case)
521+
* @param layers set of QgsMapLayerDependency. Only user-defined dependencies will be added
522+
* @returns false if a dependency cycle has been detected
523+
* @note added in QGIS 3.0
525524
*/
526-
bool setDataDependencies( const QSet<QString>& layersIds ) override;
525+
virtual bool setDependencies( const QSet<QgsMapLayerDependency>& layers ) override;
527526

528527
/**
529528
* Gets the list of dependencies. This includes data dependencies set by the user (@see setDataDependencies)
530529
* as well as dependencies given by the provider
531530
*
532531
* @returns a set of QgsMapLayerDependency
532+
* @note added in QGIS 3.0
533533
*/
534534
virtual QSet<QgsMapLayerDependency> dependencies() const override;
535535

0 commit comments

Comments
 (0)