Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix handling of numeric/bool variant types
  • Loading branch information
mhugent committed Sep 8, 2021
1 parent 78f6376 commit d67cdcc
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 12 deletions.
5 changes: 3 additions & 2 deletions src/core/vectortile/qgsmapboxglstyleconverter.cpp
Expand Up @@ -2477,7 +2477,7 @@ void QgsMapBoxGlStyleConverter::colorAsHslaComponents( const QColor &color, int
QString QgsMapBoxGlStyleConverter::interpolateExpression( double zoomMin, double zoomMax, QVariant valueMin, QVariant valueMax, double base, QgsMapBoxGlStyleConversionContext &context, double multiplier )
{
// special case!
if ( ( QMetaType::Type )valueMin.type() == QMetaType::Double && ( QMetaType::Type )valueMax.type() == QMetaType::Double )
if ( valueMin.canConvert( QMetaType::Double ) && valueMax.canConvert( QMetaType::Double ) )
{
double min = valueMin.toDouble();
double max = valueMax.toDouble();
Expand Down Expand Up @@ -2929,11 +2929,12 @@ QString QgsMapBoxGlStyleConverter::parseValue( const QVariant &value, QgsMapBoxG
case QVariant::StringList:
return parseExpression( value.toList(), context );

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

Expand Down
22 changes: 12 additions & 10 deletions tests/src/python/test_qgsmapboxglconverter.py
Expand Up @@ -37,17 +37,18 @@ def testNoLayer(self):
self.assertIsNone(c.labeling())

def testInterpolateExpression(self):
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 29, 1),
conversion_context = QgsMapBoxGlStyleConversionContext()
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 29, 1, conversion_context),
'scale_linear(@vector_tile_zoom,5,13,27,29)')
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 29, 1.5),
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 29, 1.5, conversion_context),
'scale_exp(@vector_tile_zoom,5,13,27,29,1.5)')
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 29, 1.5),
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 29, 1.5, conversion_context),
'scale_exp(@vector_tile_zoom,5,13,27,29,1.5)')

# same values, return nice and simple expression!
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 27, 1.5),
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 27, 1.5, conversion_context),
'27')
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 27, 1.5, 2),
self.assertEqual(QgsMapBoxGlStyleConverter.interpolateExpression(5, 13, 27, 27, 1.5, conversion_context, 2),
'54')

def testColorAsHslaComponents(self):
Expand Down Expand Up @@ -192,32 +193,33 @@ def testInterpolateByZoom(self):
self.assertEqual(default_val, 55.0)

def testInterpolateOpacityByZoom(self):
conversion_context = QgsMapBoxGlStyleConversionContext()
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 1,
'stops': [[0, 0.1],
[150, 0.15],
[250, 0.2]]
}, 255).expressionString(),
}, 255, conversion_context).expressionString(),
"CASE WHEN @vector_tile_zoom < 0 THEN set_color_part(@symbol_color, 'alpha', 25.5) WHEN @vector_tile_zoom >= 0 AND @vector_tile_zoom < 150 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,25.5,38.25)) WHEN @vector_tile_zoom >= 150 AND @vector_tile_zoom < 250 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,150,250,38.25,51)) WHEN @vector_tile_zoom >= 250 THEN set_color_part(@symbol_color, 'alpha', 51) END")
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 1,
'stops': [[0, 0.1],
[150, 0.15],
[250, 0.2]]
}, 100).expressionString(),
}, 100, conversion_context).expressionString(),
"CASE WHEN @vector_tile_zoom < 0 THEN set_color_part(@symbol_color, 'alpha', 10) WHEN @vector_tile_zoom >= 0 AND @vector_tile_zoom < 150 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,10,15)) WHEN @vector_tile_zoom >= 150 AND @vector_tile_zoom < 250 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,150,250,15,20)) WHEN @vector_tile_zoom >= 250 THEN set_color_part(@symbol_color, 'alpha', 20) END")
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 1,
'stops': [[0, 0.1],
[150, 0.15]]
}, 255).expressionString(),
}, 255, conversion_context).expressionString(),
"set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,25.5,38.25))")
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 2,
'stops': [[0, 0.1],
[150, 0.15]]
}, 255).expressionString(),
}, 255, conversion_context).expressionString(),
"set_color_part(@symbol_color, 'alpha', scale_exp(@vector_tile_zoom,0,150,25.5,38.25,2))")
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 2,
'stops': [[0, 0.1],
[150, 0.1]]
}, 255).expressionString(),
}, 255, conversion_context).expressionString(),
"set_color_part(@symbol_color, 'alpha', 25.5)")

def testInterpolateListByZoom(self):
Expand Down

0 comments on commit d67cdcc

Please sign in to comment.