diff --git a/src/core/mesh/qgsmeshdatasetgroupstore.cpp b/src/core/mesh/qgsmeshdatasetgroupstore.cpp index 810ab6286b8b..4112f2b31b88 100644 --- a/src/core/mesh/qgsmeshdatasetgroupstore.cpp +++ b/src/core/mesh/qgsmeshdatasetgroupstore.cpp @@ -343,6 +343,16 @@ void QgsMeshDatasetGroupStore::readXml( const QDomElement &storeElem, const QgsR setDatasetGroupTreeItem( new QgsMeshDatasetGroupTreeItem( rootTreeItemElem, context ) ); } +int QgsMeshDatasetGroupStore::globalDatasetGroupIndexInSource( QgsMeshDatasetSourceInterface *source, int nativeGroupIndex ) const +{ + for ( QMap::const_iterator it = mRegistery.cbegin(); it != mRegistery.cend(); ++it ) + { + if ( it.value().first == source && it.value().second == nativeGroupIndex ) + return it.key(); + } + + return -1; +} bool QgsMeshDatasetGroupStore::saveDatasetGroup( QString filePath, int groupIndex, QString driver ) { diff --git a/src/core/mesh/qgsmeshdatasetgroupstore.h b/src/core/mesh/qgsmeshdatasetgroupstore.h index 4861f53a89d0..0335765260d7 100644 --- a/src/core/mesh/qgsmeshdatasetgroupstore.h +++ b/src/core/mesh/qgsmeshdatasetgroupstore.h @@ -210,6 +210,14 @@ class QgsMeshDatasetGroupStore: public QObject //! Reads the store's information from a DOM document void readXml( const QDomElement &storeElem, const QgsReadWriteContext &context ); + /** + * Returns the global dataset group index of the dataset group with native index \a globalGroupIndex in the \a source + * Returns -1 if the group or the source is not registered + * + * Since QGIS 3.22 + */ + int globalDatasetGroupIndexInSource( QgsMeshDatasetSourceInterface *source, int nativeGroupIndex ) const; + signals: //! Emitted after dataset groups are added void datasetGroupsAdded( QList indexes ); diff --git a/src/core/mesh/qgsmeshlayer.cpp b/src/core/mesh/qgsmeshlayer.cpp index 57ce111321a7..33dcea473242 100644 --- a/src/core/mesh/qgsmeshlayer.cpp +++ b/src/core/mesh/qgsmeshlayer.cpp @@ -49,8 +49,7 @@ QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath, const QString &providerKey, const QgsMeshLayer::LayerOptions &options ) : QgsMapLayer( QgsMapLayerType::MeshLayer, baseName, meshLayerPath ), - mDatasetGroupStore( new QgsMeshDatasetGroupStore( this ) ), - mTemporalProperties( new QgsMeshLayerTemporalProperties( this ) ) + mDatasetGroupStore( new QgsMeshDatasetGroupStore( this ) ) { mShouldValidateCrs = !options.skipCrsValidation; @@ -207,11 +206,13 @@ bool QgsMeshLayer::supportsEditing() const QString QgsMeshLayer::loadDefaultStyle( bool &resultFlag ) { - if ( mDataProvider ) - { - for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i ) - assignDefaultStyleToDatasetGroup( i ); + const QList groupsList = datasetGroupsIndexes(); + + for ( const int index : groupsList ) + assignDefaultStyleToDatasetGroup( index ); + if ( !groupsList.isEmpty() ) + { emit rendererChanged(); emitStyleChanged(); } @@ -1156,17 +1157,9 @@ void QgsMeshLayer::setDataSourcePrivate( const QString &dataSource, const QStrin mLayerName = baseName; setProviderType( provider ); - // if we’re given a provider type, try to create and bind one to this layer - bool ok = false; if ( !mDataSource.isEmpty() && !provider.isEmpty() ) - { - ok = setDataProvider( provider, options, flags ); - } + setDataProvider( provider, options, flags ); - if ( ok ) - { - mTemporalProperties->setDefaultsFromDataProviderTemporalCapabilities( mDataProvider->temporalCapabilities() ); - } } QgsPointXY QgsMeshLayer::snapOnElement( QgsMesh::ElementType elementType, const QgsPointXY &point, double searchRadius ) @@ -1504,6 +1497,8 @@ bool QgsMeshLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &con else mDatasetGroupStore->readXml( elemDatasetGroupsStore, context ); + mTemporalProperties = new QgsMeshLayerTemporalProperties( this ); + setDataProvider( mProviderKey, providerOptions, flags ); QString errorMsg; @@ -1711,12 +1706,15 @@ bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvid return false; } + if ( !mTemporalProperties ) + { + mTemporalProperties = new QgsMeshLayerTemporalProperties( this ); + mTemporalProperties->setDefaultsFromDataProviderTemporalCapabilities( dataProvider()->temporalCapabilities() ); + } + 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() ); @@ -1726,16 +1724,17 @@ bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvid mDataSource = mDataSource + QStringLiteral( "&uid=%1" ).arg( QUuid::createUuid().toString() ); } - if ( flags & QgsDataProvider::FlagLoadDefaultStyle ) + // set default style if required by flags or if the dataset group does not has a style yet + for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i ) { - for ( int i = 0; i < mDataProvider->datasetGroupCount(); ++i ) - assignDefaultStyleToDatasetGroup( i ); - - emit rendererChanged(); - emitStyleChanged(); + int globalIndex = mDatasetGroupStore->globalDatasetGroupIndexInSource( mDataProvider, i ); + if ( globalIndex != -1 && + ( !mRendererSettings.hasSettings( globalIndex ) || ( flags & QgsDataProvider::FlagLoadDefaultStyle ) ) ) + assignDefaultStyleToDatasetGroup( globalIndex ); } - temporalProperties()->setIsActive( mDatasetGroupStore->hasTemporalCapabilities() ); + emit rendererChanged(); + emitStyleChanged(); connect( mDataProvider, &QgsMeshDataProvider::dataChanged, this, &QgsMeshLayer::dataChanged ); diff --git a/src/core/mesh/qgsmeshrenderersettings.cpp b/src/core/mesh/qgsmeshrenderersettings.cpp index 0e56afcfbd82..baf46f799d42 100644 --- a/src/core/mesh/qgsmeshrenderersettings.cpp +++ b/src/core/mesh/qgsmeshrenderersettings.cpp @@ -740,3 +740,7 @@ void QgsMeshRendererVectorTracesSettings::setParticlesCount( int value ) mParticlesCount = value; } +bool QgsMeshRendererSettings::hasSettings( int datasetGroupIndex ) const +{ + return mRendererScalarSettings.contains( datasetGroupIndex ) || mRendererVectorSettings.contains( datasetGroupIndex ); +} diff --git a/src/core/mesh/qgsmeshrenderersettings.h b/src/core/mesh/qgsmeshrenderersettings.h index a90577fbdeb5..cc27c82e9a14 100644 --- a/src/core/mesh/qgsmeshrenderersettings.h +++ b/src/core/mesh/qgsmeshrenderersettings.h @@ -673,6 +673,13 @@ class CORE_EXPORT QgsMeshRendererSettings */ void setActiveVectorDatasetGroup( int activeVectorDatasetGroup ); + /** + * Returns whether the group with \a index has render settings (scalar or vector) + * + * \since QGIS 3.22 + */ + bool hasSettings( int datasetGroupIndex ) const; + private: QgsMeshRendererMeshSettings mRendererNativeMeshSettings; QgsMeshRendererMeshSettings mRendererTriangularMeshSettings;