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 ); }