static void _collectMapLayers( const QList<QgsLayerTreeNode *> &nodes, QSet<QgsMapLayer *> &layersSet ) { for ( QgsLayerTreeNode *node : nodes ) { if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node ); if ( nodeLayer->layer() ) layersSet << nodeLayer->layer(); } else if ( QgsLayerTree::isGroup( node ) ) { _collectMapLayers( QgsLayerTree::toGroup( node )->children(), layersSet ); } } }
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 ); }
foreach ( QgsLayerTreeNode* child, mChildren ) { if ( QgsLayerTree::isLayer( child ) ) { QgsLayerTreeLayer* childLayer = QgsLayerTree::toLayer( child ); if ( childLayer->layer() == layer ) { removeChildren( mChildren.indexOf( child ), 1 ); break; } } }
static void _addLayerTreeNodeToUriList( QgsLayerTreeNode *node, QgsMimeDataUtils::UriList &uris ) { if ( QgsLayerTree::isGroup( node ) ) { Q_FOREACH ( QgsLayerTreeNode *child, QgsLayerTree::toGroup( node )->children() ) _addLayerTreeNodeToUriList( child, uris ); } else if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node ); QgsMapLayer *layer = nodeLayer->layer(); if ( !layer ) return; QgsMimeDataUtils::Uri uri; uri.name = layer->name(); uri.uri = layer->dataProvider()->dataSourceUri(); uri.providerKey = layer->dataProvider()->name(); switch ( layer->type() ) { case QgsMapLayer::VectorLayer: { uri.layerType = QStringLiteral( "vector" ); if ( uri.providerKey == QStringLiteral( "memory" ) ) { QUrl url = QUrl::fromEncoded( uri.uri.toUtf8() ); url.addQueryItem( QStringLiteral( "pid" ), QString::number( QCoreApplication::applicationPid() ) ); url.addQueryItem( QStringLiteral( "layerid" ), layer->id() ); uri.uri = QString( url.toEncoded() ); } break; } case QgsMapLayer::RasterLayer: { uri.layerType = QStringLiteral( "raster" ); break; } case QgsMapLayer::MeshLayer: case QgsMapLayer::PluginLayer: { // plugin layers do not have a standard way of storing their URI... return; } } uris << uri; } }
void QgsLayerTreeView::modelRowsInserted( const QModelIndex& index, int start, int end ) { QgsLayerTreeNode* parentNode = layerTreeModel()->index2node( index ); if ( !parentNode ) return; // Embedded widgets - replace placeholders in the model by actual widgets if ( layerTreeModel()->testFlag( QgsLayerTreeModel::UseEmbeddedWidgets ) && QgsLayerTree::isLayer( parentNode ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( parentNode ); if ( QgsMapLayer* layer = nodeLayer->layer() ) { int widgetsCount = layer->customProperty( "embeddedWidgets/count", 0 ).toInt(); QList<QgsLayerTreeModelLegendNode*> legendNodes = layerTreeModel()->layerLegendNodes( nodeLayer ); for ( int i = 0; i < widgetsCount; ++i ) { QString providerId = layer->customProperty( QString( "embeddedWidgets/%1/id" ).arg( i ) ).toString(); if ( QgsLayerTreeEmbeddedWidgetProvider* provider = QgsLayerTreeEmbeddedWidgetRegistry::instance()->provider( providerId ) ) { QModelIndex index = layerTreeModel()->legendNode2index( legendNodes[i] ); setIndexWidget( index, provider->createWidget( layer, i ) ); } } } } if ( QgsLayerTree::isLayer( parentNode ) ) { // if ShowLegendAsTree flag is enabled in model, we may need to expand some legend nodes QStringList expandedNodeKeys = parentNode->customProperty( "expandedLegendNodes" ).toStringList(); if ( expandedNodeKeys.isEmpty() ) return; Q_FOREACH ( QgsLayerTreeModelLegendNode* legendNode, layerTreeModel()->layerLegendNodes( QgsLayerTree::toLayer( parentNode ) ) ) { QString ruleKey = legendNode->data( QgsLayerTreeModelLegendNode::RuleKeyRole ).toString(); if ( expandedNodeKeys.contains( ruleKey ) ) setExpanded( layerTreeModel()->legendNode2index( legendNode ), true ); } return; }
void QgsLayerTree::setCustomLayerOrder( const QStringList &customLayerOrder ) { QList<QgsMapLayer *> layers; for ( const auto &layerId : customLayerOrder ) { QgsLayerTreeLayer *nodeLayer = findLayer( layerId ); if ( nodeLayer ) { // configuration from 2.x projects might have non spatial layers QgsMapLayer *layer = nodeLayer->layer(); if ( !layer || !layer->isSpatial() ) { continue; } layers.append( layer ); } } setCustomLayerOrder( layers ); }
QVariant QgsLegendModel::data( const QModelIndex &index, int role ) const { // handle custom layer node labels if ( QgsLayerTreeNode *node = index2node( index ) ) { if ( QgsLayerTree::isLayer( node ) && ( role == Qt::DisplayRole || role == Qt::EditRole ) && !node->customProperty( QStringLiteral( "legend/title-label" ) ).isNull() ) { QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node ); QString name = node->customProperty( QStringLiteral( "legend/title-label" ) ).toString(); if ( nodeLayer->customProperty( QStringLiteral( "showFeatureCount" ), 0 ).toInt() && role == Qt::DisplayRole ) { QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( nodeLayer->layer() ); if ( vlayer && vlayer->featureCount() >= 0 ) name += QStringLiteral( " [%1]" ).arg( vlayer->featureCount() ); } return name; } } return QgsLayerTreeModel::data( index, role ); }
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 ); }