Skip to content

Commit fcbff6a

Browse files
committedOct 31, 2013
Merge pull request #923 from nyalldawson/gradient_fill2
[FEATURE] Add support for gradient fills for polygons
2 parents ad27dfe + 864df0f commit fcbff6a

29 files changed

+2006
-4
lines changed
 

‎python/core/symbology-ng/qgsfillsymbollayerv2.sip

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,102 @@ class QgsSimpleFillSymbolLayerV2 : QgsFillSymbolLayerV2
5959
QgsSymbolV2::OutputUnit outputUnit() const;
6060
};
6161

62+
class QgsGradientFillSymbolLayerV2 : QgsFillSymbolLayerV2
63+
{
64+
%TypeHeaderCode
65+
#include <qgsfillsymbollayerv2.h>
66+
%End
67+
68+
public:
69+
70+
enum GradientColorType
71+
{
72+
SimpleTwoColor,
73+
ColorRamp
74+
};
75+
76+
enum GradientType
77+
{
78+
Linear,
79+
Radial,
80+
Conical
81+
};
82+
83+
enum GradientCoordinateMode
84+
{
85+
Feature,
86+
Viewport
87+
};
88+
89+
enum GradientSpread
90+
{
91+
Pad,
92+
Reflect,
93+
Repeat
94+
};
95+
96+
QgsGradientFillSymbolLayerV2( QColor color = DEFAULT_SIMPLEFILL_COLOR,
97+
QColor color2 = Qt::white,
98+
GradientColorType gradientColorType = SimpleTwoColor,
99+
GradientType gradientType = Linear,
100+
GradientCoordinateMode coordinateMode = Feature,
101+
GradientSpread gradientSpread = Pad );
102+
103+
// static stuff
104+
105+
static QgsSymbolLayerV2* create( const QgsStringMap& properties = QgsStringMap() ) /Factory/;
106+
107+
// implemented from base classes
108+
109+
QString layerType() const;
110+
111+
void startRender( QgsSymbolV2RenderContext& context );
112+
113+
void stopRender( QgsSymbolV2RenderContext& context );
114+
115+
void renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, QgsSymbolV2RenderContext& context );
116+
117+
QgsStringMap properties() const;
118+
119+
QgsSymbolLayerV2* clone() const /Factory/;
120+
121+
//up to here
122+
123+
GradientType gradientType() const;
124+
void setGradientType( GradientType gradientType );
125+
126+
GradientColorType gradientColorType() const;
127+
void setGradientColorType( GradientColorType gradientColorType );
128+
129+
QgsVectorColorRampV2* colorRamp();
130+
void setColorRamp( QgsVectorColorRampV2* ramp );
131+
132+
QColor color2() const;
133+
void setColor2( QColor color2 );
134+
135+
GradientCoordinateMode coordinateMode() const;
136+
void setCoordinateMode( GradientCoordinateMode coordinateMode );
137+
138+
GradientSpread gradientSpread() const;
139+
void setGradientSpread( GradientSpread gradientSpread );
140+
141+
void setReferencePoint1( QPointF referencePoint );
142+
QPointF referencePoint1() const;
143+
144+
void setReferencePoint2( QPointF referencePoint );
145+
QPointF referencePoint2() const;
146+
147+
void setAngle( double angle );
148+
double angle() const;
149+
150+
void setOffset( QPointF offset );
151+
QPointF offset() const;
152+
153+
void setOffsetUnit( QgsSymbolV2::OutputUnit unit );
154+
QgsSymbolV2::OutputUnit offsetUnit() const;
155+
156+
};
157+
62158
/**Base class for polygon renderers generating texture images*/
63159
class QgsImageFillSymbolLayer: QgsFillSymbolLayerV2
64160
{

‎src/core/symbology-ng/qgsfillsymbollayerv2.cpp

Lines changed: 403 additions & 0 deletions
Large diffs are not rendered by default.

‎src/core/symbology-ng/qgsfillsymbollayerv2.h

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,141 @@ class CORE_EXPORT QgsSimpleFillSymbolLayerV2 : public QgsFillSymbolLayerV2
102102
void applyDataDefinedSymbology( QgsSymbolV2RenderContext& context, QBrush& brush, QPen& pen, QPen& selPen );
103103
};
104104

