|
46 | 46 |
|
47 | 47 | static const int SymbolLayerItemType = QStandardItem::UserType + 1;
|
48 | 48 |
|
| 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 | + |
49 | 113 | // Hybrid item which may represent a symbol or a layer
|
50 | 114 | // Check using item->isLayer()
|
51 | 115 | class SymbolLayerItem : public QStandardItem
|
@@ -325,14 +389,17 @@ void QgsSymbolV2SelectorDialog::layerChanged()
|
325 | 389 | if ( currentItem->isLayer() )
|
326 | 390 | {
|
327 | 391 | SymbolLayerItem *parent = static_cast<SymbolLayerItem*>( currentItem->parent() );
|
| 392 | + mDataDefineRestorer.reset( new DataDefinedRestorer( parent->symbol(), currentItem->layer() ) ); |
328 | 393 | QWidget *layerProp = new QgsLayerPropertiesWidget( currentItem->layer(), parent->symbol(), mVectorLayer );
|
329 | 394 | setWidget( layerProp );
|
| 395 | + connect( layerProp, SIGNAL( changed() ), mDataDefineRestorer.data(), SLOT( restore() ) ); |
330 | 396 | connect( layerProp, SIGNAL( changed() ), this, SLOT( updateLayerPreview() ) );
|
331 | 397 | // This connection when layer type is changed
|
332 | 398 | connect( layerProp, SIGNAL( changeLayer( QgsSymbolLayerV2* ) ), this, SLOT( changeLayer( QgsSymbolLayerV2* ) ) );
|
333 | 399 | }
|
334 | 400 | else
|
335 | 401 | {
|
| 402 | + mDataDefineRestorer.reset(); |
336 | 403 | // then it must be a symbol
|
337 | 404 | currentItem->symbol()->setLayer( mVectorLayer );
|
338 | 405 | // Now populate symbols of that type using the symbols list widget:
|
|
0 commit comments