Skip to content

Commit dec8953

Browse files
committedSep 20, 2013
More data defined anchor points
1 parent 03cfba7 commit dec8953

File tree

6 files changed

+94
-5
lines changed

6 files changed

+94
-5
lines changed
 

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create( const QgsStringMap& prop
123123
{
124124
m->setDataDefinedProperty( "offset", props["offset_expression"] );
125125
}
126+
if ( props.contains( "horizontal_anchor_point_expression" ) )
127+
{
128+
m->setDataDefinedProperty( "horizontal_anchor_point", props[ "horizontal_anchor_point_expression" ] );
129+
}
130+
if ( props.contains( "vertical_anchor_point_expression" ) )
131+
{
132+
m->setDataDefinedProperty( "vertical_anchor_point", props[ "vertical_anchor_point_expression" ] );
133+
}
126134
return m;
127135
}
128136

@@ -818,6 +826,14 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::create( const QgsStringMap& props )
818826
{
819827
m->setDataDefinedProperty( "outline", props["outline_expression"] );
820828
}
829+
if ( props.contains( "horizontal_anchor_point_expression" ) )
830+
{
831+
m->setDataDefinedProperty( "horizontal_anchor_point", props[ "horizontal_anchor_point_expression" ] );
832+
}
833+
if ( props.contains( "vertical_anchor_point_expression" ) )
834+
{
835+
m->setDataDefinedProperty( "vertical_anchor_point", props[ "vertical_anchor_point_expression" ] );
836+
}
821837
return m;
822838
}
823839

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

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,28 +192,41 @@ void QgsMarkerSymbolLayerV2::markerOffset( QgsSymbolV2RenderContext& context, do
192192
offsetX *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit );
193193
offsetY *= QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mOffsetUnit );
194194

195+
HorizontalAnchorPoint horizontalAnchorPoint = mHorizontalAnchorPoint;
196+
VerticalAnchorPoint verticalAnchorPoint = mVerticalAnchorPoint;
197+
QgsExpression* horizontalAnchorExpression = expression( "horizontal_anchor_point" );
198+
if ( horizontalAnchorExpression )
199+
{
200+
horizontalAnchorPoint = decodeHorizontalAnchorPoint( horizontalAnchorExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toString() );
201+
}
202+
QgsExpression* verticalAnchorExpression = expression( "vertical_anchor_point" );
203+
if ( verticalAnchorExpression )
204+
{
205+
verticalAnchorPoint = decodeVerticalAnchorPoint( verticalAnchorExpression->evaluate( const_cast<QgsFeature*>( context.feature() ) ).toString() );
206+
}
207+
195208
//correct horizontal position according to anchor point
196-
if ( mHorizontalAnchorPoint == HCenter && mVerticalAnchorPoint == VCenter )
209+
if ( horizontalAnchorPoint == HCenter && verticalAnchorPoint == VCenter )
197210
{
198211
return;
199212
}
200213

201214
double anchorPointCorrection = mSize * QgsSymbolLayerV2Utils::lineWidthScaleFactor( context.renderContext(), mSizeUnit ) / 2.0;
202-
if ( mHorizontalAnchorPoint == Left )
215+
if ( horizontalAnchorPoint == Left )
203216
{
204217
offsetX += anchorPointCorrection;
205218
}
206-
else if ( mHorizontalAnchorPoint == Right )
219+
else if ( horizontalAnchorPoint == Right )
207220
{
208221
offsetX -= anchorPointCorrection;
209222
}
210223

211224
//correct vertical position according to anchor point
212-
if ( mVerticalAnchorPoint == Top )
225+
if ( verticalAnchorPoint == Top )
213226
{
214227
offsetY += anchorPointCorrection;
215228
}
216-
else if ( mVerticalAnchorPoint == Bottom )
229+
else if ( verticalAnchorPoint == Bottom )
217230
{
218231
offsetY -= anchorPointCorrection;
219232
}
@@ -226,6 +239,38 @@ QPointF QgsMarkerSymbolLayerV2::_rotatedOffset( const QPointF& offset, double an
226239
return QPointF( offset.x() * c - offset.y() * s, offset.x() * s + offset.y() * c );
227240
}
228241

