Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Detect colors before parseValue method to avoid string missinterprete…
…d as a color
  • Loading branch information
mhugent committed Sep 16, 2021
1 parent e097f6f commit 055bcec
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 12 deletions.
Expand Up @@ -526,7 +526,7 @@ Converts a value to Qt.PenJoinStyle enum from JSON value.
This is private API only, and may change in future QGIS versions
%End

static QString parseExpression( const QVariantList &expression, QgsMapBoxGlStyleConversionContext &context );
static QString parseExpression( const QVariantList &expression, QgsMapBoxGlStyleConversionContext &context, bool colorExpected = false );
%Docstring
Converts a MapBox GL expression to a QGIS expression.

Expand Down
29 changes: 19 additions & 10 deletions src/core/vectortile/qgsmapboxglstyleconverter.cpp
Expand Up @@ -2506,7 +2506,7 @@ QString QgsMapBoxGlStyleConverter::parseColorExpression( const QVariant &colorEx
{
if ( ( QMetaType::Type )colorExpression.type() == QMetaType::QVariantList )
{
return parseExpression( colorExpression.toList(), context );
return parseExpression( colorExpression.toList(), context, true );
}
return parseValue( colorExpression, context );
}
Expand Down Expand Up @@ -2610,7 +2610,7 @@ Qt::PenJoinStyle QgsMapBoxGlStyleConverter::parseJoinStyle( const QString &style
return Qt::MiterJoin; // "miter" is default
}

QString QgsMapBoxGlStyleConverter::parseExpression( const QVariantList &expression, QgsMapBoxGlStyleConversionContext &context )
QString QgsMapBoxGlStyleConverter::parseExpression( const QVariantList &expression, QgsMapBoxGlStyleConversionContext &context, bool colorExpected )
{
QString op = expression.value( 0 ).toString();
if ( op == QLatin1String( "literal" ) )
Expand Down Expand Up @@ -2755,9 +2755,9 @@ QString QgsMapBoxGlStyleConverter::parseExpression( const QVariantList &expressi
caseString += QStringLiteral( "WHEN (%1) " ).arg( QgsExpression::createFieldEqualityExpression( attribute, expression.at( i ) ) );
}

caseString += QStringLiteral( "THEN %1 " ).arg( parseValue( expression.at( i + 1 ), context ) );
caseString += QStringLiteral( "THEN %1 " ).arg( colorExpected ? parseValueCheckColor( expression.at( i + 1 ), context ) : parseValue( expression.at( i + 1 ), context ) );
}
caseString += QStringLiteral( "ELSE %1 END" ).arg( parseValue( expression.last(), context ) );
caseString += QStringLiteral( "ELSE %1 END" ).arg( colorExpected ? parseValueCheckColor( expression.last(), context ) : parseValue( expression.last(), context ) );
return caseString;
}
}
Expand Down Expand Up @@ -2999,24 +2999,33 @@ QString QgsMapBoxGlStyleConverter::parseValue( const QVariant &value, QgsMapBoxG

case QVariant::Bool:
case QVariant::String:
c = parseColor( value, context );
if ( !c.isValid() )
{
return QgsExpression::quotedValue( value );
}
return QString( "color_rgba(%1,%2,%3,%4)" ).arg( c.red() ).arg( c.green() ).arg( c.blue() ).arg( c.alpha() );
return QgsExpression::quotedValue( value );

case QVariant::Int:
case QVariant::Double:
return value.toString();

case QVariant::Color:
c = value.value<QColor>();
return QString( "color_rgba(%1,%2,%3,%4)" ).arg( c.red() ).arg( c.green() ).arg( c.blue() ).arg( c.alpha() );

default:
context.pushWarning( QObject::tr( "%1: Skipping unsupported expression part" ).arg( context.layerId() ) );
break;
}
return QString();
}

QString QgsMapBoxGlStyleConverter::parseValueCheckColor( const QVariant &value, QgsMapBoxGlStyleConversionContext &context )
{
QColor c = parseColor( value, context );
if ( c.isValid() )
{
return parseValue( c, context );
}
return parseValue( value, context );
}

QString QgsMapBoxGlStyleConverter::parseKey( const QVariant &value )
{
if ( value.toString() == QLatin1String( "$type" ) )
Expand Down
7 changes: 6 additions & 1 deletion src/core/vectortile/qgsmapboxglstyleconverter.h
Expand Up @@ -511,7 +511,7 @@ class CORE_EXPORT QgsMapBoxGlStyleConverter
*
* \warning This is private API only, and may change in future QGIS versions
*/
static QString parseExpression( const QVariantList &expression, QgsMapBoxGlStyleConversionContext &context );
static QString parseExpression( const QVariantList &expression, QgsMapBoxGlStyleConversionContext &context, bool colorExpected = false );

/**
* Retrieves the sprite image with the specified \a name, taken from the specified \a context.
Expand All @@ -536,6 +536,11 @@ class CORE_EXPORT QgsMapBoxGlStyleConverter
#endif

static QString parseValue( const QVariant &value, QgsMapBoxGlStyleConversionContext &context );

/**
* Checks if value is a color before calling parseValue
*/
static QString parseValueCheckColor( const QVariant &value, QgsMapBoxGlStyleConversionContext &context );
static QString parseKey( const QVariant &value );

/**
Expand Down

0 comments on commit 055bcec

Please sign in to comment.