Skip to content

Commit 276b81d

Browse files
author
wonder
committed
Added offset property (X,Y) also for marker symbol layers.
git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@10809 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 1188ebb commit 276b81d

File tree

8 files changed

+235
-100
lines changed

8 files changed

+235
-100
lines changed

src/core/symbology-ng/qgsmarkersymbollayerv2.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ QgsSimpleMarkerSymbolLayerV2::QgsSimpleMarkerSymbolLayerV2(QString name, QColor
2626
mBorderColor = borderColor;
2727
mSize = size;
2828
mAngle = angle;
29+
mOffset = QPointF(0,0);
2930
}
3031

3132
QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create(const QgsStringMap& props)
@@ -47,7 +48,10 @@ QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::create(const QgsStringMap& props
4748
if (props.contains("angle"))
4849
angle = props["angle"].toDouble();
4950

50-
return new QgsSimpleMarkerSymbolLayerV2(name, color, borderColor, size, angle);
51+
QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2(name, color, borderColor, size, angle);
52+
if (props.contains("offset"))
53+
m->setOffset( QgsSymbolLayerV2Utils::decodePoint(props["offset"]) );
54+
return m;
5155
}
5256

5357

@@ -184,7 +188,7 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint(const QPointF& point, QgsRenderCo
184188
//drawMarker(p);
185189
double s = mCache.width();
186190
//if (mCache.isValid())
187-
p->drawImage(point + QPointF(-s/2.0, -s/2.0), mCache);
191+
p->drawImage(point + QPointF(-s/2.0, -s/2.0) + mOffset, mCache);
188192

189193
//p->restore();
190194
}
@@ -198,12 +202,15 @@ QgsStringMap QgsSimpleMarkerSymbolLayerV2::properties() const
198202
map["color_border"] = QgsSymbolLayerV2Utils::encodeColor(mBorderColor);
199203
map["size"] = QString::number(mSize);
200204
map["angle"] = QString::number(mAngle);
205+
map["offset"] = QgsSymbolLayerV2Utils::encodePoint(mOffset);
201206
return map;
202207
}
203208

204209
QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2::clone() const
205210
{
206-
return new QgsSimpleMarkerSymbolLayerV2(mName, mColor, mBorderColor, mSize, mAngle);
211+
QgsSimpleMarkerSymbolLayerV2* m = new QgsSimpleMarkerSymbolLayerV2(mName, mColor, mBorderColor, mSize, mAngle);
212+
m->setOffset( mOffset );
213+
return m;
207214
}
208215

209216
void QgsSimpleMarkerSymbolLayerV2::drawMarker(QPainter* p)
@@ -244,6 +251,7 @@ QgsSvgMarkerSymbolLayerV2::QgsSvgMarkerSymbolLayerV2(QString name, double size,
244251
mName = name;
245252
mSize = size;
246253
mAngle = angle;
254+
mOffset = QPointF(0,0);
247255
}
248256

249257

@@ -260,7 +268,10 @@ QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::create(const QgsStringMap& props)
260268
if (props.contains("angle"))
261269
angle = props["angle"].toDouble();
262270

263-
return new QgsSvgMarkerSymbolLayerV2(name, size, angle);
271+
QgsSvgMarkerSymbolLayerV2* m = new QgsSvgMarkerSymbolLayerV2(name, size, angle);
272+
if (props.contains("offset"))
273+
m->setOffset( QgsSymbolLayerV2Utils::decodePoint(props["offset"]) );
274+
return m;
264275
}
265276

266277

@@ -288,15 +299,18 @@ void QgsSvgMarkerSymbolLayerV2::stopRender(QgsRenderContext& context)
288299
void QgsSvgMarkerSymbolLayerV2::renderPoint(const QPointF& point, QgsRenderContext& context)
289300
{
290301
QPainter* p = context.painter();
291-
p->translate(point);
302+
p->save();
303+
p->translate(point + mOffset);
304+
292305
if (mAngle != 0)
293306
p->rotate(mAngle);
294307

295308
p->drawPicture(0,0, mPicture);
296309

297310
if (mAngle != 0)
298311
p->rotate(-mAngle);
299-
p->translate(-point); // TODO: maybe save+restore is faster?
312+
313+
p->restore();
300314
}
301315

