[FEATURE] allow starting/ending a gradient at a features centroid

This commit is contained in:
nyalldawson 2013-11-03 20:31:52 +11:00
parent 8bdaf42dba
commit dfba26d9b0
13 changed files with 273 additions and 29 deletions

View File

@ -118,8 +118,6 @@ class QgsGradientFillSymbolLayerV2 : QgsFillSymbolLayerV2
QgsSymbolLayerV2* clone() const /Factory/;
//up to here
GradientType gradientType() const;
void setGradientType( GradientType gradientType );
@ -140,9 +138,15 @@ class QgsGradientFillSymbolLayerV2 : QgsFillSymbolLayerV2
void setReferencePoint1( QPointF referencePoint );
QPointF referencePoint1() const;
void setReferencePoint1IsCentroid( bool isCentroid );
bool referencePoint1IsCentroid() const;
void setReferencePoint2( QPointF referencePoint );
QPointF referencePoint2() const;
void setReferencePoint2IsCentroid( bool isCentroid );
bool referencePoint2IsCentroid() const;
void setAngle( double angle );
double angle() const;

View File

@ -294,7 +294,9 @@ QgsGradientFillSymbolLayerV2::QgsGradientFillSymbolLayerV2( QColor color, QColor
mCoordinateMode( coordinateMode ),
mGradientSpread( spread ),
mReferencePoint1( QPointF( 0, 0 ) ),
mReferencePoint1IsCentroid( false ),
mReferencePoint2( QPointF( 1, 1 ) ),
mReferencePoint2IsCentroid( false ),
mAngle( 0 ),
mOffsetUnit( QgsSymbolV2::MM )
{
@ -317,7 +319,9 @@ QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2::create( const QgsStringMap& prop
//default to gradient from the default fill color to white
QColor color = DEFAULT_SIMPLEFILL_COLOR, color2 = Qt::white;
QPointF referencePoint1 = QPointF( 0, 0 );
bool refPoint1IsCentroid = false;
QPointF referencePoint2 = QPointF( 1, 1 );
bool refPoint2IsCentroid = false;
double angle = 0;
QPointF offset;
@ -336,8 +340,12 @@ QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2::create( const QgsStringMap& prop
color2 = QgsSymbolLayerV2Utils::decodeColor( props["gradient_color2"] );
if ( props.contains( "reference_point1" ) )
referencePoint1 = QgsSymbolLayerV2Utils::decodePoint( props["reference_point1"] );
if ( props.contains( "reference_point1_iscentroid" ) )
refPoint1IsCentroid = props["reference_point1_iscentroid"].toInt();
if ( props.contains( "reference_point2" ) )
referencePoint2 = QgsSymbolLayerV2Utils::decodePoint( props["reference_point2"] );
if ( props.contains( "reference_point2_iscentroid" ) )
refPoint2IsCentroid = props["reference_point2_iscentroid"].toInt();
if ( props.contains( "angle" ) )
angle = props["angle"].toDouble();
if ( props.contains( "offset" ) )
@ -352,7 +360,9 @@ QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2::create( const QgsStringMap& prop
if ( props.contains( "offset_unit" ) )
sl->setOffsetUnit( QgsSymbolLayerV2Utils::decodeOutputUnit( props["offset_unit"] ) );
sl->setReferencePoint1( referencePoint1 );
sl->setReferencePoint1IsCentroid( refPoint1IsCentroid );
sl->setReferencePoint2( referencePoint2 );
sl->setReferencePoint2IsCentroid( refPoint2IsCentroid );
sl->setAngle( angle );
if ( gradientRamp )
sl->setColorRamp( gradientRamp );
@ -374,10 +384,14 @@ QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2::create( const QgsStringMap& prop
sl->setDataDefinedProperty( "reference1_x", props["reference1_x_expression"] );
if ( props.contains( "reference1_y_expression" ) )
sl->setDataDefinedProperty( "reference1_y", props["reference1_y_expression"] );
if ( props.contains( "reference1_iscentroid_expression" ) )
sl->setDataDefinedProperty( "reference1_iscentroid", props["reference1_iscentroid_expression"] );
if ( props.contains( "reference2_x_expression" ) )
sl->setDataDefinedProperty( "reference2_x", props["reference2_x_expression"] );
if ( props.contains( "reference2_y_expression" ) )
sl->setDataDefinedProperty( "reference2_y", props["reference2_y_expression"] );
if ( props.contains( "reference2_iscentroid_expression" ) )
sl->setDataDefinedProperty( "reference2_iscentroid", props["reference2_iscentroid_expression"] );
return sl;
}
@ -393,7 +407,7 @@ QString QgsGradientFillSymbolLayerV2::layerType() const
return "GradientFill";
}
void QgsGradientFillSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderContext& context )
void QgsGradientFillSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderContext& context, const QPolygonF& points )
{
//first gradient color
QgsExpression* colorExpression = expression( "color" );
@ -493,6 +507,10 @@ void QgsGradientFillSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderC
double refPoint1Y = mReferencePoint1.y();
if ( ref1YExpression )
refPoint1Y = ref1YExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble();
QgsExpression* ref1IsCentroidExpression = expression( "reference1_iscentroid" );
bool refPoint1IsCentroid = mReferencePoint1IsCentroid;
if ( ref1IsCentroidExpression )
refPoint1IsCentroid = ref1IsCentroidExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toBool();
//reference point 2 x & y
QgsExpression* ref2XExpression = expression( "reference2_x" );
@ -503,6 +521,31 @@ void QgsGradientFillSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderC
double refPoint2Y = mReferencePoint2.y();
if ( ref2YExpression )
refPoint2Y = ref2YExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toDouble();
QgsExpression* ref2IsCentroidExpression = expression( "reference2_iscentroid" );
bool refPoint2IsCentroid = mReferencePoint2IsCentroid;
if ( ref2IsCentroidExpression )
refPoint2IsCentroid = ref2IsCentroidExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toBool();
if ( refPoint1IsCentroid || refPoint2IsCentroid )
{
//either the gradient is starting or ending at a centroid, so calculate it
QPointF centroid = QgsSymbolLayerV2Utils::polygonCentroid( points );
//centroid coordinates need to be scaled to a range [0, 1] relative to polygon bounds
QRectF bbox = points.boundingRect();
double centroidX = ( centroid.x() - bbox.left() ) / bbox.width();
double centroidY = ( centroid.y() - bbox.top() ) / bbox.height();
if ( refPoint1IsCentroid )
{
refPoint1X = centroidX;
refPoint1Y = centroidY;
}
if ( refPoint2IsCentroid )
{
refPoint2X = centroidX;
refPoint2Y = centroidY;
}
}
//update gradient with data defined values
applyGradient( context, mBrush, color, color2, mGradientColorType, mGradientRamp, gradientType, coordinateMode,
@ -545,8 +588,8 @@ void QgsGradientFillSymbolLayerV2::applyGradient( const QgsSymbolV2RenderContext
fillColor2.setAlphaF( context.alpha() * fillColor2.alphaF() );
//rotate reference points
QPointF rotatedReferencePoint1 = rotateReferencePoint( referencePoint1, angle );
QPointF rotatedReferencePoint2 = rotateReferencePoint( referencePoint2, angle );
QPointF rotatedReferencePoint1 = angle != 0 ? rotateReferencePoint( referencePoint1, angle ) : referencePoint1;
QPointF rotatedReferencePoint2 = angle != 0 ? rotateReferencePoint( referencePoint2, angle ) : referencePoint2;
//create a QGradient with the desired properties
QGradient gradient;
@ -604,14 +647,11 @@ void QgsGradientFillSymbolLayerV2::applyGradient( const QgsSymbolV2RenderContext
void QgsGradientFillSymbolLayerV2::startRender( QgsSymbolV2RenderContext& context )
{
//update mBrush to use a gradient fill with specified properties
applyGradient( context, mBrush, mColor, mColor2, mGradientColorType, mGradientRamp, mGradientType, mCoordinateMode,
mGradientSpread, mReferencePoint1, mReferencePoint2, mAngle );
QColor selColor = context.renderContext().selectionColor();
if ( ! selectionIsOpaque ) selColor.setAlphaF( context.alpha() );
mSelBrush = QBrush( selColor );
//update mBrush to use a gradient fill with specified properties
prepareExpressions( context.layer() );
}
@ -629,7 +669,7 @@ void QgsGradientFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QList
}
QPen mSelPen;
applyDataDefinedSymbology( context );
applyDataDefinedSymbology( context, points );
p->setBrush( context.selected() ? mSelBrush : mBrush );
p->setPen( QPen( Qt::NoPen ) );
@ -660,7 +700,9 @@ QgsStringMap QgsGradientFillSymbolLayerV2::properties() const
map["coordinate_mode"] = QString::number( mCoordinateMode );
map["spread"] = QString::number( mGradientSpread );
map["reference_point1"] = QgsSymbolLayerV2Utils::encodePoint( mReferencePoint1 );
map["reference_point1_iscentroid"] = QString::number( mReferencePoint1IsCentroid );
map["reference_point2"] = QgsSymbolLayerV2Utils::encodePoint( mReferencePoint2 );
map["reference_point2_iscentroid"] = QString::number( mReferencePoint2IsCentroid );
map["angle"] = QString::number( mAngle );
map["offset"] = QgsSymbolLayerV2Utils::encodePoint( mOffset );
map["offset_unit"] = QgsSymbolLayerV2Utils::encodeOutputUnit( mOffsetUnit );
@ -678,7 +720,9 @@ QgsSymbolLayerV2* QgsGradientFillSymbolLayerV2::clone() const
if ( mGradientRamp )
sl->setColorRamp( mGradientRamp->clone() );
sl->setReferencePoint1( mReferencePoint1 );
sl->setReferencePoint1IsCentroid( mReferencePoint1IsCentroid );
sl->setReferencePoint2( mReferencePoint2 );
sl->setReferencePoint2IsCentroid( mReferencePoint2IsCentroid );
sl->setAngle( mAngle );
sl->setOffset( mOffset );
sl->setOffsetUnit( mOffsetUnit );
@ -2045,23 +2089,8 @@ void QgsCentroidFillSymbolLayerV2::renderPolygon( const QPolygonF& points, QList
{
Q_UNUSED( rings );
// calculate centroid
double cx = 0, cy = 0;
double area, sum = 0;
for ( int i = points.count() - 1, j = 0; j < points.count(); i = j++ )
{
const QPointF& p1 = points[i];
const QPointF& p2 = points[j];
area = p1.x() * p2.y() - p1.y() * p2.x();
sum += area;
cx += ( p1.x() + p2.x() ) * area;
cy += ( p1.y() + p2.y() ) * area;
}
sum *= 3.0;
cx /= sum;
cy /= sum;
mMarker->renderPoint( QPointF( cx, cy ), context.feature(), context.renderContext(), -1, context.selected() );
QPointF centroid = QgsSymbolLayerV2Utils::polygonCentroid( points );
mMarker->renderPoint( centroid, context.feature(), context.renderContext(), -1, context.selected() );
}
QgsStringMap QgsCentroidFillSymbolLayerV2::properties() const

View File

@ -188,10 +188,18 @@ class CORE_EXPORT QgsGradientFillSymbolLayerV2 : public QgsFillSymbolLayerV2
void setReferencePoint1( QPointF referencePoint ) { mReferencePoint1 = referencePoint; };
QPointF referencePoint1() const { return mReferencePoint1; };
/**Sets the starting point of the gradient to be the feature centroid*/
void setReferencePoint1IsCentroid( bool isCentroid ) { mReferencePoint1IsCentroid = isCentroid; };
bool referencePoint1IsCentroid() const { return mReferencePoint1IsCentroid; };
/**End point of gradient fill, in the range [0,0] - [1,1]*/
void setReferencePoint2( QPointF referencePoint ) { mReferencePoint2 = referencePoint; };
QPointF referencePoint2() const { return mReferencePoint2; };
/**Sets the end point of the gradient to be the feature centroid*/
void setReferencePoint2IsCentroid( bool isCentroid ) { mReferencePoint2IsCentroid = isCentroid; };
bool referencePoint2IsCentroid() const { return mReferencePoint2IsCentroid; };
/**Rotation angle for gradient fill. Can be used to rotate a gradient around its centre point*/
void setAngle( double angle ) { mAngle = angle; };
double angle() const { return mAngle; };
@ -216,7 +224,9 @@ class CORE_EXPORT QgsGradientFillSymbolLayerV2 : public QgsFillSymbolLayerV2
GradientSpread mGradientSpread;
QPointF mReferencePoint1;
bool mReferencePoint1IsCentroid;
QPointF mReferencePoint2;
bool mReferencePoint2IsCentroid;
double mAngle;
QPointF mOffset;
@ -225,7 +235,7 @@ class CORE_EXPORT QgsGradientFillSymbolLayerV2 : public QgsFillSymbolLayerV2
private:
//helper functions for data defined symbology
void applyDataDefinedSymbology( QgsSymbolV2RenderContext& context );
void applyDataDefinedSymbology( QgsSymbolV2RenderContext& context, const QPolygonF& points );
/**Applies the gradient to a brush*/
void applyGradient( const QgsSymbolV2RenderContext& context, QBrush& brush, const QColor& color, const QColor& color2,

View File

@ -2925,3 +2925,25 @@ QString QgsSymbolLayerV2Utils::symbolPathToName( QString path )
return QgsProject::instance()->writePath( path );
}
QPointF QgsSymbolLayerV2Utils::polygonCentroid( const QPolygonF& points )
{
//Calculate the centroid of points
double cx = 0, cy = 0;
double area, sum = 0;
for ( int i = points.count() - 1, j = 0; j < points.count(); i = j++ )
{
const QPointF& p1 = points[i];
const QPointF& p2 = points[j];
area = p1.x() * p2.y() - p1.y() * p2.x();
sum += area;
cx += ( p1.x() + p2.x() ) * area;
cy += ( p1.y() + p2.y() ) * area;
}
sum *= 3.0;
cx /= sum;
cy /= sum;
return QPointF( cx, cy );
}

View File

@ -243,6 +243,9 @@ class CORE_EXPORT QgsSymbolLayerV2Utils
//! Get symbols's name from its path
static QString symbolPathToName( QString path );
//! Calculate the centroid point of a QPolygonF
static QPointF polygonCentroid( const QPolygonF& points );
};
class QPolygonF;

View File

@ -208,4 +208,9 @@ QString QgsDataDefinedSymbolDialog::gradientSpreadHelpText()
return tr( "'pad'|'repeat'|'reflect'" );
}
QString QgsDataDefinedSymbolDialog::boolHelpText()
{
return tr( "0 (false)|1 (true)" );
}

View File

@ -38,6 +38,7 @@ class GUI_EXPORT QgsDataDefinedSymbolDialog: public QDialog, private Ui::QgsData
static QString gradientTypeHelpText();
static QString gradientCoordModeHelpText();
static QString gradientSpreadHelpText();
static QString boolHelpText();
private slots:
void expressionButtonClicked();

View File

@ -638,8 +638,10 @@ QgsGradientFillSymbolLayerV2Widget::QgsGradientFillSymbolLayerV2Widget( const Qg
connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( offsetChanged() ) );
connect( spinRefPoint1X, SIGNAL( valueChanged( double ) ), this, SLOT( referencePointChanged() ) );
connect( spinRefPoint1Y, SIGNAL( valueChanged( double ) ), this, SLOT( referencePointChanged() ) );
connect( checkRefPoint1Centroid, SIGNAL( toggled( bool ) ), this, SLOT( referencePointChanged() ) );
connect( spinRefPoint2X, SIGNAL( valueChanged( double ) ), this, SLOT( referencePointChanged() ) );
connect( spinRefPoint2Y, SIGNAL( valueChanged( double ) ), this, SLOT( referencePointChanged() ) );
connect( checkRefPoint2Centroid, SIGNAL( toggled( bool ) ), this, SLOT( referencePointChanged() ) );
}
void QgsGradientFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
@ -696,6 +698,8 @@ void QgsGradientFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer
{
case QgsGradientFillSymbolLayerV2::Viewport:
cboCoordinateMode->setCurrentIndex( 1 );
checkRefPoint1Centroid->setEnabled( false );
checkRefPoint2Centroid->setEnabled( false );
break;
case QgsGradientFillSymbolLayerV2::Feature:
default:
@ -725,12 +729,28 @@ void QgsGradientFillSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer
spinRefPoint1Y->blockSignals( true );
spinRefPoint1Y->setValue( mLayer->referencePoint1().y() );
spinRefPoint1Y->blockSignals( false );
checkRefPoint1Centroid->blockSignals( true );
checkRefPoint1Centroid->setChecked( mLayer->referencePoint1IsCentroid() );
if ( mLayer->referencePoint1IsCentroid() )
{
spinRefPoint1X->setEnabled( false );
spinRefPoint1Y->setEnabled( false );
}
checkRefPoint1Centroid->blockSignals( false );
spinRefPoint2X->blockSignals( true );
spinRefPoint2X->setValue( mLayer->referencePoint2().x() );
spinRefPoint2X->blockSignals( false );
spinRefPoint2Y->blockSignals( true );
spinRefPoint2Y->setValue( mLayer->referencePoint2().y() );
spinRefPoint2Y->blockSignals( false );
checkRefPoint2Centroid->blockSignals( true );
checkRefPoint2Centroid->setChecked( mLayer->referencePoint2IsCentroid() );
if ( mLayer->referencePoint2IsCentroid() )
{
spinRefPoint2X->setEnabled( false );
spinRefPoint2Y->setEnabled( false );
}
checkRefPoint2Centroid->blockSignals( false );
spinOffsetX->blockSignals( true );
spinOffsetX->setValue( mLayer->offset().x() );
@ -810,10 +830,20 @@ void QgsGradientFillSymbolLayerV2Widget::setCoordinateMode( int index )
switch ( index )
{
case 0:
//feature coordinate mode
mLayer->setCoordinateMode( QgsGradientFillSymbolLayerV2::Feature );
//allow choice of centroid reference positions
checkRefPoint1Centroid->setEnabled( true );
checkRefPoint2Centroid->setEnabled( true );
break;
case 1:
//viewport coordinate mode
mLayer->setCoordinateMode( QgsGradientFillSymbolLayerV2::Viewport );
//disable choice of centroid reference positions
checkRefPoint1Centroid->setChecked( Qt::Unchecked );
checkRefPoint1Centroid->setEnabled( false );
checkRefPoint2Centroid->setChecked( Qt::Unchecked );
checkRefPoint2Centroid->setEnabled( false );
break;
}
@ -847,7 +877,9 @@ void QgsGradientFillSymbolLayerV2Widget::offsetChanged()
void QgsGradientFillSymbolLayerV2Widget::referencePointChanged()
{
mLayer->setReferencePoint1( QPointF( spinRefPoint1X->value(), spinRefPoint1Y->value() ) );
mLayer->setReferencePoint1IsCentroid( checkRefPoint1Centroid->isChecked() );
mLayer->setReferencePoint2( QPointF( spinRefPoint2X->value(), spinRefPoint2Y->value() ) );
mLayer->setReferencePoint2IsCentroid( checkRefPoint2Centroid->isChecked() );
emit changed();
}
@ -886,10 +918,14 @@ void QgsGradientFillSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked
QgsDataDefinedSymbolDialog::doubleHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference1_y", tr( "Reference Point 1 (y)" ), mLayer->dataDefinedPropertyString( "reference1_y" ),
QgsDataDefinedSymbolDialog::doubleHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference1_iscentroid", tr( "Reference Point 1 (is centroid)" ), mLayer->dataDefinedPropertyString( "reference1_iscentroid" ),
QgsDataDefinedSymbolDialog::boolHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference2_x", tr( "Reference Point 2 (x)" ), mLayer->dataDefinedPropertyString( "reference2_x" ),
QgsDataDefinedSymbolDialog::doubleHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference2_y", tr( "Reference Point 2 (y)" ), mLayer->dataDefinedPropertyString( "reference2_y" ),
QgsDataDefinedSymbolDialog::doubleHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "reference2_iscentroid", tr( "Reference Point 2 (is centroid)" ), mLayer->dataDefinedPropertyString( "reference2_iscentroid" ),
QgsDataDefinedSymbolDialog::boolHelpText() );
QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
if ( d.exec() == QDialog::Accepted )

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>474</width>
<height>327</height>
<height>358</height>
</rect>
</property>
<property name="windowTitle">
@ -189,6 +189,9 @@
</item>
<item row="5" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing">
<number>12</number>
</property>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
@ -223,6 +226,26 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkRefPoint1Centroid">
<property name="text">
<string>Feature centroid</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="7" column="0">
@ -234,6 +257,9 @@
</item>
<item row="7" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<property name="spacing">
<number>12</number>
</property>
<item>
<widget class="QLabel" name="label_9">
<property name="text">
@ -274,6 +300,26 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkRefPoint2Centroid">
<property name="text">
<string>Feature centroid</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="9" column="0">
@ -433,5 +479,69 @@
</hint>
</hints>
</connection>
<connection>
<sender>checkRefPoint1Centroid</sender>
<signal>toggled(bool)</signal>
<receiver>spinRefPoint1X</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>400</x>
<y>187</y>
</hint>
<hint type="destinationlabel">
<x>204</x>
<y>188</y>
</hint>
</hints>
</connection>
<connection>
<sender>checkRefPoint1Centroid</sender>
<signal>toggled(bool)</signal>
<receiver>spinRefPoint1Y</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>400</x>
<y>187</y>
</hint>
<hint type="destinationlabel">
<x>293</x>
<y>188</y>
</hint>
</hints>
</connection>
<connection>
<sender>checkRefPoint2Centroid</sender>
<signal>toggled(bool)</signal>
<receiver>spinRefPoint2X</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>400</x>
<y>228</y>
</hint>
<hint type="destinationlabel">
<x>204</x>
<y>229</y>
</hint>
</hints>
</connection>
<connection>
<sender>checkRefPoint2Centroid</sender>
<signal>toggled(bool)</signal>
<receiver>spinRefPoint2Y</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>400</x>
<y>228</y>
</hint>
<hint type="destinationlabel">
<x>293</x>
<y>229</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -56,6 +56,7 @@ class TestQgsGradients: public QObject
void gradientSymbolConical();
void gradientSymbolViewport();
void gradientSymbolReferencePoints();
void gradientSymbolCentroid();
void gradientSymbolReflectSpread();
void gradientSymbolRepeatSpread();
void gradientSymbolRotate();
@ -200,6 +201,17 @@ void TestQgsGradients::gradientSymbolReferencePoints()
mGradientFill->setReferencePoint2( QPointF( 1, 1 ) );
}
void TestQgsGradients::gradientSymbolCentroid()
{
mReport += "<h2>Gradient symbol renderer centroid reference point test</h2>\n";
mGradientFill->setReferencePoint1IsCentroid( true );
QVERIFY( imageCheck( "gradient_ref1centroid" ) );
mGradientFill->setReferencePoint1IsCentroid( false );
mGradientFill->setReferencePoint2IsCentroid( true );
QVERIFY( imageCheck( "gradient_ref2centroid" ) );
mGradientFill->setReferencePoint2IsCentroid( false );
}
void TestQgsGradients::gradientSymbolReflectSpread()
{
mReport += "<h2>Gradient symbol renderer reflect spread test</h2>\n";

View File

@ -295,12 +295,24 @@ class TestQgsSymbolLayerV2(TestCase):
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
assert mExpectedValue == mValue, mMessage
mExpectedValue = True
mGradientLayer.setReferencePoint1IsCentroid( mExpectedValue )
mValue = mGradientLayer.referencePoint1IsCentroid()
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
assert mExpectedValue == mValue, mMessage
mExpectedValue = QPointF(0.2, 0.4)
mGradientLayer.setReferencePoint2( mExpectedValue )
mValue = mGradientLayer.referencePoint2()
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
assert mExpectedValue == mValue, mMessage
mExpectedValue = True
mGradientLayer.setReferencePoint2IsCentroid( mExpectedValue )
mValue = mGradientLayer.referencePoint2IsCentroid()
mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
assert mExpectedValue == mValue, mMessage
mExpectedValue = 90
mGradientLayer.setAngle( mExpectedValue )
mValue = mGradientLayer.angle()

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 KiB