void TestQgsOfflineEditing::createSpatialiteAndSynchronizeBack() { offlineDbFile = "TestQgsOfflineEditing.sqlite"; QCOMPARE( mpLayer->name(), QStringLiteral( "points" ) ); QCOMPARE( mpLayer->featureCount(), numberOfFeatures ); QCOMPARE( mpLayer->fields().size(), numberOfFields ); //set on LayerTreeNode showFeatureCount property QgsLayerTreeLayer *layerTreelayer = QgsProject::instance()->layerTreeRoot()->findLayer( mpLayer->id() ); layerTreelayer->setCustomProperty( QStringLiteral( "showFeatureCount" ), 1 ); //convert mOfflineEditing->convertToOfflineProject( offlineDataPath, offlineDbFile, layerIds, false, QgsOfflineEditing::SpatiaLite ); mpLayer = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayers().first() ); QCOMPARE( mpLayer->name(), QStringLiteral( "points (offline)" ) ); QCOMPARE( mpLayer->featureCount(), numberOfFeatures ); //check LayerTreeNode showFeatureCount property layerTreelayer = QgsProject::instance()->layerTreeRoot()->findLayer( mpLayer->id() ); QCOMPARE( layerTreelayer->customProperty( QStringLiteral( "showFeatureCount" ), 0 ).toInt(), 1 ); //unset on LayerTreeNode showFeatureCount property layerTreelayer->setCustomProperty( QStringLiteral( "showFeatureCount" ), 0 ); //synchronize back mOfflineEditing->synchronize(); mpLayer = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayers().first() ); QCOMPARE( mpLayer->name(), QStringLiteral( "points" ) ); QCOMPARE( mpLayer->featureCount(), numberOfFeatures ); QCOMPARE( mpLayer->fields().size(), numberOfFields ); //check LayerTreeNode showFeatureCount property layerTreelayer = QgsProject::instance()->layerTreeRoot()->findLayer( mpLayer->id() ); QCOMPARE( layerTreelayer->customProperty( QStringLiteral( "showFeatureCount" ), 0 ).toInt(), 0 ); }
void QgsLayerTreeRegistryBridge::layersAdded( QList<QgsMapLayer*> layers ) { if ( !mEnabled ) return; foreach ( QgsMapLayer* layer, layers ) { // add new layer to the top QgsLayerTreeLayer* nodeLayer = mInsertionPointGroup->insertLayer( mInsertionPointIndex, layer ); // check whether the layer is marked as embedded QString projectFile = QgsProject::instance()->layerIsEmbedded( nodeLayer->layerId() ); if ( !projectFile.isEmpty() ) { nodeLayer->setCustomProperty( "embedded", 1 ); nodeLayer->setCustomProperty( "embedded_project", projectFile ); } }
void QgsLayerTreeRegistryBridge::layersAdded( const QList<QgsMapLayer*>& layers ) { if ( !mEnabled ) return; QList<QgsLayerTreeNode*> nodes; Q_FOREACH ( QgsMapLayer* layer, layers ) { QgsLayerTreeLayer* nodeLayer = new QgsLayerTreeLayer( layer ); nodeLayer->setVisible( mNewLayersVisible ? Qt::Checked : Qt::Unchecked ); nodes << nodeLayer; // check whether the layer is marked as embedded QString projectFile = QgsProject::instance()->layerIsEmbedded( nodeLayer->layerId() ); if ( !projectFile.isEmpty() ) { nodeLayer->setCustomProperty( "embedded", 1 ); nodeLayer->setCustomProperty( "embedded_project", projectFile ); } }
void QgsLayerTreeRegistryBridge::layersAdded( QList<QgsMapLayer*> layers ) { if ( !mEnabled ) return; int i = 0; foreach ( QgsMapLayer* layer, layers ) { QgsLayerTreeLayer* nodeLayer = new QgsLayerTreeLayer( layer ); nodeLayer->setVisible( mNewLayersVisible ? Qt::Checked : Qt::Unchecked ); // add new layer to the top mInsertionPointGroup->insertChildNode( mInsertionPointIndex + i++, nodeLayer ); // check whether the layer is marked as embedded QString projectFile = QgsProject::instance()->layerIsEmbedded( nodeLayer->layerId() ); if ( !projectFile.isEmpty() ) { nodeLayer->setCustomProperty( "embedded", 1 ); nodeLayer->setCustomProperty( "embedded_project", projectFile ); } }
static void _readOldLegendGroup( QDomElement& elem, QgsLayerTreeGroup* parentGroup, QgsProject* project ) { QDomElement itemElem = elem.firstChildElement(); while ( !itemElem.isNull() ) { if ( itemElem.tagName() == QLatin1String( "LayerItem" ) ) { QString layerId = itemElem.attribute( QStringLiteral( "layerId" ) ); if ( QgsMapLayer* layer = project->mapLayer( layerId ) ) { QgsLayerTreeLayer* nodeLayer = parentGroup->addLayer( layer ); QString userText = itemElem.attribute( QStringLiteral( "userText" ) ); if ( !userText.isEmpty() ) nodeLayer->setCustomProperty( QStringLiteral( "legend/title-label" ), userText ); QString style = itemElem.attribute( QStringLiteral( "style" ) ); if ( !style.isEmpty() ) nodeLayer->setCustomProperty( QStringLiteral( "legend/title-style" ), style ); QString showFeatureCount = itemElem.attribute( QStringLiteral( "showFeatureCount" ) ); if ( showFeatureCount.toInt() ) nodeLayer->setCustomProperty( QStringLiteral( "showFeatureCount" ), 1 ); // support for individual legend items (user text, order) not implemented yet } } else if ( itemElem.tagName() == QLatin1String( "GroupItem" ) ) { QgsLayerTreeGroup* nodeGroup = parentGroup->addGroup( itemElem.attribute( QStringLiteral( "userText" ) ) ); QString style = itemElem.attribute( QStringLiteral( "style" ) ); if ( !style.isEmpty() ) nodeGroup->setCustomProperty( QStringLiteral( "legend/title-style" ), style ); _readOldLegendGroup( itemElem, nodeGroup, project ); } itemElem = itemElem.nextSiblingElement(); } }
static void _readOldLegendLayer( const QDomElement &layerElem, QgsLayerTreeGroup *parent ) { QDomElement layerFileElem = layerElem.firstChildElement( QStringLiteral( "filegroup" ) ).firstChildElement( QStringLiteral( "legendlayerfile" ) ); QString layerId = layerFileElem.attribute( QStringLiteral( "layerid" ) ); QgsLayerTreeLayer *layerNode = new QgsLayerTreeLayer( layerId, layerElem.attribute( QStringLiteral( "name" ) ) ); layerNode->setItemVisibilityChecked( QgsLayerTreeUtils::checkStateFromXml( layerElem.attribute( QStringLiteral( "checked" ) ) ) != Qt::Unchecked ); layerNode->setExpanded( layerElem.attribute( QStringLiteral( "open" ) ) == QLatin1String( "true" ) ); if ( layerFileElem.attribute( QStringLiteral( "isInOverview" ) ) == QLatin1String( "1" ) ) layerNode->setCustomProperty( QStringLiteral( "overview" ), 1 ); if ( layerElem.attribute( QStringLiteral( "embedded" ) ) == QLatin1String( "1" ) ) layerNode->setCustomProperty( QStringLiteral( "embedded" ), 1 ); if ( layerElem.attribute( QStringLiteral( "showFeatureCount" ) ) == QLatin1String( "1" ) ) layerNode->setCustomProperty( QStringLiteral( "showFeatureCount" ), 1 ); // drawing order is handled by readOldLegendLayerOrder() parent->addChildNode( layerNode ); }
void TestQgsOfflineEditing::createGeopackageAndSynchronizeBack() { offlineDbFile = "TestQgsOfflineEditing.gpkg"; QCOMPARE( mpLayer->name(), QStringLiteral( "points" ) ); QCOMPARE( mpLayer->featureCount(), numberOfFeatures ); QCOMPARE( mpLayer->fields().size(), numberOfFields ); QgsFeature firstFeatureBeforeAction; QgsFeatureIterator it = mpLayer->getFeatures(); it.nextFeature( firstFeatureBeforeAction ); connect( mOfflineEditing, &QgsOfflineEditing::warning, this, []( const QString & title, const QString & message ) { qDebug() << title << message; } ); //set on LayerTreeNode showFeatureCount property QgsLayerTreeLayer *layerTreelayer = QgsProject::instance()->layerTreeRoot()->findLayer( mpLayer->id() ); layerTreelayer->setCustomProperty( QStringLiteral( "showFeatureCount" ), 1 ); layerTreelayer->setItemVisibilityChecked( false ); //convert mOfflineEditing->convertToOfflineProject( offlineDataPath, offlineDbFile, layerIds, false, QgsOfflineEditing::GPKG ); mpLayer = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayers().first() ); QCOMPARE( mpLayer->name(), QStringLiteral( "points (offline)" ) ); QCOMPARE( mpLayer->featureCount(), numberOfFeatures ); //comparing with the number +1 because GPKG created an fid QCOMPARE( mpLayer->fields().size(), numberOfFields + 1 ); //check LayerTreeNode showFeatureCount property layerTreelayer = QgsProject::instance()->layerTreeRoot()->findLayer( mpLayer->id() ); QCOMPARE( layerTreelayer->customProperty( QStringLiteral( "showFeatureCount" ), 0 ).toInt(), 1 ); QCOMPARE( layerTreelayer->isVisible(), false ); QgsFeature firstFeatureInAction; it = mpLayer->getFeatures(); it.nextFeature( firstFeatureInAction ); //compare some values QCOMPARE( firstFeatureInAction.attribute( QStringLiteral( "Class" ) ).toString(), firstFeatureBeforeAction.attribute( QStringLiteral( "Class" ) ).toString() ); QCOMPARE( firstFeatureInAction.attribute( QStringLiteral( "Heading" ) ).toString(), firstFeatureBeforeAction.attribute( QStringLiteral( "Heading" ) ).toString() ); QCOMPARE( firstFeatureInAction.attribute( QStringLiteral( "Cabin Crew" ) ).toString(), firstFeatureBeforeAction.attribute( QStringLiteral( "Cabin Crew" ) ).toString() ); QgsFeature newFeature( mpLayer->dataProvider()->fields() ); newFeature.setAttribute( QStringLiteral( "Class" ), QStringLiteral( "Superjet" ) ); mpLayer->startEditing(); mpLayer->addFeature( newFeature ); mpLayer->commitChanges(); QCOMPARE( mpLayer->featureCount(), numberOfFeatures + 1 ); //unset on LayerTreeNode showFeatureCount property layerTreelayer->setCustomProperty( QStringLiteral( "showFeatureCount" ), 0 ); //synchronize back mOfflineEditing->synchronize(); mpLayer = qobject_cast<QgsVectorLayer *>( QgsProject::instance()->mapLayers().first() ); QCOMPARE( mpLayer->name(), QStringLiteral( "points" ) ); QCOMPARE( mpLayer->dataProvider()->featureCount(), numberOfFeatures + 1 ); QCOMPARE( mpLayer->fields().size(), numberOfFields ); //check LayerTreeNode showFeatureCount property layerTreelayer = QgsProject::instance()->layerTreeRoot()->findLayer( mpLayer->id() ); QCOMPARE( layerTreelayer->customProperty( QStringLiteral( "showFeatureCount" ), 0 ).toInt(), 0 ); //get last feature QgsFeature f = mpLayer->getFeature( mpLayer->dataProvider()->featureCount() - 1 ); qDebug() << "FID:" << f.id() << "Class:" << f.attribute( "Class" ).toString(); QCOMPARE( f.attribute( QStringLiteral( "Class" ) ).toString(), QStringLiteral( "Superjet" ) ); QgsFeature firstFeatureAfterAction; it = mpLayer->getFeatures(); it.nextFeature( firstFeatureAfterAction ); QCOMPARE( firstFeatureAfterAction, firstFeatureBeforeAction ); //and delete the feature again QgsFeatureIds idsToClean; idsToClean << f.id(); mpLayer->dataProvider()->deleteFeatures( idsToClean ); QCOMPARE( mpLayer->dataProvider()->featureCount(), numberOfFeatures ); }
void QgsLayerTreeUtils::setLegendFilterByExpression( QgsLayerTreeLayer &layer, const QString &expr, bool enabled ) { layer.setCustomProperty( QStringLiteral( "legend/expressionFilter" ), expr ); layer.setCustomProperty( QStringLiteral( "legend/expressionFilterEnabled" ), enabled ); }