diff --git a/python/gui/symbology-ng/qgssizescalewidget.sip b/python/gui/symbology-ng/qgssizescalewidget.sip index f297e20b685..0b8eeb4c91f 100644 --- a/python/gui/symbology-ng/qgssizescalewidget.sip +++ b/python/gui/symbology-ng/qgssizescalewidget.sip @@ -7,5 +7,9 @@ class QgsSizeScaleWidget : QgsDataDefinedAssistant QgsSizeScaleWidget( const QgsVectorLayer * layer, const QgsMarkerSymbolV2 * symbol ); QgsDataDefined dataDefined() const; + + protected: + + virtual void showEvent( QShowEvent * ); }; diff --git a/src/gui/symbology-ng/qgssizescalewidget.cpp b/src/gui/symbology-ng/qgssizescalewidget.cpp index 5340a5032c6..8d97d2905d5 100644 --- a/src/gui/symbology-ng/qgssizescalewidget.cpp +++ b/src/gui/symbology-ng/qgssizescalewidget.cpp @@ -47,6 +47,36 @@ class ItemDelegate : public QItemDelegate }; +void QgsSizeScaleWidget::setFromSymbol() +{ + if ( !mSymbol ) + { + return; + } + + QgsDataDefined ddSize = mSymbol->dataDefinedSize(); + QgsScaleExpression expr( ddSize.expressionString() ); + if ( expr ) + { + for ( int i = 0; i < scaleMethodComboBox->count(); i++ ) + { + if ( scaleMethodComboBox->itemData( i ).toInt() == int( expr.type() ) ) + { + scaleMethodComboBox->setCurrentIndex( i ); + break; + } + } + + mExpressionWidget->setField( expr.baseExpression() ); + + minValueSpinBox->setValue( expr.minValue() ); + maxValueSpinBox->setValue( expr.maxValue() ); + minSizeSpinBox->setValue( expr.minSize() ); + maxSizeSpinBox->setValue( expr.maxSize() ); + } + updatePreview(); +} + QgsSizeScaleWidget::QgsSizeScaleWidget( const QgsVectorLayer * layer, const QgsMarkerSymbolV2 * symbol ) : mSymbol( symbol ) // we just use the minimumValue and maximumValue from the layer, unfortunately they are @@ -85,27 +115,7 @@ QgsSizeScaleWidget::QgsSizeScaleWidget( const QgsVectorLayer * layer, const QgsM maxValueSpinBox->setShowClearButton( false ); // setup ui from expression if any - QgsDataDefined ddSize = mSymbol->dataDefinedSize(); - QgsScaleExpression expr( ddSize.expressionString() ); - if ( expr ) - { - for ( int i = 0; i < scaleMethodComboBox->count(); i++ ) - { - if ( scaleMethodComboBox->itemData( i ).toInt() == int( expr.type() ) ) - { - scaleMethodComboBox->setCurrentIndex( i ); - break; - } - } - - mExpressionWidget->setField( expr.baseExpression() ); - - minValueSpinBox->setValue( expr.minValue() ); - maxValueSpinBox->setValue( expr.maxValue() ); - minSizeSpinBox->setValue( expr.minSize() ); - maxSizeSpinBox->setValue( expr.maxSize() ); - updatePreview(); - } + setFromSymbol(); connect( minSizeSpinBox, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ) ); connect( maxSizeSpinBox, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ) ); @@ -122,6 +132,11 @@ QgsDataDefined QgsSizeScaleWidget::dataDefined() const return QgsDataDefined( exp.data() ); } +void QgsSizeScaleWidget::showEvent( QShowEvent* ) +{ + setFromSymbol(); +} + QgsScaleExpression *QgsSizeScaleWidget::createExpression() const { return new QgsScaleExpression( QgsScaleExpression::Type( scaleMethodComboBox->itemData( scaleMethodComboBox->currentIndex() ).toInt() ), @@ -134,6 +149,9 @@ QgsScaleExpression *QgsSizeScaleWidget::createExpression() const void QgsSizeScaleWidget::updatePreview() { + if ( !mSymbol ) + return; + QScopedPointer expr( createExpression() ); QList breaks = QgsSymbolLayerV2Utils::prettyBreaks( expr->minValue(), expr->maxValue(), 4 ); diff --git a/src/gui/symbology-ng/qgssizescalewidget.h b/src/gui/symbology-ng/qgssizescalewidget.h index 679a5bbbb0a..6eb51fba0a8 100644 --- a/src/gui/symbology-ng/qgssizescalewidget.h +++ b/src/gui/symbology-ng/qgssizescalewidget.h @@ -38,6 +38,10 @@ class GUI_EXPORT QgsSizeScaleWidget : public QgsDataDefinedAssistant, private Ui QgsDataDefined dataDefined() const override; + protected: + + virtual void showEvent( QShowEvent * ) override; + private slots: void computeFromLayerTriggered(); void updatePreview(); @@ -51,6 +55,8 @@ class GUI_EXPORT QgsSizeScaleWidget : public QgsDataDefinedAssistant, private Ui QStandardItemModel mPreviewList; QgsScaleExpression* createExpression() const; + void setFromSymbol(); + }; #endif //QGSSIZESCALEWIDGET_H diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp index 91d399f4031..2b778f486f8 100644 --- a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp +++ b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp @@ -34,6 +34,7 @@ #include "qgsapplication.h" #include "qgslogger.h" +#include "qgssizescalewidget.h" #include #include @@ -334,6 +335,11 @@ QgsSimpleMarkerSymbolLayerV2Widget::QgsSimpleMarkerSymbolLayerV2Widget( const Qg spinOffsetX->setClearValue( 0.0 ); spinOffsetY->setClearValue( 0.0 ); + //make a temporary symbol for the size assistant preview + mAssistantPreviewSymbol = new QgsMarkerSymbolV2(); + + mSizeDDBtn->setAssistant( new QgsSizeScaleWidget( mVectorLayer, mAssistantPreviewSymbol ) ); + QSize size = lstNames->iconSize(); QStringList names; names << "circle" << "rectangle" << "diamond" << "pentagon" << "cross" << "cross2" << "triangle" @@ -355,6 +361,12 @@ QgsSimpleMarkerSymbolLayerV2Widget::QgsSimpleMarkerSymbolLayerV2Widget( const Qg connect( spinAngle, SIGNAL( valueChanged( double ) ), this, SLOT( setAngle() ) ); connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) ); connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) ); + connect( this, SIGNAL( changed() ), this, SLOT( updateAssistantSymbol() ) ); +} + +QgsSimpleMarkerSymbolLayerV2Widget::~QgsSimpleMarkerSymbolLayerV2Widget() +{ + delete mAssistantPreviewSymbol; } void QgsSimpleMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) @@ -437,6 +449,8 @@ void QgsSimpleMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer registerDataDefinedButton( mOffsetDDBtn, "offset", QgsDataDefinedButton::String, QgsDataDefinedButton::doubleXYDesc() ); registerDataDefinedButton( mHorizontalAnchorDDBtn, "horizontal_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::horizontalAnchorDesc() ); registerDataDefinedButton( mVerticalAnchorDDBtn, "vertical_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::verticalAnchorDesc() ); + + updateAssistantSymbol(); } QgsSymbolLayerV2* QgsSimpleMarkerSymbolLayerV2Widget::symbolLayer() @@ -548,6 +562,18 @@ void QgsSimpleMarkerSymbolLayerV2Widget::on_mVerticalAnchorComboBox_currentIndex } } +void QgsSimpleMarkerSymbolLayerV2Widget::updateAssistantSymbol() +{ + for ( int i = mAssistantPreviewSymbol->symbolLayerCount() - 1 ; i >= 0; --i ) + { + mAssistantPreviewSymbol->deleteSymbolLayer( i ); + } + mAssistantPreviewSymbol->appendSymbolLayer( mLayer->clone() ); + QgsDataDefined* ddSize = mLayer->getDataDefinedProperty( "size" ); + if ( ddSize ) + mAssistantPreviewSymbol->setDataDefinedSize( *ddSize ); +} + /////////// @@ -1508,6 +1534,16 @@ QgsSvgMarkerSymbolLayerV2Widget::QgsSvgMarkerSymbolLayerV2Widget( const QgsVecto connect( spinAngle, SIGNAL( valueChanged( double ) ), this, SLOT( setAngle() ) ); connect( spinOffsetX, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) ); connect( spinOffsetY, SIGNAL( valueChanged( double ) ), this, SLOT( setOffset() ) ); + connect( this, SIGNAL( changed() ), this, SLOT( updateAssistantSymbol() ) ); + + //make a temporary symbol for the size assistant preview + mAssistantPreviewSymbol = new QgsMarkerSymbolV2(); + mSizeDDBtn->setAssistant( new QgsSizeScaleWidget( mVectorLayer, mAssistantPreviewSymbol ) ); +} + +QgsSvgMarkerSymbolLayerV2Widget::~QgsSvgMarkerSymbolLayerV2Widget() +{ + delete mAssistantPreviewSymbol; } #include @@ -1698,6 +1734,18 @@ void QgsSvgMarkerSymbolLayerV2Widget::setGuiForSvg( const QgsSvgMarkerSymbolLaye mBorderWidthSpinBox->blockSignals( false ); } +void QgsSvgMarkerSymbolLayerV2Widget::updateAssistantSymbol() +{ + for ( int i = mAssistantPreviewSymbol->symbolLayerCount() - 1 ; i >= 0; --i ) + { + mAssistantPreviewSymbol->deleteSymbolLayer( i ); + } + mAssistantPreviewSymbol->appendSymbolLayer( mLayer->clone() ); + QgsDataDefined* ddSize = mLayer->getDataDefinedProperty( "size" ); + if ( ddSize ) + mAssistantPreviewSymbol->setDataDefinedSize( *ddSize ); +} + void QgsSvgMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) { @@ -1775,6 +1823,8 @@ void QgsSvgMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) registerDataDefinedButton( mBorderColorDDBtn, "outline", QgsDataDefinedButton::String, QgsDataDefinedButton::colorNoAlphaDesc() ); registerDataDefinedButton( mHorizontalAnchorDDBtn, "horizontal_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::horizontalAnchorDesc() ); registerDataDefinedButton( mVerticalAnchorDDBtn, "vertical_anchor_point", QgsDataDefinedButton::String, QgsDataDefinedButton::verticalAnchorDesc() ); + + updateAssistantSymbol(); } QgsSymbolLayerV2* QgsSvgMarkerSymbolLayerV2Widget::symbolLayer() @@ -2460,7 +2510,6 @@ QgsFontMarkerSymbolLayerV2Widget::QgsFontMarkerSymbolLayerV2Widget( const QgsVec connect( widgetChar, SIGNAL( characterSelected( const QChar & ) ), this, SLOT( setCharacter( const QChar & ) ) ); } - void QgsFontMarkerSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer ) { if ( layer->layerType() != "FontMarker" ) @@ -2591,7 +2640,6 @@ void QgsFontMarkerSymbolLayerV2Widget::on_mVerticalAnchorComboBox_currentIndexCh } } - /////////////// diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.h b/src/gui/symbology-ng/qgssymbollayerv2widget.h index 21c9556ac33..52e7b5773e9 100644 --- a/src/gui/symbology-ng/qgssymbollayerv2widget.h +++ b/src/gui/symbology-ng/qgssymbollayerv2widget.h @@ -90,6 +90,7 @@ class GUI_EXPORT QgsSimpleLineSymbolLayerV2Widget : public QgsSymbolLayerV2Widge //creates a new icon for the 'change pattern' button void updatePatternIcon(); + }; /////////// @@ -104,6 +105,7 @@ class GUI_EXPORT QgsSimpleMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Wid public: QgsSimpleMarkerSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent = NULL ); + ~QgsSimpleMarkerSymbolLayerV2Widget(); static QgsSymbolLayerV2Widget* create( const QgsVectorLayer* vl ) { return new QgsSimpleMarkerSymbolLayerV2Widget( vl ); } @@ -128,6 +130,14 @@ class GUI_EXPORT QgsSimpleMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Wid protected: QgsSimpleMarkerSymbolLayerV2* mLayer; + + private slots: + + void updateAssistantSymbol(); + + private: + + QgsMarkerSymbolV2* mAssistantPreviewSymbol; }; /////////// @@ -286,6 +296,7 @@ class GUI_EXPORT QgsSvgMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widget public: QgsSvgMarkerSymbolLayerV2Widget( const QgsVectorLayer* vl, QWidget* parent = NULL ); + ~QgsSvgMarkerSymbolLayerV2Widget(); static QgsSymbolLayerV2Widget* create( const QgsVectorLayer* vl ) { return new QgsSvgMarkerSymbolLayerV2Widget( vl ); } @@ -319,6 +330,15 @@ class GUI_EXPORT QgsSvgMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widget void setGuiForSvg( const QgsSvgMarkerSymbolLayerV2* layer ); QgsSvgMarkerSymbolLayerV2* mLayer; + + private slots: + + void updateAssistantSymbol(); + + private: + + QgsMarkerSymbolV2* mAssistantPreviewSymbol; + }; /////////// @@ -497,6 +517,7 @@ class GUI_EXPORT QgsFontMarkerSymbolLayerV2Widget : public QgsSymbolLayerV2Widge protected: QgsFontMarkerSymbolLayerV2* mLayer; CharacterWidget* widgetChar; + }; //////////