Skip to content

Commit

Permalink
Improve color conversion if color is a part of an expression and add …
Browse files Browse the repository at this point in the history
…unit test for it
  • Loading branch information
mhugent authored and nyalldawson committed Dec 23, 2021
1 parent ee34ec5 commit 242b66e
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 20 deletions.
28 changes: 13 additions & 15 deletions src/core/vectortile/qgsmapboxglstyleconverter.cpp
Expand Up @@ -2607,7 +2607,7 @@ QString QgsMapBoxGlStyleConverter::parseColorExpression( const QVariant &colorEx
{
return parseExpression( colorExpression.toList(), context, true );
}
return parseValue( colorExpression, context );
return parseValue( colorExpression, context, true );
}

QColor QgsMapBoxGlStyleConverter::parseColor( const QVariant &color, QgsMapBoxGlStyleConversionContext &context )
Expand Down Expand Up @@ -2862,9 +2862,9 @@ QString QgsMapBoxGlStyleConverter::parseExpression( const QVariantList &expressi
caseString += QStringLiteral( "WHEN (%1) " ).arg( QgsExpression::createFieldEqualityExpression( attribute, expression.at( i ) ) );
}

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

QString QgsMapBoxGlStyleConverter::parseValue( const QVariant &value, QgsMapBoxGlStyleConversionContext &context )
QString QgsMapBoxGlStyleConverter::parseValue( const QVariant &value, QgsMapBoxGlStyleConversionContext &context, bool colorExpected )
{
QColor c;
switch ( value.type() )
{
case QVariant::List:
case QVariant::StringList:
return parseExpression( value.toList(), context );
return parseExpression( value.toList(), context, colorExpected );

case QVariant::Bool:
case QVariant::String:
if ( colorExpected )
{
QColor c = parseColor( value, context );
if ( c.isValid() )
{
return parseValue( c, context );
}
}
return QgsExpression::quotedValue( value );

case QVariant::Int:
Expand All @@ -3123,16 +3131,6 @@ QString QgsMapBoxGlStyleConverter::parseValue( const QVariant &value, QgsMapBoxG
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, QgsMapBoxGlStyleConversionContext &context )
{
if ( value.toString() == QLatin1String( "$type" ) )
Expand Down
6 changes: 1 addition & 5 deletions src/core/vectortile/qgsmapboxglstyleconverter.h
Expand Up @@ -543,12 +543,8 @@ class CORE_EXPORT QgsMapBoxGlStyleConverter
QgsMapBoxGlStyleConverter( const QgsMapBoxGlStyleConverter &other );
#endif

static QString parseValue( const QVariant &value, QgsMapBoxGlStyleConversionContext &context );
static QString parseValue( const QVariant &value, QgsMapBoxGlStyleConversionContext &context, bool colorExpected = false );

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

/**
Expand Down
1 change: 1 addition & 0 deletions tests/src/python/test_qgsmapboxglconverter.py
Expand Up @@ -355,6 +355,7 @@ def testParseExpression(self):
self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression(["%", 100, 20],
conversion_context),
'''100 % 20''')
self.assertEqual(QgsMapBoxGlStyleConverter.parseExpression(["match", ["get", "subclass"], "funicular", "rgba(243,243,246,0)", "rgb(243,243,246)"], conversion_context, True), '''CASE WHEN ("subclass" = 'funicular') THEN color_rgba(243,243,246,0) ELSE color_rgba(243,243,246,255) END''')

def testConvertLabels(self):
context = QgsMapBoxGlStyleConversionContext()
Expand Down

0 comments on commit 242b66e

Please sign in to comment.