105+
class QgsVectorColorRampV2;
106+
107+
class CORE_EXPORT QgsGradientFillSymbolLayerV2 : public QgsFillSymbolLayerV2
108+
{
109+
public:
110+
111+
enum GradientColorType
112+
{
113+
SimpleTwoColor,
114+
ColorRamp
115+
};
116+
117+
enum GradientType
118+
{
119+
Linear,
120+
Radial,
121+
Conical
122+
};
123+
124+
enum GradientCoordinateMode
125+
{
126+
Feature,
127+
Viewport
128+
};
129+
130+
enum GradientSpread
131+
{
132+
Pad,
133+
Reflect,
134+
Repeat
135+
};
136+
137+
QgsGradientFillSymbolLayerV2( QColor color = DEFAULT_SIMPLEFILL_COLOR, QColor color2 = Qt::white,
138+
GradientColorType gradientColorType = SimpleTwoColor, GradientType gradientType = Linear,
139+
GradientCoordinateMode coordinateMode = Feature,
140+
GradientSpread gradientSpread = Pad
141+
);
142+
143+
virtual ~QgsGradientFillSymbolLayerV2();
144+
145+
// static stuff
146+
147+
static QgsSymbolLayerV2* create( const QgsStringMap& properties = QgsStringMap() );
148+
149+
// implemented from base classes
150+
151+
QString layerType() const;
152+
153+
void startRender( QgsSymbolV2RenderContext& context );
154+
155+
void stopRender( QgsSymbolV2RenderContext& context );
156+
157+
void renderPolygon( const QPolygonF& points, QList<QPolygonF>* rings, QgsSymbolV2RenderContext& context );
158+
159+
QgsStringMap properties() const;
160+
161+
QgsSymbolLayerV2* clone() const;
162+
163+
/**Type of gradient, eg linear or radial*/
164+
GradientType gradientType() const { return mGradientType; };
165+
void setGradientType( GradientType gradientType ) { mGradientType = gradientType; };
166+
167+
/**Gradient color mode, controls how gradient color stops are created*/
168+
GradientColorType gradientColorType() const { return mGradientColorType; };
169+
void setGradientColorType( GradientColorType gradientColorType ) { mGradientColorType = gradientColorType; };
170+
171+
/**Color ramp used for the gradient fill, only used if the gradient color type is set to ColorRamp*/
172+
QgsVectorColorRampV2* colorRamp() { return mGradientRamp; };
173+
void setColorRamp( QgsVectorColorRampV2* ramp );
174+
175+
/**Color for endpoint of gradient, only used if the gradient color type is set to SimpleTwoColor*/
176+
QColor color2() const { return mColor2; };
177+
void setColor2( QColor color2 ) { mColor2 = color2; };
178+
179+
/**Coordinate mode for gradient. Controls how the gradient stops are positioned.*/
180+
GradientCoordinateMode coordinateMode() const { return mCoordinateMode; };
181+
void setCoordinateMode( GradientCoordinateMode coordinateMode ) { mCoordinateMode = coordinateMode; };
182+
183+
/**Gradient spread mode. Controls how the gradient behaves outside of the predefined stops*/
184+
GradientSpread gradientSpread() const { return mGradientSpread; };
185+
void setGradientSpread( GradientSpread gradientSpread ) { mGradientSpread = gradientSpread; };
186+
187+
/**Starting point of gradient fill, in the range [0,0] - [1,1]*/
188+
void setReferencePoint1( QPointF referencePoint ) { mReferencePoint1 = referencePoint; };
189+
QPointF referencePoint1() const { return mReferencePoint1; };
190+
191+
/**End point of gradient fill, in the range [0,0] - [1,1]*/
192+
void setReferencePoint2( QPointF referencePoint ) { mReferencePoint2 = referencePoint; };
193+
QPointF referencePoint2() const { return mReferencePoint2; };
194+
195+
/**Rotation angle for gradient fill. Can be used to rotate a gradient around its centre point*/
196+
void setAngle( double angle ) { mAngle = angle; };
197+
double angle() const { return mAngle; };
198+
199+
/**Offset for gradient fill*/
200+
void setOffset( QPointF offset ) { mOffset = offset; };
201+
QPointF offset() const { return mOffset; };
202+
203+
/**Units for gradient fill offset*/
204+
void setOffsetUnit( QgsSymbolV2::OutputUnit unit ) { mOffsetUnit = unit; };
205+
QgsSymbolV2::OutputUnit offsetUnit() const { return mOffsetUnit; };
206+
207+
protected:
208+
QBrush mBrush;
209+
QBrush mSelBrush;
210+
211+
GradientColorType mGradientColorType;
212+
QColor mColor2;
213+
QgsVectorColorRampV2* mGradientRamp;
214+
GradientType mGradientType;
215+
GradientCoordinateMode mCoordinateMode;
216+
GradientSpread mGradientSpread;
217+
218+
QPointF mReferencePoint1;
219+
QPointF mReferencePoint2;
220+
double mAngle;
221+
222+
QPointF mOffset;
223+
QgsSymbolV2::OutputUnit mOffsetUnit;
224+
225+
private:
226+
227+
//helper functions for data defined symbology
228+
void applyDataDefinedSymbology( QgsSymbolV2RenderContext& context );
229+
230+
/**Applies the gradient to a brush*/
231+
void applyGradient( const QgsSymbolV2RenderContext& context, QBrush& brush, const QColor& color, const QColor& color2,
232+
const GradientColorType gradientColorType, QgsVectorColorRampV2 * gradientRamp, const GradientType gradientType,
233+
const GradientCoordinateMode coordinateMode, const GradientSpread gradientSpread, const QPointF referencePoint1,
234+
const QPointF referencePoint2, const double angle );
235+
236+
/**rotates a reference point by a specified angle around the point (0.5, 0.5)*/
237+
QPointF rotateReferencePoint( const QPointF & refPoint, double angle );
238+
};
239+
105240
/**Base class for polygon renderers generating texture images*/
106241
class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayerV2
107242
{

‎src/core/symbology-ng/qgssymbollayerv2registry.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ QgsSymbolLayerV2Registry::QgsSymbolLayerV2Registry()
4242

4343
addSymbolLayerType( new QgsSymbolLayerV2Metadata( "SimpleFill", QObject::tr( "Simple fill" ), QgsSymbolV2::Fill,
4444
QgsSimpleFillSymbolLayerV2::create, QgsSimpleFillSymbolLayerV2::createFromSld ) );
45+
addSymbolLayerType( new QgsSymbolLayerV2Metadata( "GradientFill", QObject::tr( "Gradient fill" ), QgsSymbolV2::Fill,
46+
QgsGradientFillSymbolLayerV2::create ) );
4547
addSymbolLayerType( new QgsSymbolLayerV2Metadata( "SVGFill", QObject::tr( "SVG fill" ), QgsSymbolV2::Fill,
4648
QgsSVGFillSymbolLayer::create, QgsSVGFillSymbolLayer::createFromSld ) );
4749
addSymbolLayerType( new QgsSymbolLayerV2Metadata( "CentroidFill", QObject::tr( "Centroid fill" ), QgsSymbolV2::Fill,

‎src/core/symbology-ng/qgsvectorcolorrampv2.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,20 @@ void QgsVectorGradientColorRampV2::convertToDiscrete( bool discrete )
219219
mDiscrete = discrete;
220220
}
221221

222+
void QgsVectorGradientColorRampV2::addStopsToGradient( QGradient* gradient )
223+
{
224+
//copy color ramp stops to a QGradient
225+
gradient->setColorAt( 0, mColor1 );
226+
gradient->setColorAt( 1, mColor2 );
227+
228+
for ( QgsGradientStopsList::const_iterator it = mStops.begin();
229+
it != mStops.end(); ++it )
230+
{
231+
gradient->setColorAt( it->offset , it->color );
232+
}
233+
}
234+
235+
222236
//////////////
223237

224238

‎src/core/symbology-ng/qgsvectorcolorrampv2.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#define QGSVECTORCOLORRAMPV2_H
1818

1919
#include <QColor>
20+
#include <QGradient>
2021

2122
#include "qgssymbollayerv2.h" // for QgsStringMap
2223
#include "qgslogger.h"
@@ -91,6 +92,10 @@ class CORE_EXPORT QgsVectorGradientColorRampV2 : public QgsVectorColorRampV2
9192
QgsStringMap info() const { return mInfo; }
9293
void setInfo( const QgsStringMap& info ) { mInfo = info; }
9394

95+
/**copy color ramp stops to a QGradient
96+
* @note added in 2.1 */
97+
void addStopsToGradient( QGradient* gradient );
98+
9499
protected:
95100
QColor mColor1, mColor2;
96101
bool mDiscrete;

‎src/gui/symbology-ng/qgscolorrampcombobox.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
QSize QgsColorRampComboBox::rampIconSize( 50, 16 );
2323

2424
QgsColorRampComboBox::QgsColorRampComboBox( QWidget *parent ) :
25-
QComboBox( parent ), mStyle( NULL ), mSourceColorRamp( NULL )
25+
QComboBox( parent ), mStyle( NULL ), mSourceColorRamp( NULL ), mShowGradientOnly( false )
2626
{
2727
}
2828

@@ -44,10 +44,13 @@ void QgsColorRampComboBox::populate( QgsStyleV2* style )
4444
for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
4545
{
4646
QgsVectorColorRampV2* ramp = style->colorRamp( *it );
47-
QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon( ramp, rampIconSize );
4847

49-
addItem( icon, *it );
48+
if ( !mShowGradientOnly || ramp->type() == "gradient" )
49+
{
50+
QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon( ramp, rampIconSize );
5051

52+
addItem( icon, *it );
53+
}
5154
delete ramp;
5255
}
5356

@@ -82,7 +85,15 @@ void QgsColorRampComboBox::colorRampChanged( int index )
8285
return;
8386

8487
// last item: "new color ramp..."
85-
QString rampName = QgsStyleV2ManagerDialog::addColorRampStatic( this, mStyle );
88+
QString rampName;
89+
if ( !mShowGradientOnly )
90+
{
91+
rampName = QgsStyleV2ManagerDialog::addColorRampStatic( this, mStyle );
92+
}
93+
else
94+
{
95+
rampName = QgsStyleV2ManagerDialog::addColorRampStatic( this, mStyle, "Gradient" );
96+
}
8697
if ( rampName.isEmpty() )
8798
return;
8899

‎src/gui/symbology-ng/qgscolorrampcombobox.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,18 @@ class GUI_EXPORT QgsColorRampComboBox : public QComboBox
3939

4040
static QSize rampIconSize;
4141

42+
void setShowGradientOnly( bool gradientOnly ) { mShowGradientOnly = gradientOnly; };
43+
4244
public slots:
4345
void colorRampChanged( int index );
4446

4547
protected:
4648
QgsStyleV2* mStyle;
4749
QgsVectorColorRampV2* mSourceColorRamp; // owns the copy
50+
51+
private:
52+
bool mShowGradientOnly;
53+
4854
};
4955

5056
#endif // QGSCOLORRAMPCOMBOBOX_H

‎src/gui/symbology-ng/qgsdatadefinedsymboldialog.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,20 @@ QString QgsDataDefinedSymbolDialog::verticalAnchorHelpText()
192192
{
193193
return tr( "'top'|'center'|'bottom'" );
194194
}
195+
196+
QString QgsDataDefinedSymbolDialog::gradientTypeHelpText()
197+
{
198+
return tr( "'linear'|'radial'|'conical'" );
199+
}
200+
201+
QString QgsDataDefinedSymbolDialog::gradientCoordModeHelpText()
202+
{
203+
return tr( "'feature'|'viewport'" );
204+
}
205+
206+
QString QgsDataDefinedSymbolDialog::gradientSpreadHelpText()
207+
{
208+
return tr( "'pad'|'repeat'|'reflect'" );
209+
}
210+
211+

‎src/gui/symbology-ng/qgsdatadefinedsymboldialog.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ class GUI_EXPORT QgsDataDefinedSymbolDialog: public QDialog, private Ui::QgsData
3535
static QString fileNameHelpText();
3636
static QString horizontalAnchorHelpText();
3737
static QString verticalAnchorHelpText();
38+
static QString gradientTypeHelpText();
39+
static QString gradientCoordModeHelpText();
40+
static QString gradientSpreadHelpText();
3841

3942
private slots:
4043
void expressionButtonClicked();

‎src/gui/symbology-ng/qgslayerpropertieswidget.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ static void _initWidgetFunctions()
6767
_initWidgetFunction( "VectorField", QgsVectorFieldSymbolLayerWidget::create );
6868

6969
_initWidgetFunction( "SimpleFill", QgsSimpleFillSymbolLayerV2Widget::create );
70+
_initWidgetFunction( "GradientFill", QgsGradientFillSymbolLayerV2Widget::create );
7071
_initWidgetFunction( "SVGFill", QgsSVGFillSymbolLayerWidget::create );
7172
_initWidgetFunction( "CentroidFill", QgsCentroidFillSymbolLayerV2Widget::create );
7273
_initWidgetFunction( "LinePatternFill", QgsLinePatternFillSymbolLayerWidget::create );

‎src/gui/symbology-ng/qgssymbollayerv2widget.cpp

Lines changed: 295 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,301 @@ void QgsSimpleFillSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
617617

618618
///////////
619619

620+
QgsGradientFillSymbolLayerV2Widget::QgsGradientFillSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
621+
: QgsSymbolLayerV2Widget( parent, vl )
622+
{
623+
mLayer = NULL;
624+
625+
setupUi( this );
626+
627+
cboGradientColorRamp->setShowGradientOnly( true );
628+
cboGradientColorRamp->populate( QgsStyleV2::defaultStyle() );
629+
630+
connect( btnChangeColor, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setColor( const QColor& ) ) );
631+
connect( btnChangeColor2, SIGNAL( colorChanged( const QColor& ) ), this, SLOT( setColor2( const QColor& ) ) );
632+
connect( cboGradientColorRamp, SIGNAL( currentIndexChanged( int ) ) , this, SLOT( applyColorRamp() ) );
633+
connect( cboGradientType, SIGNAL( currentIndexChanged( int ) ), this, SLOT( setGradientType( int ) ) );
634+
connect( cboCoordinateMode, SIGNAL( currentIndexChanged( int ) ), this, SLOT( setCoordinateMode( int ) ) );
635+
connect( cboGradientSpread, SIGNAL( currentIndexChanged( int ) ), this, SLOT( setGradientSpread( int ) ) );
636+
connect( radioTwoColor, SIGNAL( toggled( bool ) ), this, SLOT( colorModeChanged() ) );
637+
connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( offsetChanged() ) );
638+
connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( offsetChanged() ) );
639+
connect( spinRefPoint1X, SIGNAL( valueChanged( double ) ), this, SLOT( referencePointChanged() ) );
640+
connect( spinRefPoint1Y, SIGNAL( valueChanged( double ) ), this, SLOT( referencePointChanged() ) );
641+
connect( spinRefPoint2X, SIGNAL( valueChanged( double ) ), this, SLOT( referencePointChanged() ) );
642+
connect( spinRefPoint2Y, SIGNAL( valueChanged( double ) ), this, SLOT( referencePointChanged() ) );
643+
}
644+
645+
void QgsGradientFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
646+
{
647+
if ( layer->layerType() != "GradientFill" )
648+
return;
649+
650+
// layer type is correct, we can do the cast
651+
mLayer = static_cast<QgsGradientFillSymbolLayerV2*>( layer );
652+
653+
// set values
654+
btnChangeColor->setColor( mLayer->color() );
655+
btnChangeColor->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
656+
btnChangeColor2->setColor( mLayer->color2() );
657+
btnChangeColor2->setColorDialogOptions( QColorDialog::ShowAlphaChannel );
658+
659+
if ( mLayer->gradientColorType() == QgsGradientFillSymbolLayerV2::SimpleTwoColor )
660+
{
661+
radioTwoColor->setChecked( true );
662+
cboGradientColorRamp->setEnabled( false );
663+
}
664+
else
665+
{
666+
radioColorRamp->setChecked( true );
667+
btnChangeColor->setEnabled( false );
668+
btnChangeColor2->setEnabled( false );
669+
}
670+
671+
// set source color ramp
672+
if ( mLayer->colorRamp() )
673+
{
674+
cboGradientColorRamp->blockSignals( true );
675+
cboGradientColorRamp->setSourceColorRamp( mLayer->colorRamp() );
676+
cboGradientColorRamp->blockSignals( false );
677+
}
678+
679+
cboGradientType->blockSignals( true );
680+
switch ( mLayer->gradientType() )
681+
{
682+
case QgsGradientFillSymbolLayerV2::Linear:
683+
cboGradientType->setCurrentIndex( 0 );
684+
break;
685+
case QgsGradientFillSymbolLayerV2::Radial:
686+
cboGradientType->setCurrentIndex( 1 );
687+
break;
688+
case QgsGradientFillSymbolLayerV2::Conical:
689+
cboGradientType->setCurrentIndex( 2 );
690+
break;
691+
}
692+
cboGradientType->blockSignals( false );
693+
694+
cboCoordinateMode->blockSignals( true );
695+
switch ( mLayer->coordinateMode() )
696+
{
697+
case QgsGradientFillSymbolLayerV2::Viewport:
698+
cboCoordinateMode->setCurrentIndex( 1 );
699+
break;
700+
case QgsGradientFillSymbolLayerV2::Feature:
701+
default:
702+
cboCoordinateMode->setCurrentIndex( 0 );
703+
break;
704+
}
705+
cboCoordinateMode->blockSignals( false );
706+
707+
cboGradientSpread->blockSignals( true );
708+
switch ( mLayer->gradientSpread() )
709+
{
710+
case QgsGradientFillSymbolLayerV2::Pad:
711+
cboGradientSpread->setCurrentIndex( 0 );
712+
break;
713+
case QgsGradientFillSymbolLayerV2::Repeat:
714+
cboGradientSpread->setCurrentIndex( 1 );
715+
break;
716+
case QgsGradientFillSymbolLayerV2::Reflect:
717+
cboGradientSpread->setCurrentIndex( 2 );
718+
break;
719+
}
720+
cboGradientSpread->blockSignals( false );
721+
722+
spinRefPoint1X->blockSignals( true );
723+
spinRefPoint1X->setValue( mLayer->referencePoint1().x() );
724+
spinRefPoint1X->blockSignals( false );
725+
spinRefPoint1Y->blockSignals( true );
726+
spinRefPoint1Y->setValue( mLayer->referencePoint1().y() );
727+
spinRefPoint1Y->blockSignals( false );
728+
spinRefPoint2X->blockSignals( true );
729+
spinRefPoint2X->setValue( mLayer->referencePoint2().x() );
730+
spinRefPoint2X->blockSignals( false );
731+
spinRefPoint2Y->blockSignals( true );
732+
spinRefPoint2Y->setValue( mLayer->referencePoint2().y() );
733+
spinRefPoint2Y->blockSignals( false );
734+
735+
spinOffsetX->blockSignals( true );
736+
spinOffsetX->setValue( mLayer->offset().x() );
737+
spinOffsetX->blockSignals( false );
738+
spinOffsetY->blockSignals( true );
739+
spinOffsetY->setValue( mLayer->offset().y() );
740+
spinOffsetY->blockSignals( false );
741+
mSpinAngle->blockSignals( true );
742+
mSpinAngle->setValue( mLayer->angle() );
743+
mSpinAngle->blockSignals( false );
744+
745+
mOffsetUnitComboBox->blockSignals( true );
746+
mOffsetUnitComboBox->setCurrentIndex( mLayer->offsetUnit() );
747+
mOffsetUnitComboBox->blockSignals( false );
748+
}
749+
750+
QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2Widget::symbolLayer()
751+
{
752+
return mLayer;
753+
}
754+
755+
void QgsGradientFillSymbolLayerV2Widget::setColor( const QColor& color )
756+
{
757+
mLayer->setColor( color );
758+
emit changed();
759+
}
760+
761+
void QgsGradientFillSymbolLayerV2Widget::setColor2( const QColor& color )
762+
{
763+
mLayer->setColor2( color );
764+
emit changed();
765+
}
766+
767+
void QgsGradientFillSymbolLayerV2Widget::colorModeChanged()
768+
{
769+
if ( radioTwoColor->isChecked() )
770+
{
771+
mLayer->setGradientColorType( QgsGradientFillSymbolLayerV2::SimpleTwoColor );
772+
}
773+
else
774+
{
775+
mLayer->setGradientColorType( QgsGradientFillSymbolLayerV2::ColorRamp );
776+
}
777+
emit changed();
778+
}
779+
780+
void QgsGradientFillSymbolLayerV2Widget::applyColorRamp()
781+
{
782+
QgsVectorColorRampV2* ramp = cboGradientColorRamp->currentColorRamp();
783+
if ( ramp == NULL )
784+
return;
785+
786+
mLayer->setColorRamp( ramp );
787+
emit changed();
788+
}
789+
790+
void QgsGradientFillSymbolLayerV2Widget::setGradientType( int index )
791+
{
792+
switch ( index )
793+
{
794+
case 0:
795+
mLayer->setGradientType( QgsGradientFillSymbolLayerV2::Linear );
796+
break;
797+
case 1:
798+
mLayer->setGradientType( QgsGradientFillSymbolLayerV2::Radial );
799+
break;
800+
case 2:
801+
mLayer->setGradientType( QgsGradientFillSymbolLayerV2::Conical );
802+
break;
803+
}
804+
emit changed();
805+
}
806+
807+
void QgsGradientFillSymbolLayerV2Widget::setCoordinateMode( int index )
808+
{
809+
810+
switch ( index )
811+
{
812+
case 0:
813+
mLayer->setCoordinateMode( QgsGradientFillSymbolLayerV2::Feature );
814+
break;
815+
case 1:
816+
mLayer->setCoordinateMode( QgsGradientFillSymbolLayerV2::Viewport );
817+
break;
818+
}
819+
820+
emit changed();
821+
}
822+
823+
void QgsGradientFillSymbolLayerV2Widget::setGradientSpread( int index )
824+
{
825+
switch ( index )
826+
{
827+
case 0:
828+
mLayer->setGradientSpread( QgsGradientFillSymbolLayerV2::Pad );
829+
break;
830+
case 1:
831+
mLayer->setGradientSpread( QgsGradientFillSymbolLayerV2::Repeat );
832+
break;
833+
case 2:
834+
mLayer->setGradientSpread( QgsGradientFillSymbolLayerV2::Reflect );
835+
break;
836+
}
837+
838+
emit changed();
839+
}
840+
841+
void QgsGradientFillSymbolLayerV2Widget::offsetChanged()
842+
{
843+
mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
844+
emit changed();
845+
}
846+
847+
void QgsGradientFillSymbolLayerV2Widget::referencePointChanged()
848+
{
849+
mLayer->setReferencePoint1( QPointF( spinRefPoint1X->value(), spinRefPoint1Y->value() ) );
850+
mLayer->setReferencePoint2( QPointF( spinRefPoint2X->value(), spinRefPoint2Y->value() ) );
851+
emit changed();
852+
}
853+
854+
void QgsGradientFillSymbolLayerV2Widget::on_mSpinAngle_valueChanged( double value )
855+
{
856+
mLayer->setAngle( value );
857+
emit changed();
858+
}
859+
860+
void QgsGradientFillSymbolLayerV2Widget::on_mOffsetUnitComboBox_currentIndexChanged( int index )
861+
{
862+
if ( mLayer )
863+
{
864+
mLayer->setOffsetUnit(( QgsSymbolV2::OutputUnit ) index );
865+
emit changed();
866+
}
867+
}
868+
869+
void QgsGradientFillSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
870+
{
871+
if ( !mLayer )
872+
{
873+
return;
874+
}
875+
876+
QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
877+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "color", tr( "Color" ), mLayer->dataDefinedPropertyString( "color" ), QgsDataDefinedSymbolDialog::colorHelpText() );
878+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "color2", tr( "Color 2" ), mLayer->dataDefinedPropertyString( "color2" ), QgsDataDefinedSymbolDialog::colorHelpText() );
879+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "angle", tr( "Angle" ), mLayer->dataDefinedPropertyString( "angle" ),
880+
QgsDataDefinedSymbolDialog::doubleHelpText() );
881+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "gradient_type", tr( "Gradient type" ), mLayer->dataDefinedPropertyString( "gradient_type" ), QgsDataDefinedSymbolDialog::gradientTypeHelpText() );
882+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "coordinate_mode", tr( "Coordinate mode" ), mLayer->dataDefinedPropertyString( "coordinate_mode" ), QgsDataDefinedSymbolDialog::gradientCoordModeHelpText() );
883+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "spread", tr( "Spread" ), mLayer->dataDefinedPropertyString( "spread" ),
884+
QgsDataDefinedSymbolDialog::gradientSpreadHelpText() );
885+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference1_x", tr( "Reference Point 1 (x)" ), mLayer->dataDefinedPropertyString( "reference1_x" ),
886+
QgsDataDefinedSymbolDialog::doubleHelpText() );
887+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference1_y", tr( "Reference Point 1 (y)" ), mLayer->dataDefinedPropertyString( "reference1_y" ),
888+
QgsDataDefinedSymbolDialog::doubleHelpText() );
889+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference2_x", tr( "Reference Point 2 (x)" ), mLayer->dataDefinedPropertyString( "reference2_x" ),
890+
QgsDataDefinedSymbolDialog::doubleHelpText() );
891+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference2_y", tr( "Reference Point 2 (y)" ), mLayer->dataDefinedPropertyString( "reference2_y" ),
892+
QgsDataDefinedSymbolDialog::doubleHelpText() );
893+
894+
QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
895+
if ( d.exec() == QDialog::Accepted )
896+
{
897+
//empty all existing properties first
898+
mLayer->removeDataDefinedProperties();
899+
900+
QMap<QString, QString> properties = d.dataDefinedProperties();
901+
QMap<QString, QString>::const_iterator it = properties.constBegin();
902+
for ( ; it != properties.constEnd(); ++it )
903+
{
904+
if ( !it.value().isEmpty() )
905+
{
906+
mLayer->setDataDefinedProperty( it.key(), it.value() );
907+
}
908+
}
909+
emit changed();
910+
}
911+
}
912+
913+
///////////
914+
620915
QgsMarkerLineSymbolLayerV2Widget::QgsMarkerLineSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent )
621916
: QgsSymbolLayerV2Widget( parent, vl )
622917
{

‎src/gui/symbology-ng/qgssymbollayerv2widget.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,44 @@ class GUI_EXPORT QgsSimpleFillSymbolLayerV2Widget : public QgsSymbolLayerV2Widge
152152
};
153153

