diff --git a/src/core/layertreemodel.cpp b/src/core/layertreemodel.cpp index e86e76e6df..320817e65a 100644 --- a/src/core/layertreemodel.cpp +++ b/src/core/layertreemodel.cpp @@ -36,6 +36,7 @@ FlatLayerTreeModel::FlatLayerTreeModel( QgsLayerTree *layerTree, QgsProject *pro setSourceModel( mSourceModel ); connect( mSourceModel, &FlatLayerTreeModelBase::mapThemeChanged, this, &FlatLayerTreeModel::mapThemeChanged ); connect( mSourceModel, &FlatLayerTreeModelBase::isTemporalChanged, this, &FlatLayerTreeModel::isTemporalChanged ); + connect( mSourceModel, &FlatLayerTreeModelBase::isFrozenChanged, this, &FlatLayerTreeModel::isFrozenChanged ); } QVariant FlatLayerTreeModel::data( const QModelIndex &index, int role ) const @@ -68,6 +69,11 @@ void FlatLayerTreeModel::updateCurrentMapTheme() mSourceModel->updateCurrentMapTheme(); } +bool FlatLayerTreeModel::isFrozen() const +{ + return mSourceModel->isFrozen(); +} + void FlatLayerTreeModel::freeze() { mSourceModel->freeze(); @@ -124,14 +130,22 @@ FlatLayerTreeModelBase::FlatLayerTreeModelBase( QgsLayerTree *layerTree, QgsProj connect( mLayerTreeModel, &QAbstractItemModel::rowsInserted, this, &FlatLayerTreeModelBase::insertInMap ); } +bool FlatLayerTreeModelBase::isFrozen() const +{ + return mFrozen > 0; +} + void FlatLayerTreeModelBase::freeze() { mFrozen++; + emit isFrozenChanged(); } void FlatLayerTreeModelBase::unfreeze( bool resetModel ) { mFrozen = 0; + emit isFrozenChanged(); + if ( resetModel ) buildMap( mLayerTreeModel ); } diff --git a/src/core/layertreemodel.h b/src/core/layertreemodel.h index 468d71cff4..93809bd657 100644 --- a/src/core/layertreemodel.h +++ b/src/core/layertreemodel.h @@ -67,6 +67,8 @@ class FlatLayerTreeModelBase : public QAbstractProxyModel //! This should be triggered after a project has been loaded Q_INVOKABLE void updateCurrentMapTheme(); + //! Returns TRUE if the model is frozen + bool isFrozen() const; //! Freezes the model as is, with any source model signals ignored Q_INVOKABLE void freeze(); //! Unfreezes the model and resume listening to source model signals @@ -84,6 +86,7 @@ class FlatLayerTreeModelBase : public QAbstractProxyModel signals: void mapThemeChanged(); void isTemporalChanged(); + void isFrozenChanged(); private: void featureCountChanged(); @@ -111,6 +114,7 @@ class FlatLayerTreeModel : public QSortFilterProxyModel Q_PROPERTY( QString mapTheme READ mapTheme WRITE setMapTheme NOTIFY mapThemeChanged ) Q_PROPERTY( bool isTemporal READ isTemporal NOTIFY isTemporalChanged ) + Q_PROPERTY( bool isFrozen READ isFrozen NOTIFY isFrozenChanged ) public: enum Roles @@ -157,6 +161,8 @@ class FlatLayerTreeModel : public QSortFilterProxyModel //! This should be triggered after a project has been loaded Q_INVOKABLE void updateCurrentMapTheme(); + //! Returns TRUE if the model is frozen + bool isFrozen() const; //! Freezes the model as is, with any source model signals ignored Q_INVOKABLE void freeze(); //! Unfreezes the model and resume listening to source model signals @@ -177,6 +183,7 @@ class FlatLayerTreeModel : public QSortFilterProxyModel signals: void mapThemeChanged(); void isTemporalChanged(); + void isFrozenChanged(); protected: virtual bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const override; diff --git a/src/core/projectinfo.cpp b/src/core/projectinfo.cpp index 9e392c09c9..758bb41dba 100644 --- a/src/core/projectinfo.cpp +++ b/src/core/projectinfo.cpp @@ -780,3 +780,23 @@ QVariantMap ProjectInfo::getImageDecorationConfiguration() return configuration; } + +QgsMapLayer *ProjectInfo::getDefaultActiveLayerForMapTheme( const QString &mapTheme ) +{ + if ( mapTheme.isEmpty() ) + { + return nullptr; + } + + const QString json = QgsProject::instance()->readEntry( QStringLiteral( "qfieldsync" ), QStringLiteral( "/mapThemesActiveLayers" ) ); + const QJsonDocument document = QJsonDocument::fromJson( json.toUtf8() ); + + QJsonObject entries = document.object(); + if ( entries.contains( mapTheme ) ) + { + const QString mapLayerId = entries.value( mapTheme ).toString(); + return QgsProject::instance()->mapLayer( mapLayerId ); + } + + return nullptr; +} diff --git a/src/core/projectinfo.h b/src/core/projectinfo.h index cc959b6c75..39454d7585 100644 --- a/src/core/projectinfo.h +++ b/src/core/projectinfo.h @@ -187,6 +187,9 @@ class ProjectInfo : public QObject //! Retrieves configuration of the image decoration Q_INVOKABLE QVariantMap getImageDecorationConfiguration(); + //! Retrieves the default active layer for a given map theme + Q_INVOKABLE QgsMapLayer *getDefaultActiveLayerForMapTheme( const QString &mapTheme ); + signals: void filePathChanged(); diff --git a/src/qml/Legend.qml b/src/qml/Legend.qml index 8a631831a2..6629b9cee6 100644 --- a/src/qml/Legend.qml +++ b/src/qml/Legend.qml @@ -151,8 +151,8 @@ ListView { enabled: (allowActiveLayerChange || (projectInfo.activeLayer != VectorLayerPointer)) onClicked: { layerTree.setData(legend.model.index(index, 0), !Visible, FlatLayerTreeModel.Visible); - flatLayerTree.mapTheme = ''; projectInfo.saveLayerTreeState(); + flatLayerTree.mapTheme = ''; } } } diff --git a/src/qml/qgismobileapp.qml b/src/qml/qgismobileapp.qml index 196c93a2a6..7a608a09ad 100644 --- a/src/qml/qgismobileapp.qml +++ b/src/qml/qgismobileapp.qml @@ -3303,7 +3303,14 @@ ApplicationWindow { projectInfo.filePath = path; stateMachine.state = projectInfo.stateMode; platformUtilities.setHandleVolumeKeys(qfieldSettings.digitizingVolumeKeys && stateMachine.state != 'browse'); - dashBoard.activeLayer = projectInfo.activeLayer; + let activeLayer = projectInfo.activeLayer; + if (flatLayerTree.mapTheme != '') { + const defaultActiveLayer = projectInfo.getDefaultActiveLayerForMapTheme(flatLayerTree.mapTheme); + if (defaultActiveLayer !== null) { + activeLayer = defaultActiveLayer; + } + } + dashBoard.activeLayer = activeLayer; drawingTemplateModel.projectFilePath = path; mapCanvasBackground.color = mapCanvas.mapSettings.backgroundColor; var titleDecorationConfiguration = projectInfo.getTitleDecorationConfiguration(); @@ -3382,6 +3389,19 @@ ApplicationWindow { } } + Connections { + target: flatLayerTree + + function onMapThemeChanged() { + if (!flatLayerTree.isFrozen && flatLayerTree.mapTheme != '') { + const defaultActiveLayer = projectInfo.getDefaultActiveLayerForMapTheme(flatLayerTree.mapTheme); + if (defaultActiveLayer !== null) { + dashBoard.activeLayer = defaultActiveLayer; + } + } + } + } + ProjectInfo { id: projectInfo