Skip to content

Commit 253a882

Browse files
committed
[symbology] Fix setSize(size) not working for ellipse markers
1 parent b5b0611 commit 253a882

File tree

7 files changed

+64
-16
lines changed

7 files changed

+64
-16
lines changed

python/core/auto_generated/symbology/qgsellipsesymbollayer.sip.in

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ A symbol layer for rendering objects with major and minor axis (e.g. ellipse, re
4848
void setSymbolName( const QString &name );
4949
QString symbolName() const;
5050

51+
virtual void setSize( double size );
52+
53+
5154
void setSymbolWidth( double w );
5255
double symbolWidth() const;
5356

python/core/auto_generated/symbology/qgssymbollayer.sip.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ is usually used for orienting symbols to match a line's angle.
519519
.. versionadded:: 2.9
520520
%End
521521

522-
void setSize( double size );
522+
virtual void setSize( double size );
523523
%Docstring
524524
Sets the symbol size.
525525

src/core/symbology/qgsellipsesymbollayer.cpp

+39-12
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ QgsSymbolLayer *QgsEllipseSymbolLayer::create( const QgsStringMap &properties )
5050
{
5151
layer->setSymbolName( properties[ QStringLiteral( "symbol_name" )] );
5252
}
53+
if ( properties.contains( QStringLiteral( "size" ) ) )
54+
{
55+
layer->setSize( properties[QStringLiteral( "size" )].toDouble() );
56+
}
57+
if ( properties.contains( QStringLiteral( "size_unit" ) ) )
58+
{
59+
layer->setSizeUnit( QgsUnitTypes::decodeRenderUnit( properties[QStringLiteral( "size_unit" )] ) );
60+
}
61+
if ( properties.contains( QStringLiteral( "size_map_unit_scale" ) ) )
62+
{
63+
layer->setSizeMapUnitScale( QgsSymbolLayerUtils::decodeMapUnitScale( properties[QStringLiteral( "size_map_unit_scale" )] ) );
64+
}
5365
if ( properties.contains( QStringLiteral( "symbol_width" ) ) )
5466
{
5567
layer->setSymbolWidth( properties[QStringLiteral( "symbol_width" )].toDouble() );
@@ -127,18 +139,6 @@ QgsSymbolLayer *QgsEllipseSymbolLayer::create( const QgsStringMap &properties )
127139
{
128140
layer->setStrokeColor( QgsSymbolLayerUtils::decodeColor( properties[QStringLiteral( "line_color" )] ) );
129141
}
130-
if ( properties.contains( QStringLiteral( "size" ) ) )
131-
{
132-
layer->setSize( properties[QStringLiteral( "size" )].toDouble() );
133-
}
134-
if ( properties.contains( QStringLiteral( "size_unit" ) ) )
135-
{
136-
layer->setSizeUnit( QgsUnitTypes::decodeRenderUnit( properties[QStringLiteral( "size_unit" )] ) );
137-
}
138-
if ( properties.contains( QStringLiteral( "size_map_unit_scale" ) ) )
139-
{
140-
layer->setSizeMapUnitScale( QgsSymbolLayerUtils::decodeMapUnitScale( properties[QStringLiteral( "size_map_unit_scale" )] ) );
141-
}
142142
if ( properties.contains( QStringLiteral( "offset" ) ) )
143143
{
144144
layer->setOffset( QgsSymbolLayerUtils::decodePoint( properties[QStringLiteral( "offset" )] ) );
@@ -593,6 +593,33 @@ void QgsEllipseSymbolLayer::preparePath( const QString &symbolName, QgsSymbolRen
593593
}
594594
}
595595

596+
void QgsEllipseSymbolLayer::setSize( double size )
597+
{
598+
if ( mSymbolWidth >= mSymbolHeight )
599+
{
600+
mSymbolHeight = mSymbolHeight * size / mSymbolWidth;
601+
mSymbolWidth = size;
602+
}
603+
else
604+
{
605+
mSymbolWidth = mSymbolWidth * size / mSymbolHeight;
606+
mSymbolHeight = size;
607+
}
608+
QgsMarkerSymbolLayer::setSize( size );
609+
}
610+
611+
void QgsEllipseSymbolLayer::setSymbolWidth( double w )
612+
{
613+
mSymbolWidth = w;
614+
QgsMarkerSymbolLayer::setSize( mSymbolWidth >= mSymbolHeight ? mSymbolWidth : mSymbolHeight );
615+
}
616+
617+
void QgsEllipseSymbolLayer::setSymbolHeight( double h )
618+
{
619+
mSymbolHeight = h;
620+
QgsMarkerSymbolLayer::setSize( mSymbolWidth >= mSymbolHeight ? mSymbolWidth : mSymbolHeight );
621+
}
622+
596623
void QgsEllipseSymbolLayer::setOutputUnit( QgsUnitTypes::RenderUnit unit )
597624
{
598625
QgsMarkerSymbolLayer::setOutputUnit( unit );

src/core/symbology/qgsellipsesymbollayer.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,12 @@ class CORE_EXPORT QgsEllipseSymbolLayer: public QgsMarkerSymbolLayer
5050
void setSymbolName( const QString &name ) { mSymbolName = name; }
5151
QString symbolName() const { return mSymbolName; }
5252

53-
void setSymbolWidth( double w ) { mSymbolWidth = w; }
53+
void setSize( double size ) override;
54+
55+
void setSymbolWidth( double w );
5456
double symbolWidth() const { return mSymbolWidth; }
5557

56-
void setSymbolHeight( double h ) { mSymbolHeight = h; }
58+
void setSymbolHeight( double h );
5759
double symbolHeight() const { return mSymbolHeight; }
5860

5961
Qt::PenStyle strokeStyle() const { return mStrokeStyle; }

src/core/symbology/qgssymbollayer.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ class CORE_EXPORT QgsMarkerSymbolLayer : public QgsSymbolLayer
527527
* \see setSizeUnit()
528528
* \see setSizeMapUnitScale()
529529
*/
530-
void setSize( double size ) { mSize = size; }
530+
virtual void setSize( double size ) { mSize = size; }
531531

532532
/**
533533
* Returns the symbol size. Units are specified by sizeUnit().

tests/src/core/testqgsellipsemarker.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class TestQgsEllipseMarkerSymbol : public QObject
5454
void cleanup() {} // will be called after every testfunction.
5555

5656
void ellipseMarkerSymbol();
57+
void ellipseMarkerSymbolSize();
5758
void ellipseMarkerSymbolBevelJoin();
5859
void ellipseMarkerSymbolMiterJoin();
5960
void ellipseMarkerSymbolRoundJoin();
@@ -137,6 +138,21 @@ void TestQgsEllipseMarkerSymbol::ellipseMarkerSymbol()
137138
QVERIFY( imageCheck( "ellipsemarker" ) );
138139
}
139140

141+
void TestQgsEllipseMarkerSymbol::ellipseMarkerSymbolSize()
142+
{
143+
mReport += QLatin1String( "<h2>Ellipse marker symbol layer setSize / size test</h2>\n" );
144+
145+
mEllipseMarkerLayer->setSymbolHeight( 3 );
146+
mEllipseMarkerLayer->setSymbolWidth( 6 );
147+
// Verify size value derived from width/height (largest value)
148+
QCOMPARE( mEllipseMarkerLayer->size(), 6.0 );
149+
150+
mEllipseMarkerLayer->setSize( 2 );
151+
// Verify width / height values adjusted from setSize
152+
QCOMPARE( mEllipseMarkerLayer->symbolHeight(), 1.0 );
153+
QCOMPARE( mEllipseMarkerLayer->symbolWidth(), 2.0 );
154+
}
155+
140156
void TestQgsEllipseMarkerSymbol::ellipseMarkerSymbolBevelJoin()
141157
{
142158
mReport += QLatin1String( "<h2>Ellipse marker symbol layer test</h2>\n" );

0 commit comments

Comments
 (0)