int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer ) { if ( !layerItem || !vlayer ) { return 1; } QgsFeatureRendererV2* renderer = vlayer->rendererV2(); if ( !renderer ) { return 2; } QgsLegendSymbolList lst = renderer->legendSymbolItems(); QgsLegendSymbolList::const_iterator symbolIt = lst.constBegin(); for ( ; symbolIt != lst.constEnd(); ++symbolIt ) { QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item( symbolIt->first ); currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); if ( symbolIt->second ) { if ( mHasTopLevelWindow ) //only use QIcon / QPixmap if we have a running x-server { currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) ); } currentSymbolItem->setSymbolV2( symbolIt->second->clone() ); } layerItem->setChild( layerItem->rowCount(), 0, currentSymbolItem ); } return 0; }
bool QgsVectorLayerFeatureCounter::run() { QgsLegendSymbolList symbolList = mRenderer->legendSymbolItems(); QgsLegendSymbolList::const_iterator symbolIt = symbolList.constBegin(); for ( ; symbolIt != symbolList.constEnd(); ++symbolIt ) { mSymbolFeatureCountMap.insert( symbolIt->label(), 0 ); } // If there are no features to be counted, we can spare us the trouble if ( mFeatureCount > 0 ) { int featuresCounted = 0; // Renderer (rule based) may depend on context scale, with scale is ignored if 0 QgsRenderContext renderContext; renderContext.setRendererScale( 0 ); renderContext.setExpressionContext( mExpressionContext ); QgsFeatureRequest request; if ( !mRenderer->filterNeedsGeometry() ) request.setFlags( QgsFeatureRequest::NoGeometry ); request.setSubsetOfAttributes( mRenderer->usedAttributes( renderContext ), mSource->fields() ); QgsFeatureIterator fit = mSource->getFeatures( request ); // TODO: replace QgsInterruptionChecker with QgsFeedback // fit.setInterruptionChecker( mFeedback ); mRenderer->startRender( renderContext, mSource->fields() ); double progress = 0; QgsFeature f; while ( fit.nextFeature( f ) ) { renderContext.expressionContext().setFeature( f ); QSet<QString> featureKeyList = mRenderer->legendKeysForFeature( f, renderContext ); Q_FOREACH ( const QString &key, featureKeyList ) { mSymbolFeatureCountMap[key] += 1; } ++featuresCounted; double p = ( static_cast< double >( featuresCounted ) / mFeatureCount ) * 100; if ( p - progress > 1 ) { progress = p; setProgress( progress ); } if ( isCanceled() ) { mRenderer->stopRender( renderContext ); return false; } } mRenderer->stopRender( renderContext ); }
int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer ) { QgsComposerLayerItem* lItem = dynamic_cast<QgsComposerLayerItem*>( layerItem ); if ( !layerItem || !lItem || !vlayer ) { return 1; } QgsFeatureRendererV2* renderer = vlayer->rendererV2(); if ( !renderer ) { return 2; } if ( lItem->showFeatureCount() ) { if ( !vlayer->countSymbolFeatures() ) { QgsDebugMsg( "Cannot get feature counts" ); } } QgsLegendSymbolList lst = renderer->legendSymbolItems(); QgsLegendSymbolList::const_iterator symbolIt = lst.constBegin(); for ( ; symbolIt != lst.constEnd(); ++symbolIt ) { QString label = symbolIt->first; if ( lItem->showFeatureCount() ) { // Add counts to multi symbols layers only or labeled single symbols, // so that single symbol layers are still drawn on single line if ( lst.size() > 1 || !label.isEmpty() ) { label += QString( " [%1]" ).arg( vlayer->featureCount( symbolIt->second ) ); } } QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item( label ); currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); if ( symbolIt->second ) { if ( mHasTopLevelWindow ) //only use QIcon / QPixmap if we have a running x-server { currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) ); } currentSymbolItem->setSymbolV2( symbolIt->second->clone() ); } layerItem->setChild( layerItem->rowCount(), 0, currentSymbolItem ); } return 0; }
int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer, double scaleDenominator ) { QgsComposerLayerItem* lItem = dynamic_cast<QgsComposerLayerItem*>( layerItem ); if ( !layerItem || !lItem || !vlayer ) { return 1; } QgsFeatureRendererV2* renderer = vlayer->rendererV2(); if ( !renderer ) { return 2; } if ( lItem->showFeatureCount() ) { if ( !vlayer->countSymbolFeatures() ) { QgsDebugMsg( "Cannot get feature counts" ); } } QgsLegendSymbolList lst = renderer->legendSymbolItems( scaleDenominator ); QgsLegendSymbolList::const_iterator symbolIt = lst.constBegin(); int row = 0; for ( ; symbolIt != lst.constEnd(); ++symbolIt ) { if ( scaleDenominator == -1 ) { QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item( "" ); // Get userText from old item if exists QgsComposerSymbolV2Item* oldSymbolItem = dynamic_cast<QgsComposerSymbolV2Item*>( layerItem->child( row, 0 ) ); if ( oldSymbolItem ) { currentSymbolItem->setUserText( oldSymbolItem->userText() ); } currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable ); if ( symbolIt->second ) { if ( mHasTopLevelWindow ) //only use QIcon / QPixmap if we have a running x-server { currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) ); } currentSymbolItem->setSymbolV2( symbolIt->second->clone() ); } layerItem->setChild( row, 0, currentSymbolItem ); // updateSymbolV2ItemText needs layer set updateSymbolV2ItemText( currentSymbolItem ); row++; } else { QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item( "" ); currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) ); currentSymbolItem->setSymbolV2( symbolIt->second ); layerItem->setChild( 0, 0, currentSymbolItem ); currentSymbolItem->setText( symbolIt->first ); } } if ( scaleDenominator == -1 ) { // Delete following old items (if current number of items decreased) for ( int i = layerItem->rowCount() - 1; i >= row; --i ) { layerItem->removeRow( i ); } } return 0; }