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
+
+
+- The deprecated getExpression( const QString& expression, const QgsFields* fields ) method has been removed.
+Use the variant which accepts an expression context instead.
+
+
\subsection qgis_api_break_3_0_QgsDiagramLayerSettings QgsDiagramLayerSettings
@@ -255,6 +262,7 @@ a feature has a geometry is now done using the new hasGeometry() method. Any cod
None will need to be modified, as the method will return an empty geometry if the feature has no geometry.
- The temporary constGeometry() method has been removed. Use geometry() instead.
- setFields( const QgsFields*, bool ) has been removed, use setFields( const QgsFields&, bool ) instead.
+- fields() no longer returns a pointer, but instead a QgsFields value.
\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
+
+
+- The deprecated prepareExpressions( const QgsFields* fields, double scale = -1.0 ) method has been removed. Use
+the variant which takes QgsSymbolV2RenderContext instead.
+
+
+\subsection qgis_api_break_3_0_QgsSymbolV2RenderContext QgsSymbolV2RenderContext
+
+
+- The constructor now accepts a QgsFields reference, not a pointer.
+- fields() now returns a QgsFields value, not a pointer.
\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;