Skip to content

Commit

Permalink
Don't reset mesh layer styling when changing data source for layer
Browse files Browse the repository at this point in the history
This breaks fixing mesh layer paths when restoring projects with
broken mesh layers -- fixing the path causes the existing style
to be lost.

Fixes #45391
  • Loading branch information
nyalldawson authored and vcloarec committed Oct 6, 2021
1 parent 16200ca commit b48d7dc
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 3 deletions.
4 changes: 4 additions & 0 deletions python/core/auto_generated/mesh/qgsmeshlayer.sip.in
Expand Up @@ -94,6 +94,8 @@ Constructor for LayerOptions with optional ``transformContext``.

QgsCoordinateTransformContext transformContext;

bool loadDefaultStyle;

bool skipCrsValidation;
};

Expand Down Expand Up @@ -161,6 +163,8 @@ QgsMeshLayer cannot be copied.

virtual bool supportsEditing() const;

virtual QString loadDefaultStyle( bool &resultFlag /Out/ ) ${SIP_FINAL};


QString providerType() const;
%Docstring
Expand Down
37 changes: 34 additions & 3 deletions src/core/mesh/qgsmeshlayer.cpp
Expand Up @@ -57,6 +57,10 @@ QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath,

const QgsDataProvider::ProviderOptions providerOptions { options.transformContext };
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags();
if ( options.loadDefaultStyle )
{
flags |= QgsDataProvider::FlagLoadDefaultStyle;
}
if ( mReadFlags & QgsMapLayer::FlagTrustLayerMetadata )
{
flags |= QgsDataProvider::FlagTrustDataSource;
Expand All @@ -65,7 +69,7 @@ QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath,
resetDatasetGroupTreeItem();
setLegend( QgsMapLayerLegend::defaultMeshLegend( this ) );

if ( isValid() )
if ( isValid() && options.loadDefaultStyle )
setDefaultRendererSettings( mDatasetGroupStore->datasetGroupIndexes() );

connect( mDatasetGroupStore.get(), &QgsMeshDatasetGroupStore::datasetGroupsAdded, this, &QgsMeshLayer::onDatasetGroupsAdded );
Expand Down Expand Up @@ -201,6 +205,20 @@ bool QgsMeshLayer::supportsEditing() const
return driverMetadata.capabilities() & QgsMeshDriverMetadata::CanWriteMeshData;
}

QString QgsMeshLayer::loadDefaultStyle( bool &resultFlag )
{
if ( mDataProvider )
{
for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i )
assignDefaultStyleToDatasetGroup( i );

emit rendererChanged();
emitStyleChanged();
}

return QgsMapLayer::loadDefaultStyle( resultFlag );
}

bool QgsMeshLayer::addDatasets( const QString &path, const QDateTime &defaultReferenceTime )
{
const bool isTemporalBefore = dataProvider()->temporalCapabilities()->hasTemporalCapabilities();
Expand Down Expand Up @@ -1694,7 +1712,12 @@ bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvid
}

mDataProvider->setTemporalUnit( mTemporalUnit );

// temporarily disconnect from datasetGroupsAdded -- we don't want to reset the style for reconnected dataset groups
disconnect( mDatasetGroupStore.get(), &QgsMeshDatasetGroupStore::datasetGroupsAdded, this, &QgsMeshLayer::onDatasetGroupsAdded );
mDatasetGroupStore->setPersistentProvider( mDataProvider, mExtraDatasetUri );
connect( mDatasetGroupStore.get(), &QgsMeshDatasetGroupStore::datasetGroupsAdded, this, &QgsMeshLayer::onDatasetGroupsAdded );

setCrs( mDataProvider->crs() );

if ( provider == QLatin1String( "mesh_memory" ) )
Expand All @@ -1703,8 +1726,16 @@ bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvid
mDataSource = mDataSource + QStringLiteral( "&uid=%1" ).arg( QUuid::createUuid().toString() );
}

for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i )
assignDefaultStyleToDatasetGroup( i );
if ( flags & QgsDataProvider::FlagLoadDefaultStyle )
{
for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i )
assignDefaultStyleToDatasetGroup( i );

emit rendererChanged();
emitStyleChanged();
}

temporalProperties()->setIsActive( mDatasetGroupStore->hasTemporalCapabilities() );

connect( mDataProvider, &QgsMeshDataProvider::dataChanged, this, &QgsMeshLayer::dataChanged );

Expand Down
10 changes: 10 additions & 0 deletions src/core/mesh/qgsmeshlayer.h
Expand Up @@ -112,8 +112,17 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
: transformContext( transformContext )
{}

/**
* Coordinate transform context
*/
QgsCoordinateTransformContext transformContext;

/**
* Set to TRUE if the default layer style should be loaded.
* \since QGIS 3.22
*/
bool loadDefaultStyle = true;

/**
* Controls whether the layer is allowed to have an invalid/unknown CRS.
*
Expand Down Expand Up @@ -182,6 +191,7 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
QString htmlMetadata() const override;
bool isEditable() const override;
bool supportsEditing() const override;
QString loadDefaultStyle( bool &resultFlag SIP_OUT ) FINAL;

//! Returns the provider type for this layer
QString providerType() const;
Expand Down
1 change: 1 addition & 0 deletions src/core/qgsmaplayerfactory.cpp
Expand Up @@ -91,6 +91,7 @@ QgsMapLayer *QgsMapLayerFactory::createLayer( const QString &uri, const QString
{
QgsMeshLayer::LayerOptions meshOptions;
meshOptions.transformContext = options.transformContext;
meshOptions.loadDefaultStyle = options.loadDefaultStyle;
return new QgsMeshLayer( uri, name, provider, meshOptions );
}

Expand Down

0 comments on commit b48d7dc

Please sign in to comment.