diff --git a/doc/api_break.dox b/doc/api_break.dox index 8714fb7784c..9560b262c15 100644 --- a/doc/api_break.dox +++ b/doc/api_break.dox @@ -233,6 +233,13 @@ instead. be returned in place of a null pointer. +\subsection qgis_api_break_3_0_QgsDiagram QgsDiagram + + + \subsection qgis_api_break_3_0_QgsDiagramLayerSettings QgsDiagramLayerSettings \subsection qgis_api_break_3_0_QgsFeatureRendererV2 QgsFeatureRendererV2 @@ -523,6 +531,21 @@ be returned instead of a null pointer if no transformation is required.
  • The OutputUnit enum, including QgsSymbolV2::MM, QgsSymbolV2::MapUnit, QgsSymbolV2::Mixed, QgsSymbolV2::Pixel and QgsSymbolV2::Percentage has been moved to QgsUnitTypes and renamed to RenderUnit. QgsSymbolV2::OutputUnitList was renamed to QgsUnitTypes::RenderUnitList. All methods which previously accepted QgsSymbolV2::OutputUnit parameters or QgsSymbolV2::OutputUnitList parameters now take QgsUnitTypes::RenderUnit or QgsUnitTypes::RenderUnitList parameters respectively.
  • +
  • startRender() now accepts a QgsFields reference, not a pointer.
  • + + +\subsection qgis_api_break_3_0_QgsSymbolLayerV2 QgsSymbolLayerV2 + + + +\subsection qgis_api_break_3_0_QgsSymbolV2RenderContext QgsSymbolV2RenderContext + + \subsection qgis_api_break_3_0_QgsSymbolLayerV2Utils QgsSymbolLayerV2Utils diff --git a/python/core/diagram/qgsdiagram.sip b/python/core/diagram/qgsdiagram.sip index 4957650778e..384f78ca41d 100644 --- a/python/core/diagram/qgsdiagram.sip +++ b/python/core/diagram/qgsdiagram.sip @@ -11,9 +11,6 @@ class QgsDiagram void clearCache(); - //! @deprecated use QgsExpressionContext variant instead - QgsExpression* getExpression( const QString& expression, const QgsFields* fields ) /Deprecated/; - /** Returns a prepared expression for the specified context. * @param expression expression string * @param context expression context diff --git a/python/core/qgsfeature.sip b/python/core/qgsfeature.sip index e2c507fca39..cc1c441fd08 100644 --- a/python/core/qgsfeature.sip +++ b/python/core/qgsfeature.sip @@ -361,9 +361,8 @@ class QgsFeature /** Returns the field map associated with the feature. * @see setFields - * TODO: QGIS 3 - return value, not pointer */ - const QgsFields* fields() const; + QgsFields fields() const; /** Insert a value into attribute. Returns false if attribute name could not be converted to index. * Field map must be associated using @link setFields @endlink before this method can be used. diff --git a/python/core/symbology-ng/qgssymbollayerv2.sip b/python/core/symbology-ng/qgssymbollayerv2.sip index 5356538e566..7922d6237b8 100644 --- a/python/core/symbology-ng/qgssymbollayerv2.sip +++ b/python/core/symbology-ng/qgssymbollayerv2.sip @@ -301,14 +301,6 @@ class QgsSymbolLayerV2 protected: QgsSymbolLayerV2( QgsSymbolV2::SymbolType type, bool locked = false ); - /** Prepares all data defined property expressions for evaluation. This should - * be called prior to evaluating data defined properties. - * @param fields associated layer fields - * @param scale map scale - * @deprecated use variant which takes QgsSymbolV2RenderContext instead - */ - virtual void prepareExpressions( const QgsFields* fields, double scale = -1.0 ) /Deprecated/; - /** Prepares all data defined property expressions for evaluation. This should * be called prior to evaluating data defined properties. * @param context symbol render context diff --git a/python/core/symbology-ng/qgssymbolv2.sip b/python/core/symbology-ng/qgssymbolv2.sip index 74a88b908d4..dfbf3e91e53 100644 --- a/python/core/symbology-ng/qgssymbolv2.sip +++ b/python/core/symbology-ng/qgssymbolv2.sip @@ -110,7 +110,7 @@ class QgsSymbolV2 //! delete layer at specified index and set a new one bool changeSymbolLayer( int index, QgsSymbolLayerV2 *layer /Transfer/ ); - void startRender( QgsRenderContext& context, const QgsFields* fields = 0 ); + void startRender( QgsRenderContext& context, const QgsFields& fields = QgsFields() ); void stopRender( QgsRenderContext& context ); void setColor( const QColor& color ); @@ -292,7 +292,7 @@ class QgsSymbolV2RenderContext * @param fields * @param mapUnitScale */ - QgsSymbolV2RenderContext( QgsRenderContext& c, QgsUnitTypes::RenderUnit u, qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = 0, const QgsFields* fields = 0, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ); + QgsSymbolV2RenderContext( QgsRenderContext& c, QgsUnitTypes::RenderUnit u, qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = 0, const QgsFields& fields = QgsFields(), const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ); ~QgsSymbolV2RenderContext(); QgsRenderContext& renderContext(); @@ -333,7 +333,7 @@ class QgsSymbolV2RenderContext //! to allow symbols with data-defined properties prepare the expressions //! (other times fields() returns null) //! @note added in 2.4 - const QgsFields* fields() const; + QgsFields fields() const; /** Part count of current geometry * @note added in QGIS 2.16 diff --git a/src/app/qgsdecorationgrid.cpp b/src/app/qgsdecorationgrid.cpp index 7339b29643d..649390dc894 100644 --- a/src/app/qgsdecorationgrid.cpp +++ b/src/app/qgsdecorationgrid.cpp @@ -232,7 +232,7 @@ void QgsDecorationGrid::render( QPainter * p ) QgsRenderContext context = QgsRenderContext::fromMapSettings( QgisApp::instance()->mapCanvas()->mapSettings() ); context.setPainter( p ); - mLineSymbol->startRender( context, nullptr ); + mLineSymbol->startRender( context ); for ( ; vIt != verticalLines.constEnd(); ++vIt ) { @@ -310,7 +310,7 @@ void QgsDecorationGrid::render( QPainter * p ) QgsRenderContext context = QgsRenderContext::fromMapSettings( QgisApp::instance()->mapCanvas()->mapSettings() ); context.setPainter( p ); - mMarkerSymbol->startRender( context, nullptr ); + mMarkerSymbol->startRender( context ); QPointF intersectionPoint; for ( ; vIt != verticalLines.constEnd(); ++vIt ) diff --git a/src/core/diagram/qgsdiagram.cpp b/src/core/diagram/qgsdiagram.cpp index cff90344366..82d301903c4 100644 --- a/src/core/diagram/qgsdiagram.cpp +++ b/src/core/diagram/qgsdiagram.cpp @@ -45,19 +45,6 @@ void QgsDiagram::clearCache() mExpressions.clear(); } -QgsExpression* QgsDiagram::getExpression( const QString& expression, const QgsFields* fields ) -{ - Q_NOWARN_DEPRECATED_PUSH - if ( !mExpressions.contains( expression ) ) - { - QgsExpression* expr = new QgsExpression( expression ); - expr->prepare( *fields ); - mExpressions[expression] = expr; - } - return mExpressions[expression]; - Q_NOWARN_DEPRECATED_POP -} - QgsExpression *QgsDiagram::getExpression( const QString &expression, const QgsExpressionContext &context ) { if ( !mExpressions.contains( expression ) ) diff --git a/src/core/diagram/qgsdiagram.h b/src/core/diagram/qgsdiagram.h index 737baf265e4..106666f7299 100644 --- a/src/core/diagram/qgsdiagram.h +++ b/src/core/diagram/qgsdiagram.h @@ -42,9 +42,6 @@ class CORE_EXPORT QgsDiagram void clearCache(); - //! @deprecated use QgsExpressionContext variant instead - Q_DECL_DEPRECATED QgsExpression* getExpression( const QString& expression, const QgsFields* fields ); - /** Returns a prepared expression for the specified context. * @param expression expression string * @param context expression context diff --git a/src/core/diagram/qgshistogramdiagram.cpp b/src/core/diagram/qgshistogramdiagram.cpp index 7da1efbb438..7713fe6e187 100644 --- a/src/core/diagram/qgshistogramdiagram.cpp +++ b/src/core/diagram/qgshistogramdiagram.cpp @@ -50,8 +50,8 @@ QSizeF QgsHistogramDiagram::diagramSize( const QgsFeature& feature, const QgsRen QgsExpressionContext expressionContext = c.expressionContext(); expressionContext.setFeature( feature ); - if ( feature.fields() ) - expressionContext.setFields( *feature.fields() ); + if ( !feature.fields().isEmpty() ) + expressionContext.setFields( feature.fields() ); Q_FOREACH ( const QString& cat, s.categoryAttributes ) { @@ -147,8 +147,8 @@ void QgsHistogramDiagram::renderDiagram( const QgsFeature& feature, QgsRenderCon QgsExpressionContext expressionContext = c.expressionContext(); expressionContext.setFeature( feature ); - if ( feature.fields() ) - expressionContext.setFields( *feature.fields() ); + if ( !feature.fields().isEmpty() ) + expressionContext.setFields( feature.fields() ); Q_FOREACH ( const QString& cat, s.categoryAttributes ) { diff --git a/src/core/diagram/qgspiediagram.cpp b/src/core/diagram/qgspiediagram.cpp index 7b5b38df51e..9091dcda1fd 100644 --- a/src/core/diagram/qgspiediagram.cpp +++ b/src/core/diagram/qgspiediagram.cpp @@ -43,8 +43,8 @@ QSizeF QgsPieDiagram::diagramSize( const QgsFeature& feature, const QgsRenderCon if ( is.classificationAttributeIsExpression ) { QgsExpressionContext expressionContext = c.expressionContext(); - if ( feature.fields() ) - expressionContext.setFields( *feature.fields() ); + if ( !feature.fields().isEmpty() ) + expressionContext.setFields( feature.fields() ); expressionContext.setFeature( feature ); QgsExpression* expression = getExpression( is.classificationAttributeExpression, expressionContext ); @@ -94,8 +94,8 @@ void QgsPieDiagram::renderDiagram( const QgsFeature& feature, QgsRenderContext& QgsExpressionContext expressionContext = c.expressionContext(); expressionContext.setFeature( feature ); - if ( feature.fields() ) - expressionContext.setFields( *feature.fields() ); + if ( !feature.fields().isEmpty() ) + expressionContext.setFields( feature.fields() ); QList::const_iterator catIt = s.categoryAttributes.constBegin(); for ( ; catIt != s.categoryAttributes.constEnd(); ++catIt ) diff --git a/src/core/diagram/qgstextdiagram.cpp b/src/core/diagram/qgstextdiagram.cpp index 0f01018479b..5752194d400 100644 --- a/src/core/diagram/qgstextdiagram.cpp +++ b/src/core/diagram/qgstextdiagram.cpp @@ -40,8 +40,8 @@ QSizeF QgsTextDiagram::diagramSize( const QgsFeature& feature, const QgsRenderCo { QgsExpressionContext expressionContext = c.expressionContext(); expressionContext.setFeature( feature ); - if ( feature.fields() ) - expressionContext.setFields( *feature.fields() ); + if ( !feature.fields().isEmpty() ) + expressionContext.setFields( feature.fields() ); QVariant attrVal; if ( is.classificationAttributeIsExpression ) @@ -198,8 +198,8 @@ void QgsTextDiagram::renderDiagram( const QgsFeature& feature, QgsRenderContext& QgsExpressionContext expressionContext = c.expressionContext(); expressionContext.setFeature( feature ); - if ( feature.fields() ) - expressionContext.setFields( *feature.fields() ); + if ( !feature.fields().isEmpty() ) + expressionContext.setFields( feature.fields() ); for ( int i = 0; i < textPositions.size(); ++i ) { diff --git a/src/core/qgsfeature.cpp b/src/core/qgsfeature.cpp index cbaae513f38..d92e779820d 100644 --- a/src/core/qgsfeature.cpp +++ b/src/core/qgsfeature.cpp @@ -134,9 +134,9 @@ void QgsFeature::setFields( const QgsFields &fields, bool init ) } } -const QgsFields *QgsFeature::fields() const +QgsFields QgsFeature::fields() const { - return &( d->fields ); + return d->fields; } /*************************************************************************** diff --git a/src/core/qgsfeature.h b/src/core/qgsfeature.h index dcc158b0796..2596b15a7a9 100644 --- a/src/core/qgsfeature.h +++ b/src/core/qgsfeature.h @@ -308,9 +308,8 @@ class CORE_EXPORT QgsFeature /** Returns the field map associated with the feature. * @see setFields - * TODO: QGIS 3 - return value, not pointer */ - const QgsFields* fields() const; + QgsFields fields() const; /** Insert a value into attribute. Returns false if attribute name could not be converted to index. * Field map must be associated using @link setFields @endlink before this method can be used. diff --git a/src/core/qgsjsonutils.cpp b/src/core/qgsjsonutils.cpp index c6b7ecf7048..a0074b2dbcf 100644 --- a/src/core/qgsjsonutils.cpp +++ b/src/core/qgsjsonutils.cpp @@ -116,9 +116,9 @@ QString QgsJSONExporter::exportFeature( const QgsFeature& feature, const QVarian if ( mIncludeAttributes ) { - const QgsFields* fields = feature.fields(); + QgsFields fields = feature.fields(); - for ( int i = 0; i < fields->count(); ++i ) + for ( int i = 0; i < fields.count(); ++i ) { if (( !mAttributeIndexes.isEmpty() && !mAttributeIndexes.contains( i ) ) || mExcludedAttributeIndexes.contains( i ) ) continue; @@ -127,7 +127,7 @@ QString QgsJSONExporter::exportFeature( const QgsFeature& feature, const QVarian properties += ",\n"; QVariant val = feature.attributes().at( i ); - properties += QString( " \"%1\":%2" ).arg( fields->at( i ).name(), QgsJSONUtils::encodeValue( val ) ); + properties += QString( " \"%1\":%2" ).arg( fields.at( i ).name(), QgsJSONUtils::encodeValue( val ) ); ++attributeCounter; } @@ -296,15 +296,15 @@ QString QgsJSONUtils::encodeValue( const QVariant &value ) QString QgsJSONUtils::exportAttributes( const QgsFeature& feature ) { - const QgsFields* fields = feature.fields(); + QgsFields fields = feature.fields(); QString attrs; - for ( int i = 0; i < fields->count(); ++i ) + for ( int i = 0; i < fields.count(); ++i ) { if ( i > 0 ) attrs += ",\n"; QVariant val = feature.attributes().at( i ); - attrs += encodeValue( fields->at( i ).name() ) + ':' + encodeValue( val ); + attrs += encodeValue( fields.at( i ).name() ) + ':' + encodeValue( val ); } return attrs.prepend( '{' ).append( '}' ); } diff --git a/src/core/symbology-ng/qgs25drenderer.cpp b/src/core/symbology-ng/qgs25drenderer.cpp index aff936c1984..90d818d6bf7 100644 --- a/src/core/symbology-ng/qgs25drenderer.cpp +++ b/src/core/symbology-ng/qgs25drenderer.cpp @@ -138,7 +138,7 @@ QgsFeatureRendererV2* Qgs25DRenderer::create( QDomElement& element ) void Qgs25DRenderer::startRender( QgsRenderContext& context, const QgsFields& fields ) { - mSymbol->startRender( context, &fields ); + mSymbol->startRender( context, fields ); } void Qgs25DRenderer::stopRender( QgsRenderContext& context ) diff --git a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp index ea7283a26b7..e7a0e20e9fc 100644 --- a/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp @@ -431,14 +431,14 @@ void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, con Q_FOREACH ( const QgsRendererCategoryV2& cat, mCategories ) { - cat.symbol()->startRender( context, &fields ); + cat.symbol()->startRender( context, fields ); if ( mRotation.data() || mSizeScale.data() ) { QgsSymbolV2* tempSymbol = cat.symbol()->clone(); tempSymbol->setRenderHints(( mRotation.data() ? QgsSymbolV2::DataDefinedRotation : 0 ) | ( mSizeScale.data() ? QgsSymbolV2::DataDefinedSizeScale : 0 ) ); - tempSymbol->startRender( context, &fields ); + tempSymbol->startRender( context, fields ); mTempSymbols[ cat.symbol()] = tempSymbol; } } diff --git a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp index 04b9da775d8..c27778ac47d 100644 --- a/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp @@ -424,14 +424,14 @@ void QgsGraduatedSymbolRendererV2::startRender( QgsRenderContext& context, const if ( !range.symbol() ) continue; - range.symbol()->startRender( context, &fields ); + range.symbol()->startRender( context, fields ); if ( mRotation.data() || mSizeScale.data() ) { QgsSymbolV2* tempSymbol = range.symbol()->clone(); tempSymbol->setRenderHints(( mRotation.data() ? QgsSymbolV2::DataDefinedRotation : 0 ) | ( mSizeScale.data() ? QgsSymbolV2::DataDefinedSizeScale : 0 ) ); - tempSymbol->startRender( context, &fields ); + tempSymbol->startRender( context, fields ); mTempSymbols[ range.symbol()] = tempSymbol; } } diff --git a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp index fcadfce8943..caa281a7968 100644 --- a/src/core/symbology-ng/qgspointdisplacementrenderer.cpp +++ b/src/core/symbology-ng/qgspointdisplacementrenderer.cpp @@ -364,7 +364,7 @@ void QgsPointDisplacementRenderer::startRender( QgsRenderContext& context, const if ( mCenterSymbol ) { - mCenterSymbol->startRender( context, &fields ); + mCenterSymbol->startRender( context, fields ); } return; } diff --git a/src/core/symbology-ng/qgsrulebasedrendererv2.cpp b/src/core/symbology-ng/qgsrulebasedrendererv2.cpp index eb765d191dd..4136f6f9fdf 100644 --- a/src/core/symbology-ng/qgsrulebasedrendererv2.cpp +++ b/src/core/symbology-ng/qgsrulebasedrendererv2.cpp @@ -447,7 +447,7 @@ bool QgsRuleBasedRendererV2::Rule::startRender( QgsRenderContext& context, const if ( mFilter ) mFilter->prepare( &context.expressionContext() ); if ( mSymbol ) - mSymbol->startRender( context, &fields ); + mSymbol->startRender( context, fields ); // init children // build temporary list of active rules (usable with this scale) diff --git a/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp b/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp index 03705ba9ad2..a6f0ec6c9c5 100644 --- a/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp +++ b/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp @@ -87,7 +87,7 @@ void QgsSingleSymbolRendererV2::startRender( QgsRenderContext& context, const Qg if ( !mSymbol.data() ) return; - mSymbol->startRender( context, &fields ); + mSymbol->startRender( context, fields ); if ( mRotation.data() || mSizeScale.data() ) { @@ -101,7 +101,7 @@ void QgsSingleSymbolRendererV2::startRender( QgsRenderContext& context, const Qg hints |= QgsSymbolV2::DataDefinedSizeScale; mTempSymbol->setRenderHints( hints ); - mTempSymbol->startRender( context, &fields ); + mTempSymbol->startRender( context, fields ); if ( mSymbol->type() == QgsSymbolV2::Marker ) { diff --git a/src/core/symbology-ng/qgssymbollayerv2.cpp b/src/core/symbology-ng/qgssymbollayerv2.cpp index 63f7cc2f572..d8415a6df39 100644 --- a/src/core/symbology-ng/qgssymbollayerv2.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2.cpp @@ -335,38 +335,6 @@ QgsSymbolLayerV2::QgsSymbolLayerV2( QgsSymbolV2::SymbolType type, bool locked ) mPaintEffect->setEnabled( false ); } -void QgsSymbolLayerV2::prepareExpressions( const QgsFields* fields, double scale ) -{ - QMap< QString, QgsDataDefined* >::const_iterator it = mDataDefinedProperties.constBegin(); - for ( ; it != mDataDefinedProperties.constEnd(); ++it ) - { - if ( it.value() ) - { - QMap params; - if ( scale > 0 ) - { - params.insert( "scale", scale ); - } - it.value()->setExpressionParams( params ); - - if ( fields ) - { - it.value()->prepareExpression( QgsExpressionContextUtils::createFeatureBasedContext( QgsFeature(), *fields ) ); - } - else - { - it.value()->prepareExpression(); - } - } - } - - if ( fields ) - { - //QgsFields is implicitly shared, so it's cheap to make a copy - mFields = *fields; - } -} - void QgsSymbolLayerV2::prepareExpressions( const QgsSymbolV2RenderContext& context ) { QMap< QString, QgsDataDefined* >::const_iterator it = mDataDefinedProperties.constBegin(); @@ -384,10 +352,10 @@ void QgsSymbolLayerV2::prepareExpressions( const QgsSymbolV2RenderContext& conte } } - if ( context.fields() ) + if ( !context.fields().isEmpty() ) { //QgsFields is implicitly shared, so it's cheap to make a copy - mFields = *context.fields(); + mFields = context.fields(); } } diff --git a/src/core/symbology-ng/qgssymbollayerv2.h b/src/core/symbology-ng/qgssymbollayerv2.h index 5e7bbce526e..a2673d6768c 100644 --- a/src/core/symbology-ng/qgssymbollayerv2.h +++ b/src/core/symbology-ng/qgssymbollayerv2.h @@ -311,14 +311,6 @@ class CORE_EXPORT QgsSymbolLayerV2 static const bool selectFillBorder = false; // Fill symbol layer also selects border symbology static const bool selectFillStyle = false; // Fill symbol uses symbol layer style.. - /** Prepares all data defined property expressions for evaluation. This should - * be called prior to evaluating data defined properties. - * @param fields associated layer fields - * @param scale map scale - * @deprecated use variant which takes QgsSymbolV2RenderContext instead - */ - Q_DECL_DEPRECATED virtual void prepareExpressions( const QgsFields* fields, double scale = -1.0 ); - /** Prepares all data defined property expressions for evaluation. This should * be called prior to evaluating data defined properties. * @param context symbol render context diff --git a/src/core/symbology-ng/qgssymbollayerv2utils.cpp b/src/core/symbology-ng/qgssymbollayerv2utils.cpp index dffa73e694f..dbe25760e4c 100644 --- a/src/core/symbology-ng/qgssymbollayerv2utils.cpp +++ b/src/core/symbology-ng/qgssymbollayerv2utils.cpp @@ -599,7 +599,7 @@ QPicture QgsSymbolLayerV2Utils::symbolLayerPreviewPicture( QgsSymbolLayerV2* lay painter.setRenderHint( QPainter::Antialiasing ); QgsRenderContext renderContext = createRenderContext( &painter ); renderContext.setForceVectorOutput( true ); - QgsSymbolV2RenderContext symbolContext( renderContext, units, 1.0, false, 0, nullptr, nullptr, scale ); + QgsSymbolV2RenderContext symbolContext( renderContext, units, 1.0, false, 0, nullptr, QgsFields(), scale ); layer->drawPreviewIcon( symbolContext, size ); painter.end(); return picture; @@ -613,7 +613,7 @@ QIcon QgsSymbolLayerV2Utils::symbolLayerPreviewIcon( QgsSymbolLayerV2* layer, Qg painter.begin( &pixmap ); painter.setRenderHint( QPainter::Antialiasing ); QgsRenderContext renderContext = createRenderContext( &painter ); - QgsSymbolV2RenderContext symbolContext( renderContext, u, 1.0, false, 0, nullptr, nullptr, scale ); + QgsSymbolV2RenderContext symbolContext( renderContext, u, 1.0, false, 0, nullptr, QgsFields(), scale ); layer->drawPreviewIcon( symbolContext, size ); painter.end(); return QIcon( pixmap ); diff --git a/src/core/symbology-ng/qgssymbolv2.cpp b/src/core/symbology-ng/qgssymbolv2.cpp index f0931ab65b5..b29bea7ff62 100644 --- a/src/core/symbology-ng/qgssymbolv2.cpp +++ b/src/core/symbology-ng/qgssymbolv2.cpp @@ -443,7 +443,7 @@ bool QgsSymbolV2::changeSymbolLayer( int index, QgsSymbolLayerV2* layer ) } -void QgsSymbolV2::startRender( QgsRenderContext& context, const QgsFields* fields ) +void QgsSymbolV2::startRender( QgsRenderContext& context, const QgsFields& fields ) { delete mSymbolRenderContext; mSymbolRenderContext = new QgsSymbolV2RenderContext( context, outputUnit(), mAlpha, false, mRenderHints, nullptr, fields, mapUnitScale() ); @@ -497,7 +497,7 @@ void QgsSymbolV2::drawPreviewIcon( QPainter* painter, QSize size, QgsRenderConte { QgsRenderContext context = customContext ? *customContext : QgsSymbolLayerV2Utils::createRenderContext( painter ); context.setForceVectorOutput( true ); - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints, nullptr, nullptr, mapUnitScale() ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, false, mRenderHints, nullptr, QgsFields(), mapUnitScale() ); Q_FOREACH ( QgsSymbolLayerV2* layer, mLayers ) { @@ -1024,7 +1024,7 @@ void QgsSymbolV2::renderVertexMarker( QPointF pt, QgsRenderContext& context, int //////////////////// -QgsSymbolV2RenderContext::QgsSymbolV2RenderContext( QgsRenderContext& c, QgsUnitTypes::RenderUnit u, qreal alpha, bool selected, int renderHints, const QgsFeature* f, const QgsFields* fields, const QgsMapUnitScale& mapUnitScale ) +QgsSymbolV2RenderContext::QgsSymbolV2RenderContext( QgsRenderContext& c, QgsUnitTypes::RenderUnit u, qreal alpha, bool selected, int renderHints, const QgsFeature* f, const QgsFields& fields, const QgsMapUnitScale& mapUnitScale ) : mRenderContext( c ) , mExpressionContextScope( nullptr ) , mOutputUnit( u ) @@ -1472,7 +1472,7 @@ void QgsMarkerSymbolV2::renderPointUsingLayer( QgsMarkerSymbolLayerV2* layer, QP void QgsMarkerSymbolV2::renderPoint( QPointF point, const QgsFeature* f, QgsRenderContext& context, int layerIdx, bool selected ) { - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, nullptr, mapUnitScale() ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, QgsFields(), mapUnitScale() ); symbolContext.setGeometryPartCount( symbolRenderContext()->geometryPartCount() ); symbolContext.setGeometryPartNum( symbolRenderContext()->geometryPartNum() ); @@ -1680,7 +1680,7 @@ void QgsLineSymbolV2::renderPolyline( const QPolygonF& points, const QgsFeature* { //save old painter QPainter* renderPainter = context.painter(); - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, nullptr, mapUnitScale() ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, QgsFields(), mapUnitScale() ); symbolContext.setGeometryPartCount( symbolRenderContext()->geometryPartCount() ); symbolContext.setGeometryPartNum( symbolRenderContext()->geometryPartNum() ); @@ -1759,7 +1759,7 @@ QgsFillSymbolV2::QgsFillSymbolV2( const QgsSymbolLayerV2List& layers ) void QgsFillSymbolV2::renderPolygon( const QPolygonF& points, QList* rings, const QgsFeature* f, QgsRenderContext& context, int layerIdx, bool selected ) { - QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, nullptr, mapUnitScale() ); + QgsSymbolV2RenderContext symbolContext( context, outputUnit(), mAlpha, selected, mRenderHints, f, QgsFields(), mapUnitScale() ); symbolContext.setGeometryPartCount( symbolRenderContext()->geometryPartCount() ); symbolContext.setGeometryPartNum( symbolRenderContext()->geometryPartNum() ); diff --git a/src/core/symbology-ng/qgssymbolv2.h b/src/core/symbology-ng/qgssymbolv2.h index cda2c699cc2..4714a63ebd3 100644 --- a/src/core/symbology-ng/qgssymbolv2.h +++ b/src/core/symbology-ng/qgssymbolv2.h @@ -22,6 +22,7 @@ #include "qgsmapunitscale.h" #include "qgspointv2.h" #include "qgsfeature.h" +#include "qgsfield.h" class QColor; class QImage; @@ -148,7 +149,7 @@ class CORE_EXPORT QgsSymbolV2 //! delete layer at specified index and set a new one bool changeSymbolLayer( int index, QgsSymbolLayerV2 *layer ); - void startRender( QgsRenderContext& context, const QgsFields* fields = nullptr ); + void startRender( QgsRenderContext& context, const QgsFields& fields = QgsFields() ); void stopRender( QgsRenderContext& context ); void setColor( const QColor& color ); @@ -359,7 +360,7 @@ class CORE_EXPORT QgsSymbolV2RenderContext * @param fields * @param mapUnitScale */ - QgsSymbolV2RenderContext( QgsRenderContext& c, QgsUnitTypes::RenderUnit u, qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = nullptr, const QgsFields* fields = nullptr, const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ); + QgsSymbolV2RenderContext( QgsRenderContext& c, QgsUnitTypes::RenderUnit u, qreal alpha = 1.0, bool selected = false, int renderHints = 0, const QgsFeature* f = nullptr, const QgsFields& fields = QgsFields(), const QgsMapUnitScale& mapUnitScale = QgsMapUnitScale() ); ~QgsSymbolV2RenderContext(); QgsRenderContext& renderContext() { return mRenderContext; } @@ -400,7 +401,7 @@ class CORE_EXPORT QgsSymbolV2RenderContext //! to allow symbols with data-defined properties prepare the expressions //! (other times fields() returns null) //! @note added in 2.4 - const QgsFields* fields() const { return mFields; } + QgsFields fields() const { return mFields; } /** Part count of current geometry * @note added in QGIS 2.16 @@ -450,7 +451,7 @@ class CORE_EXPORT QgsSymbolV2RenderContext bool mSelected; int mRenderHints; const QgsFeature* mFeature; //current feature - const QgsFields* mFields; + QgsFields mFields; int mGeometryPartCount; int mGeometryPartNum; diff --git a/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp b/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp index 401c3aad9c4..cc55cb230d3 100644 --- a/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp +++ b/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp @@ -210,11 +210,11 @@ void QgsVectorFieldSymbolLayer::startRender( QgsSymbolV2RenderContext& context ) mLineSymbol->startRender( context.renderContext(), context.fields() ); } - const QgsFields* fields = context.fields(); - if ( fields ) + QgsFields fields = context.fields(); + if ( !fields.isEmpty() ) { - mXIndex = fields->fieldNameIndex( mXAttribute ); - mYIndex = fields->fieldNameIndex( mYAttribute ); + mXIndex = fields.fieldNameIndex( mXAttribute ); + mYIndex = fields.fieldNameIndex( mYAttribute ); } else { diff --git a/src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp b/src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp index e7d07195af9..dd0387c2723 100644 --- a/src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp +++ b/src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp @@ -118,7 +118,7 @@ void QgsEditorWidgetWrapper::updateConstraint( const QgsFeature &ft ) description = layer()->editFormConfig()->expressionDescription( mFieldIdx ); QgsExpressionContext context = - QgsExpressionContextUtils::createFeatureBasedContext( ft, *ft.fields() ); + QgsExpressionContextUtils::createFeatureBasedContext( ft, ft.fields() ); context << QgsExpressionContextUtils::layerScope( layer() ); context.setFeature( ft ); @@ -142,7 +142,7 @@ void QgsEditorWidgetWrapper::updateConstraint( const QgsFeature &ft ) { if ( !expression.isEmpty() ) { - QString fieldName = ft.fields()->field( mFieldIdx ).name(); + QString fieldName = ft.fields().field( mFieldIdx ).name(); expression = "( " + expression + " ) AND ( " + fieldName + " IS NOT NULL)"; description = "( " + description + " ) AND NotNull"; } diff --git a/src/gui/qgsattributeform.cpp b/src/gui/qgsattributeform.cpp index 9853c3eedf8..47a7a10a020 100644 --- a/src/gui/qgsattributeform.cpp +++ b/src/gui/qgsattributeform.cpp @@ -869,7 +869,7 @@ void QgsAttributeForm::onUpdatedFields() QgsAttributes attrs( layer()->fields().size() ); for ( int i = 0; i < layer()->fields().size(); i++ ) { - int idx = mFeature.fields()->indexFromName( layer()->fields().at( i ).name() ); + int idx = mFeature.fields().indexFromName( layer()->fields().at( i ).name() ); if ( idx != -1 ) { attrs[i] = mFeature.attributes().at( idx ); diff --git a/src/providers/grass/qgsgrassprovider.cpp b/src/providers/grass/qgsgrassprovider.cpp index 9950587e4ab..99d7b12256a 100644 --- a/src/providers/grass/qgsgrassprovider.cpp +++ b/src/providers/grass/qgsgrassprovider.cpp @@ -1268,7 +1268,7 @@ void QgsGrassProvider::onFeatureAdded( QgsFeatureId fid ) // It may be that user manualy entered cat value QgsFeatureMap& addedFeatures = mEditBuffer->mAddedFeatures; QgsFeature& feature = addedFeatures[fid]; - int catIndex = feature.fields()->indexFromName( mLayer->keyColumnName() ); + int catIndex = feature.fields().indexFromName( mLayer->keyColumnName() ); if ( catIndex != -1 ) { QVariant userCatVariant = feature.attributes().value( catIndex ); diff --git a/src/providers/grass/qgsgrassvectormaplayer.cpp b/src/providers/grass/qgsgrassvectormaplayer.cpp index 88c81233b32..7877f166583 100644 --- a/src/providers/grass/qgsgrassvectormaplayer.cpp +++ b/src/providers/grass/qgsgrassvectormaplayer.cpp @@ -838,12 +838,12 @@ void QgsGrassVectorMapLayer::insertAttributes( int cat, const QgsFeature &featur cacheValues << QVariant(); } - if ( feature.fields() ) + if ( !feature.fields().isEmpty() ) { // append feature attributes if not null - for ( int i = 0; i < feature.fields()->size(); i++ ) + for ( int i = 0; i < feature.fields().size(); i++ ) { - QString name = feature.fields()->at( i ).name(); + QString name = feature.fields().at( i ).name(); QVariant valueVariant = feature.attributes().value( i ); if ( name != QgsGrassVectorMap::topoSymbolFieldName() ) @@ -940,7 +940,7 @@ void QgsGrassVectorMapLayer::updateAttributes( int cat, QgsFeature &feature, QSt error = tr( "Table does not exist" ); return; } - if ( !feature.isValid() || !feature.fields() ) + if ( !feature.isValid() || feature.fields().isEmpty() ) { error = tr( "Feature invalid" ); return; @@ -949,9 +949,9 @@ void QgsGrassVectorMapLayer::updateAttributes( int cat, QgsFeature &feature, QSt QStringList updates; QMap cacheUpdates; // append feature attributes if not null - for ( int i = 0; i < feature.fields()->size(); i++ ) + for ( int i = 0; i < feature.fields().size(); i++ ) { - QString name = feature.fields()->at( i ).name(); + QString name = feature.fields().at( i ).name(); if ( name == mFieldInfo->key ) { continue; diff --git a/src/providers/wfs/qgswfsfeatureiterator.cpp b/src/providers/wfs/qgswfsfeatureiterator.cpp index a56bd9f95df..33d583bdf01 100644 --- a/src/providers/wfs/qgswfsfeatureiterator.cpp +++ b/src/providers/wfs/qgswfsfeatureiterator.cpp @@ -955,7 +955,7 @@ bool QgsWFSFeatureIterator::fetchFeature( QgsFeature& f ) if ( !mShared->mGeometryAttribute.isEmpty() && mFetchGeometry ) { - int idx = cachedFeature.fields()->indexFromName( QgsWFSConstants::FIELD_HEXWKB_GEOM ); + int idx = cachedFeature.fields().indexFromName( QgsWFSConstants::FIELD_HEXWKB_GEOM ); Q_ASSERT( idx >= 0 ); const QVariant &v = cachedFeature.attributes().value( idx ); @@ -1183,7 +1183,7 @@ void QgsWFSFeatureIterator::copyFeature( const QgsFeature& srcFeature, QgsFeatur { Q_FOREACH ( int i, mSubSetAttributes ) { - int idx = srcFeature.fields()->indexFromName( fields.at( i ).name() ); + int idx = srcFeature.fields().indexFromName( fields.at( i ).name() ); if ( idx >= 0 ) { const QVariant &v = srcFeature.attributes().value( idx ); @@ -1200,7 +1200,7 @@ void QgsWFSFeatureIterator::copyFeature( const QgsFeature& srcFeature, QgsFeatur { for ( int i = 0; i < fields.size(); i++ ) { - int idx = srcFeature.fields()->indexFromName( fields.at( i ).name() ); + int idx = srcFeature.fields().indexFromName( fields.at( i ).name() ); if ( idx >= 0 ) { const QVariant &v = srcFeature.attributes().value( idx ); diff --git a/src/server/qgswfsserver.cpp b/src/server/qgswfsserver.cpp index d0d47c37a0a..a92ea4e2e24 100644 --- a/src/server/qgswfsserver.cpp +++ b/src/server/qgswfsserver.cpp @@ -1896,16 +1896,16 @@ QString QgsWfsServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord } } - const QgsFields* fields = feat->fields(); + QgsFields fields = feat->fields(); QgsAttributeList attrsToExport; for ( int i = 0; i < attrIndexes.count(); ++i ) { int idx = attrIndexes[i]; - if ( idx >= fields->count() ) + if ( idx >= fields.count() ) { continue; } - QString attributeName = fields->at( idx ).name(); + QString attributeName = fields.at( idx ).name(); //skip attribute if it is excluded from WFS publication if ( excludedAttributes.contains( attributeName ) ) { @@ -1972,15 +1972,15 @@ QDomElement QgsWfsServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc //read all attribute values from the feature QgsAttributes featureAttributes = feat->attributes(); - const QgsFields* fields = feat->fields(); + QgsFields fields = feat->fields(); for ( int i = 0; i < attrIndexes.count(); ++i ) { int idx = attrIndexes[i]; - if ( idx >= fields->count() ) + if ( idx >= fields.count() ) { continue; } - QString attributeName = fields->at( idx ).name(); + QString attributeName = fields.at( idx ).name(); //skip attribute if it is excluded from WFS publication if ( excludedAttributes.contains( attributeName ) ) { @@ -2047,15 +2047,15 @@ QDomElement QgsWfsServer::createFeatureGML3( QgsFeature* feat, QDomDocument& doc //read all attribute values from the feature QgsAttributes featureAttributes = feat->attributes(); - const QgsFields* fields = feat->fields(); + QgsFields fields = feat->fields(); for ( int i = 0; i < attrIndexes.count(); ++i ) { int idx = attrIndexes[i]; - if ( idx >= fields->count() ) + if ( idx >= fields.count() ) { continue; } - QString attributeName = fields->at( idx ).name(); + QString attributeName = fields.at( idx ).name(); //skip attribute if it is excluded from WFS publication if ( excludedAttributes.contains( attributeName ) ) { diff --git a/src/server/qgswmsserver.cpp b/src/server/qgswmsserver.cpp index 82b2d5f8019..d70dafb3c16 100644 --- a/src/server/qgswmsserver.cpp +++ b/src/server/qgswmsserver.cpp @@ -3273,10 +3273,10 @@ QDomElement QgsWmsServer::createFeatureGML( //read all allowed attribute values from the feature QgsAttributes featureAttributes = feat->attributes(); - const QgsFields* fields = feat->fields(); - for ( int i = 0; i < fields->count(); ++i ) + QgsFields fields = feat->fields(); + for ( int i = 0; i < fields.count(); ++i ) { - QString attributeName = fields->at( i ).name(); + QString attributeName = fields.at( i ).name(); //skip attribute if it is explicitly excluded from WMS publication if ( layer && layer->excludeAttributesWms().contains( attributeName ) ) { diff --git a/tests/src/core/testqgsfeature.cpp b/tests/src/core/testqgsfeature.cpp index 474c15f4fe5..0b89b902288 100644 --- a/tests/src/core/testqgsfeature.cpp +++ b/tests/src/core/testqgsfeature.cpp @@ -130,7 +130,7 @@ void TestQgsFeature::create() QgsFeature featureFromFieldsId( mFields, 1001LL ); QCOMPARE( featureFromFieldsId.id(), 1001LL ); - QCOMPARE( *featureFromFieldsId.fields(), mFields ); + QCOMPARE( featureFromFieldsId.fields(), mFields ); QCOMPARE( featureFromFieldsId.isValid(), false ); //should be 3 invalid attributes QCOMPARE( featureFromFieldsId.attributes().count(), 3 ); @@ -303,24 +303,24 @@ void TestQgsFeature::asVariant() QgsFeature fromVar = qvariant_cast( var ); //QCOMPARE( fromVar, original ); QCOMPARE( fromVar.id(), original.id() ); - QCOMPARE( *fromVar.fields(), *original.fields() ); + QCOMPARE( fromVar.fields(), original.fields() ); } void TestQgsFeature::fields() { QgsFeature original; - QVERIFY( original.fields()->isEmpty() ); + QVERIFY( original.fields().isEmpty() ); original.setFields( mFields ); - QCOMPARE( *original.fields(), mFields ); + QCOMPARE( original.fields(), mFields ); QgsFeature copy( original ); - QCOMPARE( *copy.fields(), *original.fields() ); + QCOMPARE( copy.fields(), original.fields() ); //test detach QgsFields newFields( mFields ); newFields.remove( 2 ); copy.setFields( newFields ); - QCOMPARE( *copy.fields(), newFields ); - QCOMPARE( *original.fields(), mFields ); + QCOMPARE( copy.fields(), newFields ); + QCOMPARE( original.fields(), mFields ); //test that no init leaves attributes copy = original; @@ -329,7 +329,7 @@ void TestQgsFeature::fields() copy.setAttribute( 1, 2 ); copy.setAttribute( 2, 3 ); copy.setFields( mFields, false ); - QCOMPARE( *copy.fields(), mFields ); + QCOMPARE( copy.fields(), mFields ); //should be 3 invalid attributes QCOMPARE( copy.attributes().count(), 3 ); QCOMPARE( copy.attributes().at( 0 ).toInt(), 1 ); @@ -343,7 +343,7 @@ void TestQgsFeature::fields() copy.setAttribute( 1, 2 ); copy.setAttribute( 2, 3 ); copy.setFields( mFields, true ); - QCOMPARE( *copy.fields(), mFields ); + QCOMPARE( copy.fields(), mFields ); //should be 3 invalid attributes QCOMPARE( copy.attributes().count(), 3 ); Q_FOREACH ( const QVariant& a, copy.attributes() ) diff --git a/tests/src/providers/grass/testqgsgrassprovider.cpp b/tests/src/providers/grass/testqgsgrassprovider.cpp index bd53ecf71bc..d189b6dc3f1 100644 --- a/tests/src/providers/grass/testqgsgrassprovider.cpp +++ b/tests/src/providers/grass/testqgsgrassprovider.cpp @@ -1112,7 +1112,7 @@ bool TestQgsGrassProvider::setAttributes( QgsFeature & feature, const QMapindexFromName( fieldName ); + int index = feature.fields().indexFromName( fieldName ); if ( index < 0 ) { attributesSet = false; @@ -1501,26 +1501,26 @@ bool TestQgsGrassProvider::equal( QgsFeature feature, QgsFeature expectedFeature } // GRASS feature has always additional cat field QSet indexes; - for ( int i = 0; i < feature.fields()->size(); i++ ) + for ( int i = 0; i < feature.fields().size(); i++ ) { - QString name = feature.fields()->at( i ).name(); + QString name = feature.fields().at( i ).name(); if ( name == "cat" ) // skip cat { continue; } indexes << i; } - for ( int i = 0; i < expectedFeature.fields()->size(); i++ ) + for ( int i = 0; i < expectedFeature.fields().size(); i++ ) { - QString name = expectedFeature.fields()->at( i ).name(); - int index = feature.fields()->indexFromName( name ); + QString name = expectedFeature.fields().at( i ).name(); + int index = feature.fields().indexFromName( name ); if ( index < 0 ) { // not found QStringList names; - for ( int j = 0; j < feature.fields()->size(); j++ ) + for ( int j = 0; j < feature.fields().size(); j++ ) { - names << feature.fields()->at( j ).name(); + names << feature.fields().at( j ).name(); } reportRow( QString( "Attribute %1 not found, feature attributes: %2" ).arg( name, names.join( "," ) ) ); return false; @@ -1539,7 +1539,7 @@ bool TestQgsGrassProvider::equal( QgsFeature feature, QgsFeature expectedFeature QStringList names; Q_FOREACH ( int i, indexes ) { - names << feature.fields()->at( i ).name(); + names << feature.fields().at( i ).name(); } reportRow( QString( "feature has %1 unexpected attributes: %2" ).arg( indexes.size() ).arg( names.join( "," ) ) ); return false;