Skip to content

Commit c62b52b

Browse files
committedJun 26, 2015
fix loss of expression when subsymbol is changed
bug mentionned in issue #13033 if the angle, size, width or offset is changed for a subsymbol which parent (a marker) has data-defined size, angle or width, restore the data-defined property for the marker.
1 parent 7b31f12 commit c62b52b

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed
 

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

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,70 @@
4646

4747
static const int SymbolLayerItemType = QStandardItem::UserType + 1;
4848

49+
DataDefinedRestorer::DataDefinedRestorer( QgsSymbolV2* symbol, const QgsSymbolLayerV2* symbolLayer )
50+
: mMarker( NULL )
51+
, mMarkerSymbolLayer( NULL )
52+
, mLine( NULL )
53+
, mLineSymbolLayer( NULL )
54+
{
55+
if ( symbolLayer->type() == QgsSymbolV2::Marker && symbol->type() == QgsSymbolV2::Marker )
56+
{
57+
Q_ASSERT( symbol->type() == QgsSymbolV2::Marker );
58+
mMarker = static_cast<QgsMarkerSymbolV2*>( symbol );
59+
mMarkerSymbolLayer = static_cast<const QgsMarkerSymbolLayerV2*>( symbolLayer );
60+
mDDSize = mMarker->dataDefinedSize();
61+
mDDAngle = mMarker->dataDefinedAngle();
62+
// check if restore is actually needed
63+
if ( mDDSize == QgsDataDefined() && mDDAngle == QgsDataDefined() )
64+
mMarker = NULL;
65+
}
66+
else if( symbolLayer->type() == QgsSymbolV2::Line && symbol->type() == QgsSymbolV2::Line )
67+
{
68+
mLine = static_cast<QgsLineSymbolV2*>( symbol );
69+
mLineSymbolLayer = static_cast<const QgsLineSymbolLayerV2*>( symbolLayer );
70+
mDDWidth = mLine->dataDefinedWidth();
71+
// check if restore is actually needed
72+
if ( mDDWidth == QgsDataDefined() )
73+
mLine = NULL;
74+
}
75+
save();
76+
}
77+
78+
void DataDefinedRestorer::save()
79+
{
80+
if ( mMarker )
81+
{
82+
mSize = mMarkerSymbolLayer->size();
83+
mAngle = mMarkerSymbolLayer->angle();
84+
mMarkerOffset = mMarkerSymbolLayer->offset();
85+
}
86+
else if ( mLine )
87+
{
88+
mWidth = mLineSymbolLayer->width();
89+
mLineOffset = mLineSymbolLayer->offset();
90+
}
91+
}
92+
93+
void DataDefinedRestorer::restore()
94+
{
95+
if ( mMarker )
96+
{
97+
if ( mDDSize != QgsDataDefined() &&
98+
(mSize != mMarkerSymbolLayer->size() || mMarkerOffset != mMarkerSymbolLayer->offset()) )
99+
mMarker->setDataDefinedSize( mDDSize );
100+
if ( mDDAngle != QgsDataDefined() &&
101+
mAngle != mMarkerSymbolLayer->angle() )
102+
mMarker->setDataDefinedAngle( mDDAngle );
103+
}
104+
else if ( mLine )
105+
{
106+
if ( mDDWidth != QgsDataDefined() &&
107+
(mWidth != mLineSymbolLayer->width() || mLineOffset != mLineSymbolLayer->offset()) )
108+
mLine->setDataDefinedWidth( mDDWidth );
109+
}
110+
save();
111+
}
112+
49113
// Hybrid item which may represent a symbol or a layer
50114
// Check using item->isLayer()
51115
class SymbolLayerItem : public QStandardItem
@@ -325,14 +389,17 @@ void QgsSymbolV2SelectorDialog::layerChanged()
325389
if ( currentItem->isLayer() )
326390
{
327391
SymbolLayerItem *parent = static_cast<SymbolLayerItem*>( currentItem->parent() );
392+
mDataDefineRestorer.reset( new DataDefinedRestorer( parent->symbol(), currentItem->layer() ) );
328393
QWidget *layerProp = new QgsLayerPropertiesWidget( currentItem->layer(), parent->symbol(), mVectorLayer );
329394
setWidget( layerProp );
395+
connect( layerProp, SIGNAL( changed() ), mDataDefineRestorer.data(), SLOT( restore() ) );
330396
connect( layerProp, SIGNAL( changed() ), this, SLOT( updateLayerPreview() ) );
331397
// This connection when layer type is changed
332398
connect( layerProp, SIGNAL( changeLayer( QgsSymbolLayerV2* ) ), this, SLOT( changeLayer( QgsSymbolLayerV2* ) ) );
333399
}
334400
else
335401
{
402+
mDataDefineRestorer.reset();
336403
// then it must be a symbol
337404
currentItem->symbol()->setLayer( mVectorLayer );
338405
// Now populate symbols of that type using the symbols list widget:

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020

2121
#include "ui_qgssymbolv2selectordialogbase.h"
2222

23+
#include "qgsdatadefined.h"
24+
2325
#include <QStandardItemModel>
26+
#include <QScopedPointer>
2427

2528
class QgsStyleV2;
2629
class QgsSymbolV2;
@@ -31,6 +34,37 @@ class QMenu;
3134
class QWidget;
3235

3336
class SymbolLayerItem;
37+
class QgsMarkerSymbolV2;
38+
class QgsLineSymbolV2;
39+
class QgsMarkerSymbolLayerV2;
40+
class QgsLineSymbolLayerV2;
41+
42+
class DataDefinedRestorer: public QObject
43+
{
44+
Q_OBJECT
45+
public:
46+
DataDefinedRestorer( QgsSymbolV2* symbol, const QgsSymbolLayerV2* symbolLayer);
47+
48+
public slots:
49+
void restore();
50+
51+
private:
52+
QgsMarkerSymbolV2* mMarker;
53+
const QgsMarkerSymbolLayerV2* mMarkerSymbolLayer;
54+
double mSize;
55+
double mAngle;
56+
QPointF mMarkerOffset;
57+
QgsDataDefined mDDSize;
58+
QgsDataDefined mDDAngle;
59+
60+
QgsLineSymbolV2* mLine;
61+
const QgsLineSymbolLayerV2* mLineSymbolLayer;
62+
double mWidth;
63+
double mLineOffset;
64+
QgsDataDefined mDDWidth;
65+
66+
void save();
67+
};
3468

3569
class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog, private Ui::QgsSymbolV2SelectorDialogBase
3670
{
@@ -95,6 +129,9 @@ class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog, private Ui::QgsSymb
95129

96130
QStandardItemModel* model;
97131
QWidget *mPresentWidget;
132+
133+
private:
134+
QScopedPointer<DataDefinedRestorer> mDataDefineRestorer;
98135
};
99136

100137
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.