36 changes: 36 additions & 0 deletions src/gui/symbology-ng/qgssymbollayerv2widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 )
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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() );
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -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 )
Expand Down
112 changes: 111 additions & 1 deletion src/ui/symbollayer/widget_gradientfill.ui
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>474</width>
<height>327</height>
<height>358</height>
</rect>
</property>
<property name="windowTitle">
Expand Down Expand Up @@ -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">
Expand Down Expand Up @@ -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">
Expand All @@ -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">
Expand Down Expand Up @@ -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">
Expand Down Expand Up @@ -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>
12 changes: 12 additions & 0 deletions tests/src/core/testqgsgradients.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class TestQgsGradients: public QObject
void gradientSymbolConical();
void gradientSymbolViewport();
void gradientSymbolReferencePoints();
void gradientSymbolCentroid();
void gradientSymbolReflectSpread();
void gradientSymbolRepeatSpread();
void gradientSymbolRotate();
Expand Down Expand Up @@ -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";
Expand Down
12 changes: 12 additions & 0 deletions tests/src/python/test_qgssymbollayerv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,12 +295,24 @@ def testQgsGradientFillSymbolLayerV2(self):
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()
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.