From 84dd983b797f2e56968e0f8846af50355ca47962 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 13 Feb 2017 10:51:28 +1000 Subject: [PATCH] Restore legend preview in symbol size assistant --- src/gui/qgspropertyassistantwidget.cpp | 103 +++++++++++++++++- src/gui/qgspropertyassistantwidget.h | 40 ++++++- src/gui/qgspropertyoverridebutton.cpp | 31 +++++- src/gui/qgspropertyoverridebutton.h | 4 + src/gui/symbology-ng/qgssizescalewidget.cpp | 2 +- src/gui/symbology-ng/qgssizescalewidget.h | 19 ---- src/gui/symbology-ng/qgssymbollayerwidget.cpp | 44 ++------ src/gui/symbology-ng/qgssymbollayerwidget.h | 13 +-- src/gui/symbology-ng/qgssymbolslistwidget.cpp | 19 +++- src/gui/symbology-ng/qgssymbolslistwidget.h | 5 + src/ui/qgspropertyassistantwidgetbase.ui | 18 ++- 11 files changed, 218 insertions(+), 80 deletions(-) diff --git a/src/gui/qgspropertyassistantwidget.cpp b/src/gui/qgspropertyassistantwidget.cpp index bdcc4cccb7b1..1c092865e69e 100644 --- a/src/gui/qgspropertyassistantwidget.cpp +++ b/src/gui/qgspropertyassistantwidget.cpp @@ -20,6 +20,8 @@ #include "qgsproject.h" #include "qgsmapsettings.h" #include "qgsvectorlayer.h" +#include "qgslayertreelayer.h" +#include "qgssymbollayerutils.h" QgsPropertyAssistantWidget::QgsPropertyAssistantWidget( QWidget* parent , const QgsPropertyDefinition& definition, const QgsProperty& initialState, @@ -53,6 +55,16 @@ QgsPropertyAssistantWidget::QgsPropertyAssistantWidget( QWidget* parent , connect( computeValuesButton, &QPushButton::clicked, this, &QgsPropertyAssistantWidget::computeValuesFromLayer ); + if ( mLayer ) + { + mLayerTreeLayer = new QgsLayerTreeLayer( const_cast< QgsVectorLayer* >( mLayer ) ); + mRoot.addChildNode( mLayerTreeLayer ); // takes ownership + } + mLegendPreview->setModel( &mPreviewList ); + mLegendPreview->setItemDelegate( new ItemDelegate( &mPreviewList ) ); + mLegendPreview->setHeaderHidden( true ); + mLegendPreview->expandAll(); + switch ( definition.standardTemplate() ) { case QgsPropertyDefinition::Size: @@ -72,6 +84,8 @@ QgsPropertyAssistantWidget::QgsPropertyAssistantWidget( QWidget* parent , connect( minValueSpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsPropertyAssistantWidget::widgetChanged ); connect( maxValueSpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsPropertyAssistantWidget::widgetChanged ); connect( mExpressionWidget, static_cast < void ( QgsFieldExpressionWidget::* )( const QString& ) > ( &QgsFieldExpressionWidget::fieldChanged ), this, &QgsPropertyAssistantWidget::widgetChanged ); + connect( this, &QgsPropertyAssistantWidget::widgetChanged, this, &QgsPropertyAssistantWidget::updatePreview ); + updatePreview(); } void QgsPropertyAssistantWidget::registerExpressionContextGenerator( QgsExpressionContextGenerator* generator ) @@ -116,6 +130,55 @@ void QgsPropertyAssistantWidget::computeValuesFromLayer() emit widgetChanged(); } +void QgsPropertyAssistantWidget::updatePreview() +{ + if ( !mTransformerWidget || !mSymbol ) + return; + + if ( dockMode() ) + return; + + mLegendPreview->setIconSize( QSize( 512, 512 ) ); + mPreviewList.clear(); + + QList breaks = QgsSymbolLayerUtils::prettyBreaks( minValueSpinBox->value(), + maxValueSpinBox->value(), 4 ); + + QList< QgsSymbolLegendNode* > nodes = mTransformerWidget->generatePreviews( breaks, mLayerTreeLayer, mLayer, mSymbol.get(), minValueSpinBox->value(), + maxValueSpinBox->value() ); + if ( nodes.isEmpty() ) + { + mLegendPreview->show(); + return; + } + + int widthMax = 0; + int i = 0; + Q_FOREACH ( QgsSymbolLegendNode* node, nodes ) + { + const QSize minSize( node->minimumIconSize() ); + node->setIconSize( minSize ); + widthMax = qMax( minSize.width(), widthMax ); + mPreviewList.appendRow( new QStandardItem( node->data( Qt::DecorationRole ).value(), QString::number( breaks[i] ) ) ); + delete node; + i++; + } + // center icon and align text left by giving icons the same width + // @todo maybe add some space so that icons don't touch + for ( int i = 0; i < breaks.length(); i++ ) + { + QPixmap img( mPreviewList.item( i )->icon().pixmap( mPreviewList.item( i )->icon().actualSize( QSize( 512, 512 ) ) ) ); + QPixmap enlarged( widthMax, img.height() ); + // fill transparent and add original image + enlarged.fill( Qt::transparent ); + QPainter p( &enlarged ); + p.drawPixmap( QPoint(( widthMax - img.width() ) / 2, 0 ), img ); + p.end(); + mPreviewList.item( i )->setIcon( enlarged ); + } + mLegendPreview->show(); +} + bool QgsPropertyAssistantWidget::computeValuesFromExpression( const QString& expression, double& minValue, double& maxValue ) const { QgsExpression e( expression ); @@ -236,7 +299,7 @@ QgsPropertySizeAssistantWidget::QgsPropertySizeAssistantWidget( QWidget* parent, ); } -QgsPropertyTransformer* QgsPropertySizeAssistantWidget::createTransformer( double minValue, double maxValue ) const +QgsSizeScaleTransformer* QgsPropertySizeAssistantWidget::createTransformer( double minValue, double maxValue ) const { QgsSizeScaleTransformer* transformer = new QgsSizeScaleTransformer( static_cast< QgsSizeScaleTransformer::ScaleType >( scaleMethodComboBox->currentData().toInt() ), @@ -248,3 +311,41 @@ QgsPropertyTransformer* QgsPropertySizeAssistantWidget::createTransformer( doubl exponentSpinBox->value() ); return transformer; } + +QList< QgsSymbolLegendNode* > QgsPropertySizeAssistantWidget::generatePreviews( const QList& breaks, QgsLayerTreeLayer* parent, const QgsVectorLayer* layer, const QgsSymbol* symbol, double minValue, double maxValue ) const +{ + QList< QgsSymbolLegendNode* > nodes; + + if ( !symbol || !layer ) + return nodes; + + std::unique_ptr< QgsSizeScaleTransformer > t( createTransformer( minValue, maxValue ) ); + + for ( int i = 0; i < breaks.length(); i++ ) + { + std::unique_ptr< QgsSymbolLegendNode > node; + if ( dynamic_cast( symbol ) ) + { + std::unique_ptr< QgsMarkerSymbol > symbolClone( static_cast( symbol->clone() ) ); + symbolClone->setDataDefinedSize( QgsProperty() ); + symbolClone->setDataDefinedAngle( QgsProperty() ); // to avoid symbol not being drawn + symbolClone->setSize( t->size( breaks[i] ) ); + node.reset( new QgsSymbolLegendNode( parent, QgsLegendSymbolItem( symbolClone.get(), QString::number( i ), QString() ) ) ); + } + else if ( dynamic_cast( symbol ) ) + { + std::unique_ptr< QgsLineSymbol > symbolClone( static_cast( symbol->clone() ) ); + symbolClone->setDataDefinedWidth( QgsProperty() ); + symbolClone->setWidth( t->size( breaks[i] ) ); + node.reset( new QgsSymbolLegendNode( parent, QgsLegendSymbolItem( symbolClone.get(), QString::number( i ), QString() ) ) ); + } + if ( node ) + nodes << node.release(); + } + return nodes; +} + +QList QgsPropertyAbstractTransformerWidget::generatePreviews( const QList& , QgsLayerTreeLayer* , const QgsVectorLayer*, const QgsSymbol*, double, double ) const +{ + return QList< QgsSymbolLegendNode* >(); +} diff --git a/src/gui/qgspropertyassistantwidget.h b/src/gui/qgspropertyassistantwidget.h index 11b85cedc79a..d1e40ba594d5 100644 --- a/src/gui/qgspropertyassistantwidget.h +++ b/src/gui/qgspropertyassistantwidget.h @@ -22,7 +22,12 @@ #include "ui_qgspropertyassistantwidgetbase.h" #include "ui_qgspropertysizeassistantwidget.h" #include "qgsproperty.h" +#include "qgslayertreegroup.h" +#include "qgssymbol.h" +#include "qgslayertreemodellegendnode.h" #include "qgis_gui.h" +#include +#include class QgsMapCanvas; @@ -41,6 +46,8 @@ class GUI_EXPORT QgsPropertyAbstractTransformerWidget : public QWidget virtual QgsPropertyTransformer* createTransformer( double minValue, double maxValue ) const = 0; + virtual QList< QgsSymbolLegendNode* > generatePreviews( const QList& breaks, QgsLayerTreeLayer* parent, const QgsVectorLayer* layer, const QgsSymbol* symbol, double minValue, double maxValue ) const; + signals: void widgetChanged(); @@ -59,9 +66,9 @@ class GUI_EXPORT QgsPropertySizeAssistantWidget : public QgsPropertyAbstractTran QgsPropertySizeAssistantWidget( QWidget* parent = nullptr, const QgsPropertyDefinition& definition = QgsPropertyDefinition(), const QgsProperty& initialState = QgsProperty() ); - virtual QgsPropertyTransformer* createTransformer( double minValue, double maxValue ) const override; - + virtual QgsSizeScaleTransformer* createTransformer( double minValue, double maxValue ) const override; + QList< QgsSymbolLegendNode* > generatePreviews( const QList& breaks, QgsLayerTreeLayer* parent, const QgsVectorLayer* layer, const QgsSymbol* symbol, double minValue, double maxValue ) const override; }; ///@endcond PRIVATE @@ -84,9 +91,12 @@ class GUI_EXPORT QgsPropertyAssistantWidget : public QgsPanelWidget, private Ui: void updateProperty( QgsProperty& property ); + void setSymbol( std::shared_ptr< QgsSymbol > symbol ) { mSymbol = symbol; updatePreview(); } private slots: void computeValuesFromLayer(); + void updatePreview(); + private: @@ -95,10 +105,36 @@ class GUI_EXPORT QgsPropertyAssistantWidget : public QgsPanelWidget, private Ui: QgsExpressionContextGenerator* mExpressionContextGenerator = nullptr; QgsPropertyAbstractTransformerWidget* mTransformerWidget = nullptr; + QgsLayerTreeLayer* mLayerTreeLayer = nullptr; + QgsLayerTreeGroup mRoot; + QStandardItemModel mPreviewList; + + std::shared_ptr< QgsSymbol > mSymbol; + bool computeValuesFromExpression( const QString& expression, double& minValue, double& maxValue ) const; bool computeValuesFromField( const QString& fieldName, double& minValue, double& maxValue ) const; }; +/// @cond PRIVATE +class ItemDelegate : public QItemDelegate +{ + Q_OBJECT + + public: + explicit ItemDelegate( QStandardItemModel* model ) : mModel( model ) {} + + QSize sizeHint( const QStyleOptionViewItem& /*option*/, const QModelIndex & index ) const override + { + return mModel->item( index.row() )->icon().actualSize( QSize( 512, 512 ) ); + } + + private: + QStandardItemModel* mModel = nullptr; + +}; + +///@endcond + #endif // QGSPROPERTYASSISTANTWIDGET_H diff --git a/src/gui/qgspropertyoverridebutton.cpp b/src/gui/qgspropertyoverridebutton.cpp index a6cabb1e04cb..e086912b7970 100644 --- a/src/gui/qgspropertyoverridebutton.cpp +++ b/src/gui/qgspropertyoverridebutton.cpp @@ -532,10 +532,13 @@ void QgsPropertyOverrideButton::showAssistant() } QgsPanelWidget* panel = QgsPanelWidget::findParentPanel( this ); + QgsPropertyAssistantWidget* widget = new QgsPropertyAssistantWidget( panel, mDefinition, mProperty, mVectorLayer ); + widget->setDockMode( panel && panel->dockMode() ); + widget->registerExpressionContextGenerator( mExpressionContextGenerator ); + widget->setSymbol( mSymbol ); // we only show legend preview in dialog version + if ( panel && panel->dockMode() ) { - QgsPropertyAssistantWidget* widget = new QgsPropertyAssistantWidget( panel, mDefinition, mProperty, mVectorLayer ); - widget->registerExpressionContextGenerator( mExpressionContextGenerator ); connect( widget, &QgsPropertyAssistantWidget::widgetChanged, this, [this,widget] { widget->updateProperty( this->mProperty ); @@ -549,6 +552,30 @@ void QgsPropertyOverrideButton::showAssistant() panel->openPanel( widget ); return; } + else + { + // Show the dialog version if not in a panel + QDialog* dlg = new QDialog( this ); + QString key = QStringLiteral( "/UI/paneldialog/%1" ).arg( widget->panelTitle() ); + QSettings settings; + dlg->restoreGeometry( settings.value( key ).toByteArray() ); + dlg->setWindowTitle( widget->panelTitle() ); + dlg->setLayout( new QVBoxLayout() ); + dlg->layout()->addWidget( widget ); + QDialogButtonBox* buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok ); + connect( buttonBox, SIGNAL( accepted() ), dlg, SLOT( accept() ) ); + dlg->layout()->addWidget( buttonBox ); + dlg->exec(); + settings.setValue( key, dlg->saveGeometry() ); + + widget->updateProperty( mProperty ); + mExpressionString = mProperty.asExpression(); + mFieldName = mProperty.field(); + widget->acceptPanel(); + updateGui(); + + emit changed(); + } } void QgsPropertyOverrideButton::updateGui() diff --git a/src/gui/qgspropertyoverridebutton.h b/src/gui/qgspropertyoverridebutton.h index ff74e20aafda..780634471ffe 100644 --- a/src/gui/qgspropertyoverridebutton.h +++ b/src/gui/qgspropertyoverridebutton.h @@ -156,6 +156,8 @@ class GUI_EXPORT QgsPropertyOverrideButton: public QToolButton */ void registerExpressionContextGenerator( QgsExpressionContextGenerator* generator ); + void setSymbol( std::shared_ptr< QgsSymbol > symbol ) { mSymbol = symbol; } + public slots: /** @@ -230,6 +232,8 @@ class GUI_EXPORT QgsPropertyOverrideButton: public QToolButton //! Internal property used for storing state of widget QgsProperty mProperty; + std::shared_ptr< QgsSymbol > mSymbol; + private slots: void aboutToShowMenu(); void menuActionTriggered( QAction* action ); diff --git a/src/gui/symbology-ng/qgssizescalewidget.cpp b/src/gui/symbology-ng/qgssizescalewidget.cpp index fad771920ffd..4ade7289554c 100644 --- a/src/gui/symbology-ng/qgssizescalewidget.cpp +++ b/src/gui/symbology-ng/qgssizescalewidget.cpp @@ -127,7 +127,7 @@ QgsSizeScaleWidget::QgsSizeScaleWidget( const QgsVectorLayer * layer, const QgsS } treeView->setModel( &mPreviewList ); - treeView->setItemDelegate( new ItemDelegate( &mPreviewList ) ); + // treeView->setItemDelegate( new ItemDelegate( &mPreviewList ) ); treeView->setHeaderHidden( true ); treeView->expandAll(); diff --git a/src/gui/symbology-ng/qgssizescalewidget.h b/src/gui/symbology-ng/qgssizescalewidget.h index 6f9cdace36e4..c81d6b8ad62c 100644 --- a/src/gui/symbology-ng/qgssizescalewidget.h +++ b/src/gui/symbology-ng/qgssizescalewidget.h @@ -110,24 +110,5 @@ class GUI_EXPORT QgsSizeScaleWidget : public QgsDataDefinedAssistant, private Ui QgsExpressionContext createExpressionContext() const override; }; -/// @cond PRIVATE -class ItemDelegate : public QItemDelegate -{ - Q_OBJECT - - public: - explicit ItemDelegate( QStandardItemModel* model ) : mModel( model ) {} - - QSize sizeHint( const QStyleOptionViewItem& /*option*/, const QModelIndex & index ) const override - { - return mModel->item( index.row() )->icon().actualSize( QSize( 512, 512 ) ); - } - - private: - QStandardItemModel* mModel; - -}; - -///@endcond #endif //QGSSIZESCALEWIDGET_H diff --git a/src/gui/symbology-ng/qgssymbollayerwidget.cpp b/src/gui/symbology-ng/qgssymbollayerwidget.cpp index e02f5ae7d8ec..89ed5142f479 100644 --- a/src/gui/symbology-ng/qgssymbollayerwidget.cpp +++ b/src/gui/symbology-ng/qgssymbollayerwidget.cpp @@ -402,12 +402,10 @@ QgsSimpleMarkerSymbolLayerWidget::QgsSimpleMarkerSymbolLayerWidget( const QgsVec spinOffsetY->setClearValue( 0.0 ); //make a temporary symbol for the size assistant preview - mAssistantPreviewSymbol = new QgsMarkerSymbol(); + mAssistantPreviewSymbol.reset( new QgsMarkerSymbol() ); -#if 0 if ( vectorLayer() ) - mSizeDDBtn->setAssistant( tr( "Size Assistant..." ), new QgsSizeScaleWidget( vectorLayer(), mAssistantPreviewSymbol ) ); -#endif + mSizeDDBtn->setSymbol( mAssistantPreviewSymbol ); QSize size = lstNames->iconSize(); double markerSize = DEFAULT_POINT_SIZE * 2; @@ -435,9 +433,7 @@ QgsSimpleMarkerSymbolLayerWidget::QgsSimpleMarkerSymbolLayerWidget( const QgsVec } QgsSimpleMarkerSymbolLayerWidget::~QgsSimpleMarkerSymbolLayerWidget() -{ - delete mAssistantPreviewSymbol; -} +{} void QgsSimpleMarkerSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer* layer ) { @@ -821,12 +817,10 @@ QgsFilledMarkerSymbolLayerWidget::QgsFilledMarkerSymbolLayerWidget( const QgsVec spinOffsetY->setClearValue( 0.0 ); //make a temporary symbol for the size assistant preview - mAssistantPreviewSymbol = new QgsMarkerSymbol(); + mAssistantPreviewSymbol.reset( new QgsMarkerSymbol() ); -#if 0 if ( vectorLayer() ) - mSizeDDBtn->setAssistant( tr( "Size Assistant..." ), new QgsSizeScaleWidget( vectorLayer(), mAssistantPreviewSymbol ) ); -#endif + mSizeDDBtn->setSymbol( mAssistantPreviewSymbol ); QSize size = lstNames->iconSize(); double markerSize = DEFAULT_POINT_SIZE * 2; @@ -853,11 +847,6 @@ QgsFilledMarkerSymbolLayerWidget::QgsFilledMarkerSymbolLayerWidget( const QgsVec connect( this, SIGNAL( changed() ), this, SLOT( updateAssistantSymbol() ) ); } -QgsFilledMarkerSymbolLayerWidget::~QgsFilledMarkerSymbolLayerWidget() -{ - delete mAssistantPreviewSymbol; -} - void QgsFilledMarkerSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer* layer ) { if ( layer->layerType() != QLatin1String( "FilledMarker" ) ) @@ -1770,16 +1759,10 @@ QgsSvgMarkerSymbolLayerWidget::QgsSvgMarkerSymbolLayerWidget( const QgsVectorLay connect( this, SIGNAL( changed() ), this, SLOT( updateAssistantSymbol() ) ); //make a temporary symbol for the size assistant preview - mAssistantPreviewSymbol = new QgsMarkerSymbol(); -#if 0 - if ( vectorLayer() ) - mSizeDDBtn->setAssistant( tr( "Size Assistant..." ), new QgsSizeScaleWidget( vectorLayer(), mAssistantPreviewSymbol ) ); -#endif -} + mAssistantPreviewSymbol.reset( new QgsMarkerSymbol() ); -QgsSvgMarkerSymbolLayerWidget::~QgsSvgMarkerSymbolLayerWidget() -{ - delete mAssistantPreviewSymbol; + if ( vectorLayer() ) + mSizeDDBtn->setSymbol( mAssistantPreviewSymbol ); } #include @@ -2688,12 +2671,10 @@ QgsFontMarkerSymbolLayerWidget::QgsFontMarkerSymbolLayerWidget( const QgsVectorL spinOffsetY->setClearValue( 0.0 ); //make a temporary symbol for the size assistant preview - mAssistantPreviewSymbol = new QgsMarkerSymbol(); + mAssistantPreviewSymbol.reset( new QgsMarkerSymbol() ); -#if 0 if ( vectorLayer() ) - mSizeDDBtn->setAssistant( tr( "Size Assistant..." ), new QgsSizeScaleWidget( vectorLayer(), mAssistantPreviewSymbol ) ); -#endif + mSizeDDBtn->setSymbol( mAssistantPreviewSymbol ); connect( cboFont, SIGNAL( currentFontChanged( const QFont & ) ), this, SLOT( setFontFamily( const QFont& ) ) ); connect( spinSize, SIGNAL( valueChanged( double ) ), this, SLOT( setSize( double ) ) ); @@ -2708,11 +2689,6 @@ QgsFontMarkerSymbolLayerWidget::QgsFontMarkerSymbolLayerWidget( const QgsVectorL connect( this, SIGNAL( changed() ), this, SLOT( updateAssistantSymbol() ) ); } -QgsFontMarkerSymbolLayerWidget::~QgsFontMarkerSymbolLayerWidget() -{ - delete mAssistantPreviewSymbol; -} - void QgsFontMarkerSymbolLayerWidget::setSymbolLayer( QgsSymbolLayer* layer ) { if ( layer->layerType() != QLatin1String( "FontMarker" ) ) diff --git a/src/gui/symbology-ng/qgssymbollayerwidget.h b/src/gui/symbology-ng/qgssymbollayerwidget.h index cd008edf340a..edd8d31a4636 100644 --- a/src/gui/symbology-ng/qgssymbollayerwidget.h +++ b/src/gui/symbology-ng/qgssymbollayerwidget.h @@ -201,7 +201,7 @@ class GUI_EXPORT QgsSimpleMarkerSymbolLayerWidget : public QgsSymbolLayerWidget, private: - QgsMarkerSymbol* mAssistantPreviewSymbol; + std::shared_ptr< QgsMarkerSymbol > mAssistantPreviewSymbol; }; /////////// @@ -264,8 +264,6 @@ class GUI_EXPORT QgsFilledMarkerSymbolLayerWidget : public QgsSymbolLayerWidget, */ QgsFilledMarkerSymbolLayerWidget( const QgsVectorLayer* vl, QWidget* parent = nullptr ); - ~QgsFilledMarkerSymbolLayerWidget(); - /** Creates a new QgsFilledMarkerSymbolLayerWidget. * @param vl associated vector layer */ @@ -292,7 +290,7 @@ class GUI_EXPORT QgsFilledMarkerSymbolLayerWidget : public QgsSymbolLayerWidget, private: - QgsMarkerSymbol* mAssistantPreviewSymbol; + std::shared_ptr< QgsMarkerSymbol > mAssistantPreviewSymbol; }; /////////// @@ -431,7 +429,6 @@ class GUI_EXPORT QgsSvgMarkerSymbolLayerWidget : public QgsSymbolLayerWidget, pr public: QgsSvgMarkerSymbolLayerWidget( const QgsVectorLayer* vl, QWidget* parent = nullptr ); - ~QgsSvgMarkerSymbolLayerWidget(); static QgsSymbolLayerWidget* create( const QgsVectorLayer* vl ) { return new QgsSvgMarkerSymbolLayerWidget( vl ); } @@ -471,7 +468,7 @@ class GUI_EXPORT QgsSvgMarkerSymbolLayerWidget : public QgsSymbolLayerWidget, pr private: - QgsMarkerSymbol* mAssistantPreviewSymbol; + std::shared_ptr< QgsMarkerSymbol > mAssistantPreviewSymbol; }; @@ -646,8 +643,6 @@ class GUI_EXPORT QgsFontMarkerSymbolLayerWidget : public QgsSymbolLayerWidget, p public: QgsFontMarkerSymbolLayerWidget( const QgsVectorLayer* vl, QWidget* parent = nullptr ); - ~QgsFontMarkerSymbolLayerWidget(); - static QgsSymbolLayerWidget* create( const QgsVectorLayer* vl ) { return new QgsFontMarkerSymbolLayerWidget( vl ); } // from base class @@ -683,7 +678,7 @@ class GUI_EXPORT QgsFontMarkerSymbolLayerWidget : public QgsSymbolLayerWidget, p private: - QgsMarkerSymbol* mAssistantPreviewSymbol; + std::shared_ptr< QgsMarkerSymbol > mAssistantPreviewSymbol; }; diff --git a/src/gui/symbology-ng/qgssymbolslistwidget.cpp b/src/gui/symbology-ng/qgssymbolslistwidget.cpp index ca74ac04a087..9331b7547560 100644 --- a/src/gui/symbology-ng/qgssymbolslistwidget.cpp +++ b/src/gui/symbology-ng/qgssymbolslistwidget.cpp @@ -105,12 +105,8 @@ QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbol* symbol, QgsStyle* style, registerDataDefinedButton( mWidthDDBtn, QgsSymbolLayer::PropertyOutlineWidth ); connect( mWidthDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsSymbolsListWidget::updateDataDefinedLineWidth ); -#if 0 - if ( mSymbol->type() == QgsSymbol::Marker && mLayer ) - mSizeDDBtn->setAssistant( tr( "Size Assistant..." ), new QgsSizeScaleWidget( mLayer, mSymbol ) ); - else if ( mSymbol->type() == QgsSymbol::Line && mLayer ) - mWidthDDBtn->setAssistant( tr( "Width Assistant..." ), new QgsSizeScaleWidget( mLayer, mSymbol ) ); -#endif + connect( this, &QgsSymbolsListWidget::changed, this, &QgsSymbolsListWidget::updateAssistantSymbol ); + updateAssistantSymbol(); // Live color updates are not undoable to child symbol layers btnColor->setAcceptLiveUpdates( false ); @@ -370,6 +366,17 @@ void QgsSymbolsListWidget::updateDataDefinedLineWidth() } } +void QgsSymbolsListWidget::updateAssistantSymbol() +{ + mAssistantSymbol.reset( mSymbol->clone() ); + if ( mSymbol->type() == QgsSymbol::Marker ) + mSizeDDBtn->setSymbol( mAssistantSymbol ); +#if 0 + else if ( mSymbol->type() == QgsSymbol::Line && mLayer ) + mWidthDDBtn->setAssistant( tr( "Width Assistant..." ), new QgsSizeScaleWidget( mLayer, mSymbol ) ); +#endif +} + void QgsSymbolsListWidget::symbolAddedToStyle( const QString& name, QgsSymbol* symbol ) { Q_UNUSED( name ); diff --git a/src/gui/symbology-ng/qgssymbolslistwidget.h b/src/gui/symbology-ng/qgssymbolslistwidget.h index 00420be03827..0e1c7c385648 100644 --- a/src/gui/symbology-ng/qgssymbolslistwidget.h +++ b/src/gui/symbology-ng/qgssymbolslistwidget.h @@ -89,8 +89,13 @@ class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::SymbolsListW signals: void changed(); + private slots: + + void updateAssistantSymbol(); + private: QgsSymbol* mSymbol; + std::shared_ptr< QgsSymbol > mAssistantSymbol; QgsStyle* mStyle; QMenu* mAdvancedMenu; QAction* mClipFeaturesAction; diff --git a/src/ui/qgspropertyassistantwidgetbase.ui b/src/ui/qgspropertyassistantwidgetbase.ui index be3a373855b2..c0be823db791 100644 --- a/src/ui/qgspropertyassistantwidgetbase.ui +++ b/src/ui/qgspropertyassistantwidgetbase.ui @@ -6,8 +6,8 @@ 0 0 - 316 - 343 + 522 + 332 @@ -50,9 +50,6 @@ - - - @@ -132,6 +129,16 @@ + + + + + 200 + 0 + + + + @@ -158,7 +165,6 @@ minValueSpinBox maxValueSpinBox computeValuesButton - mLegendPreview