diff --git a/app/activeproject.cpp b/app/activeproject.cpp index daab04823..b6be61ba2 100644 --- a/app/activeproject.cpp +++ b/app/activeproject.cpp @@ -552,3 +552,18 @@ bool ActiveProject::positionTrackingSupported() const return mQgsProject->readBoolEntry( QStringLiteral( "Mergin" ), QStringLiteral( "PositionTracking/Enabled" ), false ); } + +bool ActiveProject::projectHasRecordingLayers() const +{ + if ( !mQgsProject ) + return false; + + const QMap layers = mQgsProject->mapLayers(); + for ( auto it = layers.constBegin(); it != layers.constEnd(); ++it ) + { + if ( InputUtils::recordingAllowed( it.value(), mQgsProject ) ) + return true; + } + + return false; +} diff --git a/app/activeproject.h b/app/activeproject.h index aa4db5487..c610d78f6 100644 --- a/app/activeproject.h +++ b/app/activeproject.h @@ -117,6 +117,9 @@ class ActiveProject: public QObject bool positionTrackingSupported() const; + //! Returns project has at least one layer that allows recording + Q_INVOKABLE bool projectHasRecordingLayers() const; + signals: void qgsProjectChanged(); void localProjectChanged( LocalProject project ); diff --git a/app/inpututils.cpp b/app/inpututils.cpp index 218c024e1..bfe8e8a93 100644 --- a/app/inpututils.cpp +++ b/app/inpututils.cpp @@ -2222,3 +2222,44 @@ double InputUtils::pixelDistanceBetween( const QPointF &p1, const QPointF &p2 ) { return std::hypot( p1.x() - p2.x(), p1.y() - p2.y() ); } + +bool InputUtils::layerHasGeometry( const QgsVectorLayer *layer ) +{ + if ( !layer || !layer->isValid() ) + return false; + return layer->wkbType() != Qgis::WkbType::NoGeometry && layer->wkbType() != Qgis::WkbType::Unknown; +} + +bool InputUtils::layerVisible( QgsMapLayer *layer ) +{ + QgsLayerTree *root = QgsProject::instance()->layerTreeRoot(); + QgsLayerTreeLayer *layerTree = root->findLayer( layer ); + + if ( layerTree ) + return layerTree->isVisible(); + + return false; +} + +bool InputUtils::isPositionTrackingLayer( QgsMapLayer *layer, QgsProject *project ) +{ + if ( !layer || !project ) + return false; + + QString trackingLayerId = project->readEntry( QStringLiteral( "Mergin" ), QStringLiteral( "PositionTracking/TrackingLayer" ), QString() ); + return layer->id() == trackingLayerId; +} + +bool InputUtils::recordingAllowed( QgsMapLayer *layer, QgsProject *project ) +{ + if ( !layer || !layer->isValid() || !project ) + return false; + + QgsVectorLayer *vectorLayer = qobject_cast( layer ); + + return ( vectorLayer && + !vectorLayer->readOnly() && + layerHasGeometry( vectorLayer ) && + layerVisible( layer ) && + !isPositionTrackingLayer( layer, project ) ); +} diff --git a/app/inpututils.h b/app/inpututils.h index 83be81f39..609c6979c 100644 --- a/app/inpututils.h +++ b/app/inpututils.h @@ -589,6 +589,23 @@ class InputUtils: public QObject */ static double pixelDistanceBetween( const QPointF &p1, const QPointF &p2 ); + /** + * filters if input layer is visible in current map theme + */ + static bool layerVisible( QgsMapLayer *layer ); + + /** + * Returns if layer is not NoGeo and not Unknown + */ + static bool layerHasGeometry( const QgsVectorLayer *layer ); + + /** + * Returns true if the layer is the position tracking layer + */ + Q_INVOKABLE static bool isPositionTrackingLayer( QgsMapLayer *layer, QgsProject *project ); + + static bool recordingAllowed( QgsMapLayer *layer, QgsProject *project ); + public slots: void onQgsLogMessageReceived( const QString &message, const QString &tag, Qgis::MessageLevel level ); diff --git a/app/layersproxymodel.cpp b/app/layersproxymodel.cpp index 9ffa4ad8f..a68f437f1 100644 --- a/app/layersproxymodel.cpp +++ b/app/layersproxymodel.cpp @@ -33,33 +33,6 @@ bool LayersProxyModel::filterAcceptsRow( int source_row, const QModelIndex &sour return filterFunction( layer ); } -bool layerHasGeometry( const QgsVectorLayer *layer ) -{ - if ( !layer || !layer->isValid() ) - return false; - return layer->wkbType() != Qgis::WkbType::NoGeometry && layer->wkbType() != Qgis::WkbType::Unknown; -} - -bool LayersProxyModel::recordingAllowed( QgsMapLayer *layer ) const -{ - if ( !layer || !layer->isValid() ) - return false; - - QgsVectorLayer *vectorLayer = qobject_cast( layer ); - return ( vectorLayer && !vectorLayer->readOnly() && layerHasGeometry( vectorLayer ) && layerVisible( layer ) && !isPositionTrackingLayer( layer ) ); -} - -bool LayersProxyModel::layerVisible( QgsMapLayer *layer ) const -{ - QgsLayerTree *root = QgsProject::instance()->layerTreeRoot(); - QgsLayerTreeLayer *layerTree = root->findLayer( layer ); - - if ( layerTree ) - return layerTree->isVisible(); - - return false; -} - QList LayersProxyModel::layers() const { QList filteredLayers; @@ -142,15 +115,6 @@ QVariant LayersProxyModel::getData( QModelIndex index, int role ) const return sourceModel()->data( index, role ); } -bool LayersProxyModel::isPositionTrackingLayer( QgsMapLayer *layer ) const -{ - if ( !layer || !mProject ) - return false; - - QString trackingLayerId = mProject->readEntry( QStringLiteral( "Mergin" ), QStringLiteral( "PositionTracking/TrackingLayer" ), QString() ); - return layer->id() == trackingLayerId; -} - QgsProject *LayersProxyModel::qgsProject() const { return mProject; @@ -204,7 +168,7 @@ void LayersProxyModel::applyFilterFunction() case ActiveLayerSelection: filterFunction = [this]( QgsMapLayer * layer ) { - return recordingAllowed( layer ); + return InputUtils::recordingAllowed( layer, mProject ); }; break; default: diff --git a/app/layersproxymodel.h b/app/layersproxymodel.h index cde937d8c..70b8731ac 100644 --- a/app/layersproxymodel.h +++ b/app/layersproxymodel.h @@ -54,9 +54,6 @@ class LayersProxyModel : public QgsMapLayerProxyModel //! Returns first layer from proxy model's layers list (filtered with filter function) Q_INVOKABLE QgsMapLayer *firstUsableLayer() const; - //! Returns true if the layer is the position tracking layer - Q_INVOKABLE bool isPositionTrackingLayer( QgsMapLayer *layer ) const; - /** * @brief layers method return layers from source model filtered with filter function */ @@ -86,13 +83,6 @@ class LayersProxyModel : public QgsMapLayerProxyModel void refreshData(); private: - - //! returns if input layer is capable of recording new features - bool recordingAllowed( QgsMapLayer *layer ) const; - - //! filters if input layer is visible in current map theme - bool layerVisible( QgsMapLayer *layer ) const; - LayerModelTypes mModelType; LayersModel *mModel; diff --git a/app/qml/main.qml b/app/qml/main.qml index 4b0fe7875..4007751df 100644 --- a/app/qml/main.qml +++ b/app/qml/main.qml @@ -255,14 +255,6 @@ ApplicationWindow { accuracy: LocationPermission.Precise } - MM.LayersProxyModel { - id: recordingLayersModel - - modelType: MM.LayersProxyModel.AllLayers - qgsProject: __activeProject.qgsProject - model: MM.LayersModel {} - } - MMToolbar { id: mapToolbar @@ -287,7 +279,7 @@ ApplicationWindow { text: qsTr("Add") iconSource: __style.addIcon onClicked: { - if ( recordingLayersModel.rowCount() > 0 ) { + if ( __activeProject.projectHasRecordingLayers() ) { stateManager.state = "map" map.record() }