154154

155+
///////////
156+
157+
#include "ui_widget_gradientfill.h"
158+
159+
class QgsGradientFillSymbolLayerV2;
160+
161+
class GUI_EXPORT QgsGradientFillSymbolLayerV2Widget : public QgsSymbolLayerV2Widget, private Ui::WidgetGradientFill
162+
{
163+
Q_OBJECT
164+
165+
public:
166+
QgsGradientFillSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent = NULL );
167+
168+
static QgsSymbolLayerV2Widget* create( const QgsVectorLayer* vl ) { return new QgsGradientFillSymbolLayerV2Widget( vl ); }
169+
170+
// from base class
171+
virtual void setSymbolLayer( QgsSymbolLayerV2* layer );
172+
virtual QgsSymbolLayerV2* symbolLayer();
173+
174+
public slots:
175+
void setColor( const QColor& color );
176+
void setColor2( const QColor& color );
177+
void applyColorRamp();
178+
void setGradientType( int index );
179+
void setCoordinateMode( int index );
180+
void setGradientSpread( int index );
181+
void offsetChanged();
182+
void referencePointChanged();
183+
void on_mOffsetUnitComboBox_currentIndexChanged( int index );
184+
void on_mDataDefinedPropertiesButton_clicked();
185+
void colorModeChanged();
186+
void on_mSpinAngle_valueChanged( double value );
187+
188+
protected:
189+
QgsGradientFillSymbolLayerV2* mLayer;
190+
};
191+
192+
155193
///////////
156194