302316

@@ -306,10 +320,13 @@ QgsStringMap QgsSvgMarkerSymbolLayerV2::properties() const
306320
map["name"] = mName;
307321
map["size"] = QString::number(mSize);
308322
map["angle"] = QString::number(mAngle);
323+
map["offset"] = QgsSymbolLayerV2Utils::encodePoint(mOffset);
309324
return map;
310325
}
311326

312327
QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2::clone() const
313328
{
314-
return new QgsSvgMarkerSymbolLayerV2(mName, mSize, mAngle);
329+
QgsSvgMarkerSymbolLayerV2* m = new QgsSvgMarkerSymbolLayerV2(mName, mSize, mAngle);
330+
m->setOffset( mOffset );
331+
return m;
315332
}

src/core/symbology-ng/qgssymbollayerv2.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
#include <QMap>
66

77
#include <QColor>
8+
#include <QPointF>
89

910
#include "qgssymbolv2.h"
1011

1112
#include "qgssymbollayerv2utils.h" // QgsStringMap
1213

1314
class QPainter;
1415
class QSize;
15-
class QPointF;
1616
class QPolygonF;
1717

1818
class QgsRenderContext;
@@ -72,12 +72,16 @@ class QgsMarkerSymbolLayerV2 : public QgsSymbolLayerV2
7272

7373
void setSize(double size) { mSize = size; }
7474
double size() const { return mSize; }
75+
76+
void setOffset(QPointF offset) { mOffset = offset; }
77+
QPointF offset() { return mOffset; }
7578

7679
protected:
7780
QgsMarkerSymbolLayerV2(bool locked = false);
7881

7982
double mAngle;
8083
double mSize;
84+
QPointF mOffset;
8185
};
8286

8387
class QgsLineSymbolLayerV2 : public QgsSymbolLayerV2

src/core/symbology-ng/qgssymbollayerv2utils.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,18 @@ Qt::BrushStyle QgsSymbolLayerV2Utils::decodeBrushStyle(QString str)
8787
return Qt::SolidPattern;
8888
}
8989

90+
QString QgsSymbolLayerV2Utils::encodePoint(QPointF point)
91+
{
92+
return QString("%1,%2").arg(point.x()).arg(point.y());
93+
}
94+
95+
QPointF QgsSymbolLayerV2Utils::decodePoint(QString str)
96+
{
97+
QStringList lst = str.split(',');
98+
if (lst.count() != 2)
99+
return QPointF(0,0);
100+
return QPointF( lst[0].toDouble(), lst[1].toDouble() );
101+
}
90102

91103
QIcon QgsSymbolLayerV2Utils::symbolPreviewIcon(QgsSymbolV2* symbol, QSize size)
92104
{

src/core/symbology-ng/qgssymbollayerv2utils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class QgsVectorColorRampV2;
1515
class QColor;
1616
class QIcon;
1717
class QPixmap;
18+
class QPointF;
1819
class QSize;
1920

2021
class QgsSymbolLayerV2Utils
@@ -29,6 +30,9 @@ class QgsSymbolLayerV2Utils
2930

3031
static QString encodeBrushStyle(Qt::BrushStyle style);
3132
static Qt::BrushStyle decodeBrushStyle(QString str);
33+
34+
static QString encodePoint(QPointF point);
35+
static QPointF decodePoint(QString str);
3236

3337
static QIcon symbolPreviewIcon(QgsSymbolV2* symbol, QSize size);
3438
static QIcon symbolLayerPreviewIcon(QgsSymbolLayerV2* layer, QSize size);

src/gui/symbology-ng/qgssymbollayerv2widget.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ QgsSimpleMarkerSymbolLayerV2Widget::QgsSimpleMarkerSymbolLayerV2Widget(QWidget*
116116
connect(btnChangeColorFill, SIGNAL(clicked()), this, SLOT(setColorFill()));
117117
connect(spinSize, SIGNAL(valueChanged(int)), this, SLOT(setSize()));
118118
connect(spinAngle, SIGNAL(valueChanged(double)), this, SLOT(setAngle()));
119+
connect(spinOffsetX, SIGNAL(valueChanged(double)), this, SLOT(setOffset()));
120+
connect(spinOffsetY, SIGNAL(valueChanged(double)), this, SLOT(setOffset()));
119121
}
120122

121123
void QgsSimpleMarkerSymbolLayerV2Widget::setSymbolLayer(QgsSymbolLayerV2* layer)
@@ -140,6 +142,14 @@ void QgsSimpleMarkerSymbolLayerV2Widget::setSymbolLayer(QgsSymbolLayerV2* layer)
140142
updateColorButton(btnChangeColorFill, mLayer->color());
141143
spinSize->setValue(mLayer->size());
142144
spinAngle->setValue(mLayer->angle());
145+
146+
// without blocking signals the value gets changed because of slot setOffset()
147+
spinOffsetX->blockSignals(true);
148+
spinOffsetX->setValue(mLayer->offset().x());
149+
spinOffsetX->blockSignals(false);
150+
spinOffsetY->blockSignals(true);
151+
spinOffsetY->setValue(mLayer->offset().y());
152+
spinOffsetY->blockSignals(false);
143153
}
144154

