Skip to content

Commit 10475a6

Browse files
committedMay 8, 2018
Really accept strings for arrow data defined properties
1 parent 79035ac commit 10475a6

14 files changed

+151
-7
lines changed
 

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212

1313

14+
1415
class QgsSymbolLayer
1516
{
1617

‎python/core/symbology/qgssymbollayerutils.sip.in

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@ class QgsSymbolLayerUtils
5555
static QString encodeSldBrushStyle( Qt::BrushStyle style );
5656
static Qt::BrushStyle decodeSldBrushStyle( const QString &str );
5757

58+
static QgsArrowSymbolLayer::HeadType decodeArrowHeadType( const QVariant &value, bool *ok /Out/ = 0 );
59+
%Docstring
60+
Decodes a ``value`` representing an arrow head type.
61+
62+
.. versionadded:: 3.2
63+
%End
64+
65+
static QgsArrowSymbolLayer::ArrowType decodeArrowType( const QVariant &value, bool *ok /Out/ = 0 );
66+
%Docstring
67+
Decodes a ``value`` representing an arrow type.
68+
69+
.. versionadded:: 3.2
70+
%End
71+
5872
static QString encodePoint( QPointF point );
5973
%Docstring
6074
Encodes a QPointF to a string.

‎src/app/qgsmaptooloffsetpointsymbol.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgssymbollayer.h"
2525
#include "qgisapp.h"
2626
#include "qgsproperty.h"
27+
#include "qgssymbollayerutils.h"
2728

2829
#include <QGraphicsPixmapItem>
2930
#include <QMouseEvent>

‎src/core/symbology/qgs25drenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgseffectstack.h"
2121
#include "qgsgloweffect.h"
2222
#include "qgsproperty.h"
23+
#include "qgssymbollayerutils.h"
2324

2425
#define ROOF_EXPRESSION \
2526
"translate(" \

‎src/core/symbology/qgsarrowsymbollayer.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
***************************************************************************/
1515

1616
#include "qgsarrowsymbollayer.h"
17+
#include "qgssymbollayerutils.h"
1718

1819
QgsArrowSymbolLayer::QgsArrowSymbolLayer()
1920
{
@@ -648,21 +649,21 @@ void QgsArrowSymbolLayer::_resolveDataDefined( QgsSymbolRenderContext &context )
648649
{
649650
context.setOriginalValueVariable( headType() );
650651
exprVal = mDataDefinedProperties.value( QgsSymbolLayer::PropertyArrowHeadType, context.renderContext().expressionContext() );
651-
int h = exprVal.toInt( &ok );
652+
HeadType h = QgsSymbolLayerUtils::decodeArrowHeadType( exprVal, &ok );
652653
if ( ok )
653654
{
654-
mComputedHeadType = static_cast<HeadType>( h );
655+
mComputedHeadType = h;
655656
}
656657
}
657658

658659
if ( mDataDefinedProperties.isActive( QgsSymbolLayer::PropertyArrowType ) )
659660
{
660661
context.setOriginalValueVariable( arrowType() );
661662
exprVal = mDataDefinedProperties.value( QgsSymbolLayer::PropertyArrowType, context.renderContext().expressionContext() );
662-
int h = exprVal.toInt( &ok );
663+
ArrowType h = QgsSymbolLayerUtils::decodeArrowType( exprVal, &ok );
663664
if ( ok )
664665
{
665-
mComputedArrowType = static_cast<ArrowType>( h );
666+
mComputedArrowType = h;
666667
}
667668
}
668669
}

‎src/core/symbology/qgsellipsesymbollayer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgslogger.h"
2222
#include "qgsunittypes.h"
2323
#include "qgsproperty.h"
24+
#include "qgssymbollayerutils.h"
2425

2526
#include <QPainter>
2627
#include <QSet>

‎src/core/symbology/qgssymbollayer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "qgspainteffectregistry.h"
2626
#include "qgsproperty.h"
2727
#include "qgsexpressioncontext.h"
28+
#include "qgssymbollayerutils.h"
2829

2930
#include <QSize>
3031
#include <QPainter>

‎src/core/symbology/qgssymbollayer.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
#include <QDomElement>
2929

3030
#include "qgssymbol.h"
31-
#include "qgssymbollayerutils.h" // QgsStringMap
3231
#include "qgsfields.h"
3332
#include "qgspropertycollection.h"
3433

@@ -41,6 +40,10 @@ class QgsExpression;
4140
class QgsRenderContext;
4241
class QgsPaintEffect;
4342

43+
#ifndef SIP_RUN
44+
typedef QMap<QString, QString> QgsStringMap;
45+
#endif
46+
4447
/**
4548
* \ingroup core
4649
* \class QgsSymbolLayer

‎src/core/symbology/qgssymbollayerutils.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,56 @@ Qt::BrushStyle QgsSymbolLayerUtils::decodeSldBrushStyle( const QString &str )
371371
return Qt::NoBrush;
372372
}
373373

374+
QgsArrowSymbolLayer::HeadType QgsSymbolLayerUtils::decodeArrowHeadType( const QVariant &value, bool *ok )
375+
{
376+
if ( ok )
377+
*ok = true;
378+
379+
bool intOk = false;
380+
QString s = value.toString().toLower().trimmed();
381+
if ( s == QLatin1String( "single" ) )
382+
return QgsArrowSymbolLayer::HeadSingle;
383+
else if ( s == QLatin1String( "reversed" ) )
384+
return QgsArrowSymbolLayer::HeadReversed;
385+
else if ( s == QLatin1String( "double" ) )
386+
return QgsArrowSymbolLayer::HeadDouble;
387+
else if ( value.toInt() == 1 )
388+
return QgsArrowSymbolLayer::HeadReversed;
389+
else if ( value.toInt() == 2 )
390+
return QgsArrowSymbolLayer::HeadDouble;
391+
else if ( value.toInt( &intOk ) == 0 && intOk )
392+
return QgsArrowSymbolLayer::HeadSingle;
393+
394+
if ( ok )
395+
*ok = false;
396+
return QgsArrowSymbolLayer::HeadSingle;
397+
}
398+
399+
QgsArrowSymbolLayer::ArrowType QgsSymbolLayerUtils::decodeArrowType( const QVariant &value, bool *ok )
400+
{
401+
if ( ok )
402+
*ok = true;
403+
404+
bool intOk = false;
405+
QString s = value.toString().toLower().trimmed();
406+
if ( s == QLatin1String( "plain" ) )
407+
return QgsArrowSymbolLayer::ArrowPlain;
408+
else if ( s == QLatin1String( "lefthalf" ) )
409+
return QgsArrowSymbolLayer::ArrowLeftHalf;
410+
else if ( s == QLatin1String( "righthalf" ) )
411+
return QgsArrowSymbolLayer::ArrowRightHalf;
412+
else if ( value.toInt() == 1 )
413+
return QgsArrowSymbolLayer::ArrowLeftHalf;
414+
else if ( value.toInt() == 2 )
415+
return QgsArrowSymbolLayer::ArrowRightHalf;
416+
else if ( value.toInt( &intOk ) == 0 && intOk )
417+
return QgsArrowSymbolLayer::ArrowPlain;
418+
419+
if ( ok )
420+
*ok = false;
421+
return QgsArrowSymbolLayer::ArrowPlain;
422+
}
423+
374424
QString QgsSymbolLayerUtils::encodePoint( QPointF point )
375425
{
376426
return QStringLiteral( "%1,%2" ).arg( qgsDoubleToString( point.x() ), qgsDoubleToString( point.y() ) );

‎src/core/symbology/qgssymbollayerutils.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "qgis.h"
3030
#include "qgsmapunitscale.h"
3131
#include "qgscolorramp.h"
32+
#include "qgsarrowsymbollayer.h"
3233

3334
class QgsExpression;
3435
class QgsPathResolver;
@@ -87,6 +88,18 @@ class CORE_EXPORT QgsSymbolLayerUtils
8788
static QString encodeSldBrushStyle( Qt::BrushStyle style );
8889
static Qt::BrushStyle decodeSldBrushStyle( const QString &str );
8990

91+
/**
92+
* Decodes a \a value representing an arrow head type.
93+
* \since QGIS 3.2
94+
*/
95+
static QgsArrowSymbolLayer::HeadType decodeArrowHeadType( const QVariant &value, bool *ok SIP_OUT = nullptr );
96+
97+
/**
98+
* Decodes a \a value representing an arrow type.
99+
* \since QGIS 3.2
100+
*/
101+
static QgsArrowSymbolLayer::ArrowType decodeArrowType( const QVariant &value, bool *ok SIP_OUT = nullptr );
102+
90103
/**
91104
* Encodes a QPointF to a string.
92105
* \see decodePoint()

‎src/core/symbology/qgsvectorfieldsymbollayer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgsvectorfieldsymbollayer.h"
1919
#include "qgsvectorlayer.h"
2020
#include "qgsunittypes.h"
21+
#include "qgssymbollayerutils.h"
2122

2223
QgsVectorFieldSymbolLayer::QgsVectorFieldSymbolLayer()
2324
{

‎tests/src/core/testqgsproject.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#include "qgssettings.h"
2525
#include "qgsunittypes.h"
2626
#include "qgsvectorlayer.h"
27-
27+
#include "qgssymbollayerutils.h"
2828

2929
class TestQgsProject : public QObject
3030
{

‎tests/src/core/testqgssvgmarker.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <qgssinglesymbolrenderer.h>
3333
#include "qgsmarkersymbollayer.h"
3434
#include "qgsproperty.h"
35+
#include "qgssymbollayerutils.h"
3536

3637
//qgis test includes
3738
#include "qgsrenderchecker.h"

‎tests/src/python/test_qgssymbollayerutils.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
import qgis # NOQA
1616

17-
from qgis.core import QgsSymbolLayerUtils, QgsMarkerSymbol
17+
from qgis.core import (QgsSymbolLayerUtils,
18+
QgsMarkerSymbol,
19+
QgsArrowSymbolLayer)
1820
from qgis.PyQt.QtGui import QColor
1921
from qgis.PyQt.QtCore import QSizeF, QPointF
2022
from qgis.testing import unittest, start_app
@@ -52,6 +54,60 @@ def testEncodeDecodePoint(self):
5254
s2 = QgsSymbolLayerUtils.decodePoint('')
5355
self.assertEqual(s2, QPointF())
5456

57+
def testDecodeArrowHeadType(self):
58+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType(0)
59+
self.assertTrue(ok)
60+
self.assertEqual(type, QgsArrowSymbolLayer.HeadSingle)
61+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType('single')
62+
self.assertTrue(ok)
63+
self.assertEqual(type, QgsArrowSymbolLayer.HeadSingle)
64+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType(' SINGLE ')
65+
self.assertTrue(ok)
66+
self.assertEqual(type, QgsArrowSymbolLayer.HeadSingle)
67+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType(1)
68+
self.assertTrue(ok)
69+
self.assertEqual(type, QgsArrowSymbolLayer.HeadReversed)
70+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType('reversed')
71+
self.assertTrue(ok)
72+
self.assertEqual(type, QgsArrowSymbolLayer.HeadReversed)
73+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType(2)
74+
self.assertTrue(ok)
75+
self.assertEqual(type, QgsArrowSymbolLayer.HeadDouble)
76+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType('double')
77+
self.assertTrue(ok)
78+
self.assertEqual(type, QgsArrowSymbolLayer.HeadDouble)
79+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType('xxxxx')
80+
self.assertFalse(ok)
81+
type, ok = QgsSymbolLayerUtils.decodeArrowHeadType(34)
82+
self.assertFalse(ok)
83+
84+
def testDecodeArrowType(self):
85+
type, ok = QgsSymbolLayerUtils.decodeArrowType(0)
86+
self.assertTrue(ok)
87+
self.assertEqual(type, QgsArrowSymbolLayer.ArrowPlain)
88+
type, ok = QgsSymbolLayerUtils.decodeArrowType('plain')
89+
self.assertTrue(ok)
90+
self.assertEqual(type, QgsArrowSymbolLayer.ArrowPlain)
91+
type, ok = QgsSymbolLayerUtils.decodeArrowType(' PLAIN ')
92+
self.assertTrue(ok)
93+
self.assertEqual(type, QgsArrowSymbolLayer.ArrowPlain)
94+
type, ok = QgsSymbolLayerUtils.decodeArrowType(1)
95+
self.assertTrue(ok)
96+
self.assertEqual(type, QgsArrowSymbolLayer.ArrowLeftHalf)
97+
type, ok = QgsSymbolLayerUtils.decodeArrowType('lefthalf')
98+
self.assertTrue(ok)
99+
self.assertEqual(type, QgsArrowSymbolLayer.ArrowLeftHalf)
100+
type, ok = QgsSymbolLayerUtils.decodeArrowType(2)
101+
self.assertTrue(ok)
102+
self.assertEqual(type, QgsArrowSymbolLayer.ArrowRightHalf)
103+
type, ok = QgsSymbolLayerUtils.decodeArrowType('righthalf')
104+
self.assertTrue(ok)
105+
self.assertEqual(type, QgsArrowSymbolLayer.ArrowRightHalf)
106+
type, ok = QgsSymbolLayerUtils.decodeArrowType('xxxxx')
107+
self.assertFalse(ok)
108+
type, ok = QgsSymbolLayerUtils.decodeArrowType(34)
109+
self.assertFalse(ok)
110+
55111
def testSymbolToFromMimeData(self):
56112
"""
57113
Test converting symbols to and from mime data

0 commit comments

Comments
 (0)