157195
#include "ui_widget_markerline.h"

‎src/ui/symbollayer/widget_gradientfill.ui

Lines changed: 437 additions & 0 deletions
Large diffs are not rendered by default.

‎tests/src/core/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,5 @@ ADD_QGIS_TEST(rectangletest testqgsrectangle.cpp)
112112
ADD_QGIS_TEST(composerscalebartest testqgscomposerscalebar.cpp )
113113
ADD_QGIS_TEST(ogcutilstest testqgsogcutils.cpp)
114114
ADD_QGIS_TEST(vectorlayercachetest testqgsvectorlayercache.cpp )
115+
ADD_QGIS_TEST(gradienttest testqgsgradients.cpp )
116+

‎tests/src/core/testqgsgradients.cpp

Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
1+
/***************************************************************************
2+
testqgsgradients.cpp
3+
--------------------------------------
4+
Date : 20 Jan 2008
5+
Copyright : (C) 2008 by Tim Sutton
6+
Email : tim @ linfiniti.com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
#include <QtTest>
16+
#include <QObject>
17+
#include <QString>
18+
#include <QStringList>
19+
#include <QObject>
20+
#include <QApplication>
21+
#include <QFileInfo>
22+
#include <QDir>
23+
#include <QDesktopServices>
24+
25+
#include <iostream>
26+
//qgis includes...
27+
#include <qgsmaprenderer.h>
28+
#include <qgsmaplayer.h>
29+
#include <qgsvectorlayer.h>
30+
#include <qgsapplication.h>
31+
#include <qgsproviderregistry.h>
32+
#include <qgsmaplayerregistry.h>
33+
#include <qgssymbolv2.h>
34+
#include <qgssinglesymbolrendererv2.h>
35+
#include <qgsfillsymbollayerv2.h>
36+
#include <qgsvectorcolorrampv2.h>
37+
//qgis test includes
38+
#include "qgsrenderchecker.h"
39+
40+
/** \ingroup UnitTests
41+
* This is a unit test for gradient fill types.
42+
*/
43+
class TestQgsGradients: public QObject
44+
{
45+
Q_OBJECT;
46+
private slots:
47+
void initTestCase();// will be called before the first testfunction is executed.
48+
void cleanupTestCase();// will be called after the last testfunction was executed.
49+
void init() {};// will be called before each testfunction is executed.
50+
void cleanup() {};// will be called after every testfunction.
51+
52+
void gradientSymbol();
53+
void gradientSymbolColors();
54+
void gradientSymbolRamp();
55+
void gradientSymbolRadial();
56+
void gradientSymbolConical();
57+
void gradientSymbolViewport();
58+
void gradientSymbolReferencePoints();
59+
void gradientSymbolReflectSpread();
60+
void gradientSymbolRepeatSpread();
61+
void gradientSymbolRotate();
62+
void gradientSymbolFromQml();
63+
private:
64+
bool mTestHasError;
65+
bool setQml( QString theType );
66+
bool imageCheck( QString theType );
67+
QgsMapRenderer * mpMapRenderer;
68+
QgsVectorLayer * mpPolysLayer;
69+
QgsGradientFillSymbolLayerV2* mGradientFill;
70+
QgsFillSymbolV2* mFillSymbol;
71+
QgsSingleSymbolRendererV2* mSymbolRenderer;
72+
QString mTestDataDir;
73+
QString mReport;
74+
};
75+
76+
77+
void TestQgsGradients::initTestCase()
78+
{
79+
mTestHasError = false;
80+
// init QGIS's paths - true means that all path will be inited from prefix
81+
QgsApplication::init();
82+
QgsApplication::initQgis();
83+
QgsApplication::showSettings();
84+
85+
//create some objects that will be used in all tests...
86+
QString myDataDir( TEST_DATA_DIR ); //defined in CmakeLists.txt
87+
mTestDataDir = myDataDir + QDir::separator();
88+
89+
//
90+
//create a poly layer that will be used in all tests...
91+
//
92+
QString myPolysFileName = mTestDataDir + "polys.shp";
93+
QFileInfo myPolyFileInfo( myPolysFileName );
94+
mpPolysLayer = new QgsVectorLayer( myPolyFileInfo.filePath(),
95+
myPolyFileInfo.completeBaseName(), "ogr" );
96+
// Register the layer with the registry
97+
QgsMapLayerRegistry::instance()->addMapLayers(
98+
QList<QgsMapLayer *>() << mpPolysLayer );
99+
100+
//setup gradient fill
101+
mGradientFill = new QgsGradientFillSymbolLayerV2();
102+
mFillSymbol = new QgsFillSymbolV2();
103+
mFillSymbol->changeSymbolLayer( 0, mGradientFill );
104+
mSymbolRenderer = new QgsSingleSymbolRendererV2( mFillSymbol );
105+
mpPolysLayer->setRendererV2( mSymbolRenderer );
106+
107+
// We only need maprender instead of mapcanvas
108+
// since maprender does not require a qui
109+
// and is more light weight
110+
//
111+
mpMapRenderer = new QgsMapRenderer();
112+
QStringList myLayers;
113+
myLayers << mpPolysLayer->id();
114+
mpMapRenderer->setLayerSet( myLayers );
115+
mReport += "<h1>Gradient Renderer Tests</h1>\n";
116+
117+
}
118+
void TestQgsGradients::cleanupTestCase()
119+
{
120+
QString myReportFile = QDir::tempPath() + QDir::separator() + "qgistest.html";
121+
QFile myFile( myReportFile );
122+
if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
123+
{
124+
QTextStream myQTextStream( &myFile );
125+
myQTextStream << mReport;
126+
myFile.close();
127+
}
128+
}
129+
130+
void TestQgsGradients::gradientSymbol()
131+
{
132+
mReport += "<h2>Gradient symbol renderer test</h2>\n";
133+
mGradientFill->setColor( QColor( "red" ) );
134+
mGradientFill->setColor2( QColor( "blue" ) );
135+
mGradientFill->setGradientType( QgsGradientFillSymbolLayerV2::Linear );
136+
mGradientFill->setGradientColorType( QgsGradientFillSymbolLayerV2::SimpleTwoColor );
137+
mGradientFill->setCoordinateMode( QgsGradientFillSymbolLayerV2::Feature );
138+
mGradientFill->setGradientSpread( QgsGradientFillSymbolLayerV2::Pad );
139+
mGradientFill->setReferencePoint1( QPointF( 0, 0 ) );
140+
mGradientFill->setReferencePoint2( QPointF( 1, 1 ) );
141+
QVERIFY( imageCheck( "gradient" ) );
142+
}
143+
144+
void TestQgsGradients::gradientSymbolColors()
145+
{
146+
mReport += "<h2>Gradient symbol renderer color test</h2>\n";
147+
mGradientFill->setColor( QColor( "green" ) );
148+
mGradientFill->setColor2( QColor( "white" ) );
149+
QVERIFY( imageCheck( "gradient_colors" ) );
150+
mGradientFill->setColor( QColor( "red" ) );
151+
mGradientFill->setColor2( QColor( "blue" ) );
152+
}
153+
154+
void TestQgsGradients::gradientSymbolRamp()
155+
{
156+
QgsVectorGradientColorRampV2* gradientRamp = new QgsVectorGradientColorRampV2( QColor( Qt::red ), QColor( Qt::blue ) );
157+
QgsGradientStopsList stops;
158+
stops.append( QgsGradientStop( 0.5, QColor( Qt::white ) ) );
159+
gradientRamp->setStops( stops );
160+
161+
mGradientFill->setColorRamp( gradientRamp );
162+
mGradientFill->setGradientColorType( QgsGradientFillSymbolLayerV2::ColorRamp );
163+
QVERIFY( imageCheck( "gradient_ramp" ) );
164+
mGradientFill->setGradientColorType( QgsGradientFillSymbolLayerV2::SimpleTwoColor );
165+
}
166+
167+
void TestQgsGradients::gradientSymbolRadial()
168+
{
169+
mReport += "<h2>Gradient symbol renderer radial test</h2>\n";
170+
mGradientFill->setGradientType( QgsGradientFillSymbolLayerV2::Radial );
171+
QVERIFY( imageCheck( "gradient_radial" ) );
172+
mGradientFill->setGradientType( QgsGradientFillSymbolLayerV2::Linear );
173+
}
174+
175+
void TestQgsGradients::gradientSymbolConical()
176+
{
177+
mReport += "<h2>Gradient symbol renderer conical test</h2>\n";
178+
mGradientFill->setGradientType( QgsGradientFillSymbolLayerV2::Conical );
179+
mGradientFill->setReferencePoint1( QPointF( 0.5, 0.5 ) );
180+
QVERIFY( imageCheck( "gradient_conical" ) );
181+
mGradientFill->setReferencePoint1( QPointF( 0, 0 ) );
182+
mGradientFill->setGradientType( QgsGradientFillSymbolLayerV2::Linear );
183+
}
184+
185+
void TestQgsGradients::gradientSymbolViewport()
186+
{
187+
mReport += "<h2>Gradient symbol renderer viewport test</h2>\n";
188+
mGradientFill->setCoordinateMode( QgsGradientFillSymbolLayerV2::Viewport );
189+
QVERIFY( imageCheck( "gradient_viewport" ) );
190+
mGradientFill->setCoordinateMode( QgsGradientFillSymbolLayerV2::Feature );
191+
}
192+
193+
void TestQgsGradients::gradientSymbolReferencePoints()
194+
{
195+
mReport += "<h2>Gradient symbol renderer reference points test</h2>\n";
196+
mGradientFill->setReferencePoint1( QPointF( 0.5, 0.4 ) );
197+
mGradientFill->setReferencePoint2( QPointF( 0, 0.2 ) );
198+
QVERIFY( imageCheck( "gradient_refpoints" ) );
199+
mGradientFill->setReferencePoint1( QPointF( 0, 0 ) );
200+
mGradientFill->setReferencePoint2( QPointF( 1, 1 ) );
201+
}
202+
203+
void TestQgsGradients::gradientSymbolReflectSpread()
204+
{
205+
mReport += "<h2>Gradient symbol renderer reflect spread test</h2>\n";
206+
mGradientFill->setReferencePoint2( QPointF( 0.5, 0.5 ) );
207+
mGradientFill->setGradientSpread( QgsGradientFillSymbolLayerV2::Reflect );
208+
QVERIFY( imageCheck( "gradient_reflect" ) );
209+
mGradientFill->setGradientSpread( QgsGradientFillSymbolLayerV2::Pad );
210+
mGradientFill->setReferencePoint2( QPointF( 1, 1 ) );
211+
}
212+
213+
void TestQgsGradients::gradientSymbolRepeatSpread()
214+
{
215+
mReport += "<h2>Gradient symbol renderer repeat spread test</h2>\n";
216+
mGradientFill->setReferencePoint2( QPointF( 0.5, 0.5 ) );
217+
mGradientFill->setGradientSpread( QgsGradientFillSymbolLayerV2::Repeat );
218+
QVERIFY( imageCheck( "gradient_repeat" ) );
219+
mGradientFill->setGradientSpread( QgsGradientFillSymbolLayerV2::Pad );
220+
mGradientFill->setReferencePoint2( QPointF( 1, 1 ) );
221+
}
222+
223+
void TestQgsGradients::gradientSymbolRotate()
224+
{
225+
mReport += "<h2>Gradient symbol renderer rotate test</h2>\n";
226+
mGradientFill->setAngle( 90 );
227+
QVERIFY( imageCheck( "gradient_rotate" ) );
228+
mGradientFill->setAngle( 0 );
229+
}
230+
231+
void TestQgsGradients::gradientSymbolFromQml()
232+
{
233+
mReport += "<h2>Gradient symbol from QML test</h2>\n";
234+
QVERIFY( setQml( "gradient" ) );
235+
QVERIFY( imageCheck( "gradient_from_qml" ) );
236+
}
237+
238+
239+
240+
//
241+
// Private helper functions not called directly by CTest
242+
//
243+
244+
bool TestQgsGradients::setQml( QString theType )
245+
{
246+
//load a qml style and apply to our layer
247+
//the style will correspond to the renderer
248+
//type we are testing
249+
QString myFileName = mTestDataDir + "polys_" + theType + "_symbol.qml";
250+
bool myStyleFlag = false;
251+
QString error = mpPolysLayer->loadNamedStyle( myFileName, myStyleFlag );
252+
if ( !myStyleFlag )
253+
{
254+
qDebug( "%s", error.toLocal8Bit().constData() );
255+
}
256+
return myStyleFlag;
257+
}
258+
259+
bool TestQgsGradients::imageCheck( QString theTestType )
260+
{
261+
//use the QgsRenderChecker test utility class to
262+
//ensure the rendered output matches our control image
263+
mpMapRenderer->setExtent( mpPolysLayer->extent() );
264+
QgsRenderChecker myChecker;
265+
myChecker.setControlName( "expected_" + theTestType );
266+
myChecker.setMapRenderer( mpMapRenderer );
267+
bool myResultFlag = myChecker.runTest( theTestType );
268+
mReport += myChecker.report();
269+
return myResultFlag;
270+
}
271+
272+
QTEST_MAIN( TestQgsGradients )
273+
#include "moc_testqgsgradients.cxx"