145155
QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2Widget::symbolLayer()
@@ -185,6 +195,12 @@ void QgsSimpleMarkerSymbolLayerV2Widget::setAngle()
185195
emit changed();
186196
}
187197

198+
void QgsSimpleMarkerSymbolLayerV2Widget::setOffset()
199+
{
200+
mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
201+
emit changed();
202+
}
203+
188204

189205
///////////
190206

@@ -331,6 +347,8 @@ QgsSvgMarkerSymbolLayerV2Widget::QgsSvgMarkerSymbolLayerV2Widget(QWidget* parent
331347
connect(viewImages->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(setName(const QModelIndex&)));
332348
connect(spinSize, SIGNAL(valueChanged(int)), this, SLOT(setSize()));
333349
connect(spinAngle, SIGNAL(valueChanged(double)), this, SLOT(setAngle()));
350+
connect(spinOffsetX, SIGNAL(valueChanged(double)), this, SLOT(setOffset()));
351+
connect(spinOffsetY, SIGNAL(valueChanged(double)), this, SLOT(setOffset()));
334352
}
335353

336354
void QgsSvgMarkerSymbolLayerV2Widget::populateList()
@@ -395,6 +413,14 @@ void QgsSvgMarkerSymbolLayerV2Widget::setSymbolLayer(QgsSymbolLayerV2* layer)
395413

396414
spinSize->setValue(mLayer->size());
397415
spinAngle->setValue(mLayer->angle());
416+
417+
// without blocking signals the value gets changed because of slot setOffset()
418+
spinOffsetX->blockSignals(true);
419+
spinOffsetX->setValue(mLayer->offset().x());
420+
spinOffsetX->blockSignals(false);
421+
spinOffsetY->blockSignals(true);
422+
spinOffsetY->setValue(mLayer->offset().y());
423+
spinOffsetY->blockSignals(false);
398424
}
399425

400426
QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2Widget::symbolLayer()
@@ -422,6 +448,12 @@ void QgsSvgMarkerSymbolLayerV2Widget::setAngle()
422448
emit changed();
423449
}
424450

451+
void QgsSvgMarkerSymbolLayerV2Widget::setOffset()
452+
{
453+
mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
454+
emit changed();
455+
}
456+
425457
///////////////
426458

427459
QgsLineDecorationSymbolLayerV2Widget::QgsLineDecorationSymbolLayerV2Widget(QWidget* parent)

src/gui/symbology-ng/qgssymbollayerv2widget.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ class QgsSimpleMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widget, privat
7575
void setColorFill();
7676
void setSize();
7777
void setAngle();
78-
78+
void setOffset();
79+
7980
protected:
8081
QgsSimpleMarkerSymbolLayerV2* mLayer;
8182
};
@@ -166,7 +167,8 @@ class QgsSvgMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widget, private U
166167
void setName(const QModelIndex& idx);
167168
void setSize();
168169
void setAngle();
169-
170+
void setOffset();
171+
170172
protected:
171173

172174
void populateList();

0 commit comments

Comments
 (0)