242+
QgsMarkerSymbolLayerV2::HorizontalAnchorPoint QgsMarkerSymbolLayerV2::decodeHorizontalAnchorPoint( const QString& str )
243+
{
244+
if ( str.compare( "left", Qt::CaseInsensitive ) == 0 )
245+
{
246+
return QgsMarkerSymbolLayerV2::Left;
247+
}
248+
else if ( str.compare( "right", Qt::CaseInsensitive ) == 0 )
249+
{
250+
return QgsMarkerSymbolLayerV2::Right;
251+
}
252+
else
253+
{
254+
return QgsMarkerSymbolLayerV2::HCenter;
255+
}
256+
}
257+
258+
QgsMarkerSymbolLayerV2::VerticalAnchorPoint QgsMarkerSymbolLayerV2::decodeVerticalAnchorPoint( const QString& str )
259+
{
260+
if ( str.compare( "top", Qt::CaseInsensitive ) == 0 )
261+
{
262+
return QgsMarkerSymbolLayerV2::Top;
263+
}
264+
else if ( str.compare( "bottom", Qt::CaseInsensitive ) == 0 )
265+
{
266+
return QgsMarkerSymbolLayerV2::Bottom;
267+
}
268+
else
269+
{
270+
return QgsMarkerSymbolLayerV2::VCenter;
271+
}
272+
}
273+
229274
QgsSymbolV2::OutputUnit QgsMarkerSymbolLayerV2::outputUnit() const
230275
{
231276
QgsSymbolV2::OutputUnit unit = mSizeUnit;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,10 @@ class CORE_EXPORT QgsMarkerSymbolLayerV2 : public QgsSymbolLayerV2
186186
QgsSymbolV2::ScaleMethod mScaleMethod;
187187
HorizontalAnchorPoint mHorizontalAnchorPoint;
188188
VerticalAnchorPoint mVerticalAnchorPoint;
189+
190+
private:
191+
static QgsMarkerSymbolLayerV2::HorizontalAnchorPoint decodeHorizontalAnchorPoint( const QString& str );
192+
static QgsMarkerSymbolLayerV2::VerticalAnchorPoint decodeVerticalAnchorPoint( const QString& str );
189193
};
190194

191195
class CORE_EXPORT QgsLineSymbolLayerV2 : public QgsSymbolLayerV2

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,13 @@ QString QgsDataDefinedSymbolDialog::fileNameHelpText()
182182
{
183183
return tr( "'<filename>'" );
184184
}
185+
186+
QString QgsDataDefinedSymbolDialog::horizontalAnchorHelpText()
187+
{
188+
return tr( "'left'|'hcenter'|'right'" );
189+
}
190+
191+
QString QgsDataDefinedSymbolDialog::verticalAnchorHelpText()
192+
{
193+
return tr( "'top'|'vcenter'|'bottom'" );
194+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ class GUI_EXPORT QgsDataDefinedSymbolDialog: public QDialog, private Ui::QgsData
3333
static QString colorHelpText();
3434
static QString offsetHelpText();
3535
static QString fileNameHelpText();
36+
static QString horizontalAnchorHelpText();
37+
static QString verticalAnchorHelpText();
3638

3739
private slots:
3840
void expressionButtonClicked();

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,10 @@ void QgsSimpleMarkerSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked
429429
QgsDataDefinedSymbolDialog::doubleHelpText() );
430430
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "offset", tr( "Offset" ), mLayer->dataDefinedPropertyString( "offset" ),
431431
QgsDataDefinedSymbolDialog::offsetHelpText() );
432+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "horizontal_anchor_point", tr( "Horizontal anchor point" ), mLayer->dataDefinedPropertyString( "horizontal_anchor_point" ),
433+
QgsDataDefinedSymbolDialog::horizontalAnchorHelpText() );
434+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "vertical_anchor_point", tr( "Vertical anchor point" ), mLayer->dataDefinedPropertyString( "vertical_anchor_point" ),
435+
QgsDataDefinedSymbolDialog::verticalAnchorHelpText() );
432436
QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
433437
if ( d.exec() == QDialog::Accepted )
434438
{
@@ -588,6 +592,10 @@ void QgsSimpleFillSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
588592
QgsDataDefinedSymbolDialog::colorHelpText() );
589593
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "width_border", tr( "Border width" ), mLayer->dataDefinedPropertyString( "width_border" ),
590594
QgsDataDefinedSymbolDialog::doubleHelpText() );
595+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "horizontal_anchor_point", tr( "Horizontal anchor point" ), mLayer->dataDefinedPropertyString( "horizontal_anchor_point" ),
596+
QgsDataDefinedSymbolDialog::horizontalAnchorHelpText() );
597+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "vertical_anchor_point", tr( "Vertical anchor point" ), mLayer->dataDefinedPropertyString( "vertical_anchor_point" ),
598+
QgsDataDefinedSymbolDialog::verticalAnchorHelpText() );
591599
QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
592600
if ( d.exec() == QDialog::Accepted )
593601
{
@@ -1185,6 +1193,10 @@ void QgsSvgMarkerSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
11851193
QgsDataDefinedSymbolDialog::colorHelpText() );
11861194
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "outline", tr( "Border color" ), mLayer->dataDefinedPropertyString( "outline" ),
11871195
QgsDataDefinedSymbolDialog::colorHelpText() );
1196+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "horizontal_anchor_point", tr( "Horizontal anchor point" ), mLayer->dataDefinedPropertyString( "horizontal_anchor_point" ),
1197+
QgsDataDefinedSymbolDialog::horizontalAnchorHelpText() );
1198+
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "vertical_anchor_point", tr( "Vertical anchor point" ), mLayer->dataDefinedPropertyString( "vertical_anchor_point" ),
1199+
QgsDataDefinedSymbolDialog::verticalAnchorHelpText() );
11881200
QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
11891201
if ( d.exec() == QDialog::Accepted )
11901202
{

0 commit comments

Comments
 (0)
Please sign in to comment.