QVariant CustomLayerOrderModel::data( const QModelIndex& index, int role ) const { QString id = mOrder.at( index.row() ); if ( role == Qt::DisplayRole ) { QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer( id ); if ( layer ) return layer->name(); } if ( role == Qt::UserRole + 1 ) { QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer( id ); if ( layer ) return layer->id(); } if ( role == Qt::CheckStateRole ) { QgsLayerTreeLayer* nodeLayer = mBridge->rootGroup()->findLayer( id ); if ( nodeLayer ) return nodeLayer->isVisible(); } return QVariant(); }
void QgsLayerTreeMapCanvasBridge::setCanvasLayers( QgsLayerTreeNode *node, QList<QgsMapLayer *> &canvasLayers, QList<QgsMapLayer *> &overviewLayers, QList<QgsMapLayer *> &allLayers ) { if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node ); if ( nodeLayer->layer() && nodeLayer->layer()->isSpatial() ) { allLayers << nodeLayer->layer(); if ( nodeLayer->isVisible() ) canvasLayers << nodeLayer->layer(); if ( nodeLayer->customProperty( QStringLiteral( "overview" ), 0 ).toInt() ) overviewLayers << nodeLayer->layer(); } } const QList<QgsLayerTreeNode *> children = node->children(); for ( QgsLayerTreeNode *child : children ) setCanvasLayers( child, canvasLayers, overviewLayers, allLayers ); }
QStringList QgsLayerTreeUtils::invisibleLayerList( QgsLayerTreeNode *node ) { QStringList list; if ( QgsLayerTree::isGroup( node ) ) { const auto constChildren = QgsLayerTree::toGroup( node )->children(); for ( QgsLayerTreeNode *child : constChildren ) { list << invisibleLayerList( child ); } } else if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer *layer = QgsLayerTree::toLayer( node ); if ( !layer->isVisible() ) list << layer->layerId(); } return list; }
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 ); }
QVariant QgsLayerTreeModel::data( const QModelIndex &index, int role ) const { if ( !index.isValid() ) return QVariant(); if ( QgsLayerTreeModelLegendNode* sym = index2symnode( index ) ) { if ( role == Qt::CheckStateRole && !testFlag( AllowSymbologyChangeState ) ) return QVariant(); return sym->data( role ); } QgsLayerTreeNode* node = index2node( index ); if ( role == Qt::DisplayRole || role == Qt::EditRole ) { if ( QgsLayerTree::isGroup( node ) ) return QgsLayerTree::toGroup( node )->name(); else if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); QString name = nodeLayer->layerName(); if ( nodeLayer->customProperty( "showFeatureCount", 0 ).toInt() && role == Qt::DisplayRole ) { QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer*>( nodeLayer->layer() ); if ( vlayer && vlayer->pendingFeatureCount() >= 0 ) name += QString( " [%1]" ).arg( vlayer->pendingFeatureCount() ); } return name; } } else if ( role == Qt::DecorationRole && index.column() == 0 ) { if ( QgsLayerTree::isGroup( node ) ) return iconGroup(); else if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); // if there's just on legend entry that should be embedded in layer - do that! if ( testFlag( ShowSymbology ) && mSymbologyNodes[nodeLayer].count() == 1 && mSymbologyNodes[nodeLayer][0]->isEmbeddedInParent() ) return mSymbologyNodes[nodeLayer][0]->data( Qt::DecorationRole ); QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer(); if ( !layer ) return QVariant(); if ( layer->type() == QgsMapLayer::RasterLayer ) { if ( testFlag( ShowRasterPreviewIcon ) ) { QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer ); return QIcon( rlayer->previewAsPixmap( QSize( 32, 32 ) ) ); } else return QgsLayerItem::iconRaster(); } else if ( layer->type() == QgsMapLayer::VectorLayer ) { QgsVectorLayer* vlayer = static_cast<QgsVectorLayer*>( layer ); if ( vlayer->isEditable() ) { if ( vlayer->isModified() ) return QIcon( QgsApplication::getThemePixmap( "/mIconEditableEdits.png" ) ); else return QIcon( QgsApplication::getThemePixmap( "/mIconEditable.png" ) ); } if ( vlayer->geometryType() == QGis::Point ) return QgsLayerItem::iconPoint(); else if ( vlayer->geometryType() == QGis::Line ) return QgsLayerItem::iconLine(); else if ( vlayer->geometryType() == QGis::Polygon ) return QgsLayerItem::iconPolygon(); else if ( vlayer->geometryType() == QGis::NoGeometry ) return QgsLayerItem::iconTable(); } return QgsLayerItem::iconDefault(); } } else if ( role == Qt::CheckStateRole ) { if ( !testFlag( AllowNodeChangeVisibility ) ) return QVariant(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); if ( nodeLayer->layer() && nodeLayer->layer()->type() == QgsMapLayer::VectorLayer ) { if ( qobject_cast<QgsVectorLayer*>( nodeLayer->layer() )->geometryType() == QGis::NoGeometry ) return QVariant(); // do not show checkbox for non-spatial tables } return nodeLayer->isVisible(); } else if ( QgsLayerTree::isGroup( node ) ) { QgsLayerTreeGroup* nodeGroup = QgsLayerTree::toGroup( node ); return nodeGroup->isVisible(); } } else if ( role == Qt::FontRole ) { QFont f( QgsLayerTree::isLayer( node ) ? mFontLayer : ( QgsLayerTree::isGroup( node ) ? mFontGroup : QFont() ) ); if ( node->customProperty( "embedded" ).toInt() ) f.setItalic( true ); if ( index == mCurrentIndex ) f.setUnderline( true ); return f; } else if ( role == Qt::ToolTipRole ) { if ( QgsLayerTree::isLayer( node ) ) { if ( QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer() ) return layer->publicSource(); } } return QVariant(); }
QVariant QgsLayerTreeModel::data( const QModelIndex &index, int role ) const { if ( !index.isValid() || index.column() > 1 ) return QVariant(); if ( QgsLayerTreeModelLegendNode* sym = index2legendNode( index ) ) return legendNodeData( sym, role ); QgsLayerTreeNode* node = index2node( index ); if ( role == Qt::DisplayRole || role == Qt::EditRole ) { if ( QgsLayerTree::isGroup( node ) ) return QgsLayerTree::toGroup( node )->name(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); QString name = nodeLayer->layerName(); if ( nodeLayer->customProperty( "showFeatureCount", 0 ).toInt() && role == Qt::DisplayRole ) { QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer*>( nodeLayer->layer() ); if ( vlayer && vlayer->featureCount() >= 0 ) name += QString( " [%1]" ).arg( vlayer->featureCount() ); } return name; } } else if ( role == Qt::DecorationRole && index.column() == 0 ) { if ( QgsLayerTree::isGroup( node ) ) return iconGroup(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node ); QgsMapLayer *layer = nodeLayer->layer(); if ( !layer ) return QVariant(); // icons possibly overriding default icon if ( layer->type() == QgsMapLayer::RasterLayer ) { if ( testFlag( ShowRasterPreviewIcon ) ) { QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer ); return QIcon( QPixmap::fromImage( rlayer->previewAsImage( QSize( 32, 32 ) ) ) ); } else { return QgsLayerItem::iconRaster(); } } QgsVectorLayer *vlayer = dynamic_cast<QgsVectorLayer*>( layer ); QIcon icon; // if there's just on legend entry that should be embedded in layer - do that! if ( testFlag( ShowLegend ) && legendEmbeddedInParent( nodeLayer ) ) { icon = legendIconEmbeddedInParent( nodeLayer ); } else if ( vlayer && layer->type() == QgsMapLayer::VectorLayer ) { if ( vlayer->geometryType() == QGis::Point ) icon = QgsLayerItem::iconPoint(); else if ( vlayer->geometryType() == QGis::Line ) icon = QgsLayerItem::iconLine(); else if ( vlayer->geometryType() == QGis::Polygon ) icon = QgsLayerItem::iconPolygon(); else if ( vlayer->geometryType() == QGis::NoGeometry ) icon = QgsLayerItem::iconTable(); else icon = QgsLayerItem::iconDefault(); } if ( vlayer && vlayer->isEditable() ) { QPixmap pixmap( icon.pixmap( 16, 16 ) ); QPainter painter( &pixmap ); painter.drawPixmap( 0, 0, 16, 16, QgsApplication::getThemePixmap( vlayer->isModified() ? "/mIconEditableEdits.png" : "/mIconEditable.png" ) ); painter.end(); icon = QIcon( pixmap ); } return icon; } } else if ( role == Qt::CheckStateRole ) { if ( !testFlag( AllowNodeChangeVisibility ) ) return QVariant(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); if ( nodeLayer->layer() && nodeLayer->layer()->type() == QgsMapLayer::VectorLayer ) { if ( qobject_cast<QgsVectorLayer*>( nodeLayer->layer() )->geometryType() == QGis::NoGeometry ) return QVariant(); // do not show checkbox for non-spatial tables } return nodeLayer->isVisible(); } else if ( QgsLayerTree::isGroup( node ) ) { QgsLayerTreeGroup* nodeGroup = QgsLayerTree::toGroup( node ); return nodeGroup->isVisible(); } } else if ( role == Qt::FontRole ) { QFont f( QgsLayerTree::isLayer( node ) ? mFontLayer : ( QgsLayerTree::isGroup( node ) ? mFontGroup : QFont() ) ); if ( node->customProperty( "embedded" ).toInt() ) f.setItalic( true ); if ( index == mCurrentIndex ) f.setUnderline( true ); return f; } else if ( role == Qt::ToolTipRole ) { if ( QgsLayerTree::isLayer( node ) ) { if ( QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer() ) return layer->publicSource(); } } return QVariant(); }
void QgsLayerTreeMapCanvasBridge::setCanvasLayers() { QList<QgsMapLayer *> canvasLayers, overviewLayers, allLayerOrder; if ( mRoot->hasCustomLayerOrder() ) { const QList<QgsMapLayer *> customOrderLayers = mRoot->customLayerOrder(); for ( const QgsMapLayer *layer : customOrderLayers ) { QgsLayerTreeLayer *nodeLayer = mRoot->findLayer( layer->id() ); if ( nodeLayer ) { if ( !nodeLayer->layer()->isSpatial() ) continue; allLayerOrder << nodeLayer->layer(); if ( nodeLayer->isVisible() ) canvasLayers << nodeLayer->layer(); if ( nodeLayer->customProperty( QStringLiteral( "overview" ), 0 ).toInt() ) overviewLayers << nodeLayer->layer(); } } } else { setCanvasLayers( mRoot, canvasLayers, overviewLayers, allLayerOrder ); } const QList<QgsLayerTreeLayer *> layerNodes = mRoot->findLayers(); int currentSpatialLayerCount = 0; for ( QgsLayerTreeLayer *layerNode : layerNodes ) { if ( layerNode->layer() && layerNode->layer()->isSpatial() ) currentSpatialLayerCount++; } bool firstLayers = mAutoSetupOnFirstLayer && !mHasLayersLoaded && currentSpatialLayerCount != 0; mCanvas->setLayers( canvasLayers ); if ( mOverviewCanvas ) mOverviewCanvas->setLayers( overviewLayers ); if ( firstLayers ) { // if we are moving from zero to non-zero layers, let's zoom to those data mCanvas->zoomToFullExtent(); } if ( !mFirstCRS.isValid() ) { // find out what is the first used CRS in case we may need to turn on OTF projections later for ( const QgsLayerTreeLayer *layerNode : layerNodes ) { if ( layerNode->layer() && layerNode->layer()->crs().isValid() ) { mFirstCRS = layerNode->layer()->crs(); break; } } } if ( mFirstCRS.isValid() && firstLayers ) { QgsProject::instance()->setCrs( mFirstCRS ); } mHasLayersLoaded = currentSpatialLayerCount; if ( currentSpatialLayerCount == 0 ) mFirstCRS = QgsCoordinateReferenceSystem(); mPendingCanvasUpdate = false; emit canvasLayersChanged( canvasLayers ); }