‎tests/src/python/test_qgssymbollayerv2.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@
2828
import qgis
2929
from PyQt4.QtCore import *
3030
from PyQt4.QtXml import QDomDocument
31+
from PyQt4.QtGui import QColor
3132

3233
from qgis.core import (
3334
QgsCentroidFillSymbolLayerV2,
3435
QgsEllipseSymbolLayerV2,
3536
QgsFillSymbolLayerV2,
3637
QgsFontMarkerSymbolLayerV2,
38+
QgsGradientFillSymbolLayerV2,
3739
QgsImageFillSymbolLayer,
3840
QgsLinePatternFillSymbolLayer,
3941
QgsLineSymbolLayerV2,
@@ -47,6 +49,8 @@
4749
QgsSvgMarkerSymbolLayerV2,
4850
QgsSymbolLayerV2,
4951
QgsVectorFieldSymbolLayer,
52+
QgsSymbolV2,
53+
QgsVectorGradientColorRampV2
5054
)
5155
from utilities import (unitTestDataPath,
5256
getQgisTestApp,
@@ -86,6 +90,14 @@ def testBinding(self):
8690
mMessage = 'Expected "%s" got "%s"' % (mExpectedType, mType)
8791
assert mExpectedType == mType, mMessage
8892

93+
try:
94+
mType = type(QgsGradientFillSymbolLayerV2)
95+
except:
96+
mType = None
97+
mExpectedType = pyqtWrapperType
98+
mMessage = 'Expected "%s" got "%s"' % (mExpectedType, mType)
99+
assert mExpectedType == mType, mMessage
100+
89101
try:
90102
mType = type(QgsImageFillSymbolLayer)
91103
except:
@@ -237,6 +249,76 @@ def testQgsSimpleFillSymbolLayerV2(self):
237249
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
238250
assert mExpectedValue == mValue, mMessage
239251

252+
def testQgsGradientFillSymbolLayerV2(self):
253+
'''Test setting and getting QgsGradientFillSymbolLayerV2 properties.
254+
'''
255+
mGradientLayer = QgsGradientFillSymbolLayerV2()
256+
257+
mExpectedValue = type(QgsGradientFillSymbolLayerV2())
258+
mValue = type(mGradientLayer)
259+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
260+
assert mExpectedValue == mValue, mMessage
261+
262+
mExpectedValue = QgsGradientFillSymbolLayerV2.Radial
263+
mGradientLayer.setGradientType( mExpectedValue )
264+
mValue = mGradientLayer.gradientType()
265+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
266+
assert mExpectedValue == mValue, mMessage
267+
268+
mExpectedValue = QgsGradientFillSymbolLayerV2.ColorRamp
269+
mGradientLayer.setGradientColorType( mExpectedValue )
270+
mValue = mGradientLayer.gradientColorType()
271+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
272+
assert mExpectedValue == mValue, mMessage
273+
274+
mExpectedValue = QColor('#55aaff')
275+
mGradientLayer.setColor2( mExpectedValue )
276+
mValue = mGradientLayer.color2()
277+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
278+
assert mExpectedValue == mValue, mMessage
279+
280+
mExpectedValue = QgsGradientFillSymbolLayerV2.Viewport
281+
mGradientLayer.setCoordinateMode( mExpectedValue )
282+
mValue = mGradientLayer.coordinateMode()
283+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
284+
assert mExpectedValue == mValue, mMessage
285+
286+
mExpectedValue = QgsGradientFillSymbolLayerV2.Reflect
287+
mGradientLayer.setGradientSpread( mExpectedValue )
288+
mValue = mGradientLayer.gradientSpread()
289+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
290+
assert mExpectedValue == mValue, mMessage
291+
292+
mExpectedValue = QPointF(0.5, 0.8)
293+
mGradientLayer.setReferencePoint1( mExpectedValue )
294+
mValue = mGradientLayer.referencePoint1()
295+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
296+
assert mExpectedValue == mValue, mMessage
297+
298+
mExpectedValue = QPointF(0.2, 0.4)
299+
mGradientLayer.setReferencePoint2( mExpectedValue )
300+
mValue = mGradientLayer.referencePoint2()
301+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
302+
assert mExpectedValue == mValue, mMessage
303+
304+
mExpectedValue = 90
305+
mGradientLayer.setAngle( mExpectedValue )
306+
mValue = mGradientLayer.angle()
307+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
308+
assert mExpectedValue == mValue, mMessage
309+
310+
mExpectedValue = QPointF(10, 20)
311+
mGradientLayer.setOffset( mExpectedValue )
312+
mValue = mGradientLayer.offset()
313+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
314+
assert mExpectedValue == mValue, mMessage
315+
316+
mExpectedValue = QgsSymbolV2.MapUnit
317+
mGradientLayer.setOffsetUnit( mExpectedValue )
318+
mValue = mGradientLayer.offsetUnit()
319+
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
320+
assert mExpectedValue == mValue, mMessage
321+
240322
def testQgsCentroidFillSymbolLayerV2(self):
241323
'''
242324
Create a new style from a .sld file and match test
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
2+
<qgis version="2.1.0-Master" minimumScale="1" maximumScale="1e+08" minLabelScale="1" maxLabelScale="1e+08" hasScaleBasedVisibilityFlag="0" scaleBasedLabelVisibilityFlag="0">
3+
<renderer-v2 symbollevels="0" type="singleSymbol">
4+
<symbols>
5+
<symbol alpha="1" type="fill" name="0">
6+
<layer pass="0" class="GradientFill" locked="0">
7+
<prop k="angle" v="0"/>
8+
<prop k="color1" v="0,0,255,255"/>
9+
<prop k="color2" v="0,255,0,255"/>
10+
<prop k="color_type" v="0"/>
11+
<prop k="coordinate_mode" v="0"/>
12+
<prop k="discrete" v="0"/>
13+
<prop k="gradient_color" v="52,60,170,255"/>
14+
<prop k="gradient_color2" v="0,170,0,255"/>
15+
<prop k="offset" v="0,0"/>
16+
<prop k="offset_unit" v="MM"/>
17+
<prop k="reference_point1" v="0,0"/>
18+
<prop k="reference_point2" v="1,1"/>
19+
<prop k="spread" v="0"/>
20+
<prop k="type" v="0"/>
21+
</layer>
22+
</symbol>
23+
</symbols>
24+
<rotation field=""/>
25+
<sizescale field="" scalemethod="area"/>
26+
</renderer-v2>
27+
<customproperties>
28+
<property key="labeling" value="pal"/>
29+
<property key="labeling/addDirectionSymbol" value="false"/>
30+
<property key="labeling/angleOffset" value="0"/>
31+
<property key="labeling/blendMode" value="0"/>
32+
<property key="labeling/bufferBlendMode" value="0"/>
33+
<property key="labeling/bufferColorA" value="255"/>
34+
<property key="labeling/bufferColorB" value="255"/>
35+
<property key="labeling/bufferColorG" value="255"/>
36+
<property key="labeling/bufferColorR" value="255"/>
37+
<property key="labeling/bufferDraw" value="false"/>
38+
<property key="labeling/bufferJoinStyle" value="64"/>
39+
<property key="labeling/bufferNoFill" value="false"/>
40+
<property key="labeling/bufferSize" value="1"/>
41+
<property key="labeling/bufferSizeInMapUnits" value="false"/>
42+
<property key="labeling/bufferTransp" value="0"/>
43+
<property key="labeling/centroidWhole" value="false"/>
44+
<property key="labeling/decimals" value="3"/>
45+
<property key="labeling/displayAll" value="false"/>
46+
<property key="labeling/dist" value="0"/>
47+
<property key="labeling/distInMapUnits" value="false"/>
48+
<property key="labeling/enabled" value="false"/>
49+
<property key="labeling/fieldName" value=""/>
50+
<property key="labeling/fontBold" value="true"/>
51+
<property key="labeling/fontCapitals" value="0"/>
52+
<property key="labeling/fontFamily" value="Ubuntu"/>
53+
<property key="labeling/fontItalic" value="true"/>
54+
<property key="labeling/fontLetterSpacing" value="0"/>
55+
<property key="labeling/fontLimitPixelSize" value="false"/>
56+
<property key="labeling/fontMaxPixelSize" value="10000"/>
57+
<property key="labeling/fontMinPixelSize" value="3"/>
58+
<property key="labeling/fontSize" value="11"/>
59+
<property key="labeling/fontSizeInMapUnits" value="false"/>
60+
<property key="labeling/fontStrikeout" value="false"/>
61+
<property key="labeling/fontUnderline" value="false"/>
62+
<property key="labeling/fontWeight" value="75"/>
63+
<property key="labeling/fontWordSpacing" value="0"/>
64+
<property key="labeling/formatNumbers" value="false"/>
65+
<property key="labeling/isExpression" value="false"/>
66+
<property key="labeling/labelOffsetInMapUnits" value="true"/>
67+
<property key="labeling/labelPerPart" value="false"/>
68+
<property key="labeling/leftDirectionSymbol" value="&lt;"/>
69+
<property key="labeling/limitNumLabels" value="false"/>
70+
<property key="labeling/maxCurvedCharAngleIn" value="20"/>
71+
<property key="labeling/maxCurvedCharAngleOut" value="-20"/>
72+
<property key="labeling/maxNumLabels" value="2000"/>
73+
<property key="labeling/mergeLines" value="false"/>
74+
<property key="labeling/minFeatureSize" value="0"/>
75+
<property key="labeling/multilineAlign" value="0"/>
76+
<property key="labeling/multilineHeight" value="1"/>
77+
<property key="labeling/namedStyle" value="Bold Italic"/>
78+
<property key="labeling/obstacle" value="true"/>
79+
<property key="labeling/placeDirectionSymbol" value="0"/>
80+
<property key="labeling/placement" value="0"/>
81+
<property key="labeling/placementFlags" value="0"/>
82+
<property key="labeling/plussign" value="false"/>
83+
<property key="labeling/preserveRotation" value="true"/>
84+
<property key="labeling/previewBkgrdColor" value="#ffffff"/>
85+
<property key="labeling/priority" value="5"/>
86+
<property key="labeling/quadOffset" value="4"/>
87+
<property key="labeling/reverseDirectionSymbol" value="false"/>
88+
<property key="labeling/rightDirectionSymbol" value=">"/>
89+
<property key="labeling/scaleMax" value="10000000"/>
90+
<property key="labeling/scaleMin" value="1"/>
91+
<property key="labeling/scaleVisibility" value="false"/>
92+
<property key="labeling/shadowBlendMode" value="6"/>
93+
<property key="labeling/shadowColorB" value="0"/>
94+
<property key="labeling/shadowColorG" value="0"/>
95+
<property key="labeling/shadowColorR" value="0"/>
96+
<property key="labeling/shadowDraw" value="false"/>
97+
<property key="labeling/shadowOffsetAngle" value="135"/>
98+
<property key="labeling/shadowOffsetDist" value="1"/>
99+
<property key="labeling/shadowOffsetGlobal" value="true"/>
100+
<property key="labeling/shadowOffsetUnits" value="1"/>
101+
<property key="labeling/shadowRadius" value="1.5"/>
102+
<property key="labeling/shadowRadiusAlphaOnly" value="false"/>
103+
<property key="labeling/shadowRadiusUnits" value="1"/>
104+
<property key="labeling/shadowScale" value="100"/>
105+
<property key="labeling/shadowTransparency" value="30"/>
106+
<property key="labeling/shadowUnder" value="0"/>
107+
<property key="labeling/shapeBlendMode" value="0"/>
108+
<property key="labeling/shapeBorderColorA" value="255"/>
109+
<property key="labeling/shapeBorderColorB" value="128"/>
110+
<property key="labeling/shapeBorderColorG" value="128"/>
111+
<property key="labeling/shapeBorderColorR" value="128"/>
112+
<property key="labeling/shapeBorderWidth" value="0"/>
113+
<property key="labeling/shapeBorderWidthUnits" value="1"/>
114+
<property key="labeling/shapeDraw" value="false"/>
115+
<property key="labeling/shapeFillColorA" value="255"/>
116+
<property key="labeling/shapeFillColorB" value="255"/>
117+
<property key="labeling/shapeFillColorG" value="255"/>
118+
<property key="labeling/shapeFillColorR" value="255"/>
119+
<property key="labeling/shapeJoinStyle" value="64"/>
120+
<property key="labeling/shapeOffsetUnits" value="1"/>
121+
<property key="labeling/shapeOffsetX" value="0"/>
122+
<property key="labeling/shapeOffsetY" value="0"/>
123+
<property key="labeling/shapeRadiiUnits" value="1"/>
124+
<property key="labeling/shapeRadiiX" value="0"/>
125+
<property key="labeling/shapeRadiiY" value="0"/>
126+
<property key="labeling/shapeRotation" value="0"/>
127+
<property key="labeling/shapeRotationType" value="0"/>
128+
<property key="labeling/shapeSVGFile" value=""/>
129+
<property key="labeling/shapeSizeType" value="0"/>
130+
<property key="labeling/shapeSizeUnits" value="1"/>
131+
<property key="labeling/shapeSizeX" value="0"/>
132+
<property key="labeling/shapeSizeY" value="0"/>
133+
<property key="labeling/shapeTransparency" value="0"/>
134+
<property key="labeling/shapeType" value="0"/>
135+
<property key="labeling/textColorA" value="255"/>
136+
<property key="labeling/textColorB" value="0"/>
137+
<property key="labeling/textColorG" value="0"/>
138+
<property key="labeling/textColorR" value="0"/>
139+
<property key="labeling/textTransp" value="0"/>
140+
<property key="labeling/upsidedownLabels" value="0"/>
141+
<property key="labeling/wrapChar" value=""/>
142+
<property key="labeling/xOffset" value="0"/>
143+
<property key="labeling/yOffset" value="0"/>
144+
</customproperties>
145+
<blendMode>0</blendMode>
146+
<featureBlendMode>0</featureBlendMode>
147+
<layerTransparency>0</layerTransparency>
148+
<displayfield>Name</displayfield>
149+
<label>0</label>
150+
<labelattributes>
151+
<label fieldname="" text="Label"/>
152+
<family fieldname="" name="Lucida Grande"/>
153+
<size fieldname="" units="pt" value="12"/>
154+
<bold fieldname="" on="0"/>
155+
<italic fieldname="" on="0"/>
156+
<underline fieldname="" on="0"/>
157+
<strikeout fieldname="" on="0"/>
158+
<color fieldname="" red="0" blue="0" green="0"/>
159+
<x fieldname=""/>
160+
<y fieldname=""/>
161+
<offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
162+
<angle fieldname="" value="0" auto="0"/>
163+
<alignment fieldname="" value="center"/>
164+
<buffercolor fieldname="" red="255" blue="255" green="255"/>
165+
<buffersize fieldname="" units="pt" value="1"/>
166+
<bufferenabled fieldname="" on=""/>
167+
<multilineenabled fieldname="" on=""/>
168+
<selectedonly on=""/>
169+
</labelattributes>
170+
<edittypes>
171+
<edittype labelontop="0" editable="1" type="0" name="Name"/>
172+
<edittype labelontop="0" editable="1" type="0" name="Value"/>
173+
</edittypes>
174+
<editform></editform>
175+
<editforminit></editforminit>
176+
<featformsuppress>0</featformsuppress>
177+
<annotationform></annotationform>
178+
<editorlayout>generatedlayout</editorlayout>
179+
<excludeAttributesWMS/>
180+
<excludeAttributesWFS/>
181+
<attributeactions/>
182+
</qgis>

0 commit comments

Comments
 (0)
Please sign in to comment.