From a77935f49170bc639a649728125210cd4a76db8f Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 17 Sep 2015 20:34:51 +1000 Subject: [PATCH] Use actual map canvas variables & values for symbology widgets --- python/gui/qgsdatadefinedbutton.sip | 24 ++++ python/gui/qgsmapcanvas.sip | 6 + .../gui/symbology-ng/qgsrendererv2widget.sip | 114 ++++++++++++++++++ .../gui/symbology-ng/qgssizescalewidget.sip | 5 + .../symbology-ng/qgssymbollayerv2widget.sip | 7 ++ .../gui/symbology-ng/qgssymbolslistwidget.sip | 7 ++ src/gui/qgsdatadefinedbutton.cpp | 5 + src/gui/qgsdatadefinedbutton.h | 28 +++++ src/gui/qgsmapcanvas.h | 6 + .../qgscategorizedsymbolrendererv2widget.cpp | 24 ++-- .../qgsgraduatedsymbolrendererv2widget.cpp | 24 ++-- .../symbology-ng/qgsheatmaprendererwidget.cpp | 22 +++- src/gui/symbology-ng/qgsrendererv2widget.cpp | 47 ++++++-- src/gui/symbology-ng/qgsrendererv2widget.h | 32 +++++ .../qgsrulebasedrendererv2widget.cpp | 45 +++++-- src/gui/symbology-ng/qgssizescalewidget.cpp | 25 ++-- src/gui/symbology-ng/qgssizescalewidget.h | 7 ++ .../symbology-ng/qgssymbollayerv2widget.cpp | 26 +++- src/gui/symbology-ng/qgssymbollayerv2widget.h | 7 ++ src/gui/symbology-ng/qgssymbolslistwidget.cpp | 28 ++++- src/gui/symbology-ng/qgssymbolslistwidget.h | 8 ++ 21 files changed, 443 insertions(+), 54 deletions(-) diff --git a/python/gui/qgsdatadefinedbutton.sip b/python/gui/qgsdatadefinedbutton.sip index 5624d6393aa..f178087fc29 100644 --- a/python/gui/qgsdatadefinedbutton.sip +++ b/python/gui/qgsdatadefinedbutton.sip @@ -11,7 +11,24 @@ class QgsDataDefinedAssistant: QDialog #include %End public: + QgsDataDefinedAssistant(); + virtual QgsDataDefined dataDefined() const = 0; + + /** Sets the map canvas associated with the widget. This allows the widget to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @see mapCanvas() + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + }; /** \ingroup gui @@ -187,9 +204,16 @@ class QgsDataDefinedButton : QToolButton * @param assistant data defined assistant. Set to null to remove the assistant * option from the button. * @note added in 2.10 + * @see assistant() */ void setAssistant( const QString& title, QgsDataDefinedAssistant * assistant /Transfer/ ); + /** Returns the assistant used to defined the data defined object properties, if set. + * @see setAssistant() + * @note added in QGIS 2.12 + */ + QgsDataDefinedAssistant* assistant(); + /** * Common descriptions for expected input values */ diff --git a/python/gui/qgsmapcanvas.sip b/python/gui/qgsmapcanvas.sip index bd787c6486d..19816c507ad 100644 --- a/python/gui/qgsmapcanvas.sip +++ b/python/gui/qgsmapcanvas.sip @@ -356,6 +356,12 @@ class QgsMapCanvas : QGraphicsView */ QgsExpressionContextScope& expressionContextScope(); + /** Returns a const reference to the expression context scope for the map canvas. + * @note added in QGIS 2.12 + * @see setExpressionContextScope() + */ + // const QgsExpressionContextScope& expressionContextScope() const; + public slots: /** Repaints the canvas map*/ diff --git a/python/gui/symbology-ng/qgsrendererv2widget.sip b/python/gui/symbology-ng/qgsrendererv2widget.sip index 825cb253a0c..e55b48085c0 100644 --- a/python/gui/symbology-ng/qgsrendererv2widget.sip +++ b/python/gui/symbology-ng/qgsrendererv2widget.sip @@ -18,10 +18,22 @@ class QgsRendererV2Widget : QWidget /** Sets the map canvas associated with the widget. This allows the widget to retrieve the current * map scale and other properties from the canvas. * @param canvas map canvas + * @see mapCanvas() * @note added in QGIS 2.12 */ virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + + /** Returns the vector layer associated with the widget. + * @note added in QGIS 2.12 + */ + const QgsVectorLayer* vectorLayer() const; + protected: /** Subclasses may provide the capability of changing multiple symbols at once by implementing the following two methods and by connecting the slot contextMenuViewCategories(const QPoint&)*/ @@ -45,3 +57,105 @@ class QgsRendererV2Widget : QWidget virtual void paste(); }; + + +/** +Utility classes for "en masse" size definition +*/ +class QgsDataDefinedValueDialog : QDialog +{ +%TypeHeaderCode +#include +%End + + public: + /** Constructor + * @param symbolList must not be empty + * @param layer must not be null + * @param label value label + */ + QgsDataDefinedValueDialog( const QList& symbolList, QgsVectorLayer * layer, const QString & label ); + virtual ~QgsDataDefinedValueDialog(); + + /** Sets the map canvas associated with the dialog. This allows the dialog to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @see mapCanvas() + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + + /** Returns the vector layer associated with the widget. + * @note added in QGIS 2.12 + */ + const QgsVectorLayer* vectorLayer() const; + + public slots: + void dataDefinedChanged(); + + protected: + QgsDataDefined symbolDataDefined() const; + void init( const QString & description ); // needed in children ctor to call virtual + + virtual QgsDataDefined symbolDataDefined( const QgsSymbolV2 * ) const = 0; + virtual double value( const QgsSymbolV2 * ) const = 0; + virtual void setDataDefined( QgsSymbolV2* symbol, const QgsDataDefined& dd ) = 0; +}; + +class QgsDataDefinedSizeDialog : QgsDataDefinedValueDialog +{ +%TypeHeaderCode +#include +%End + + public: + QgsDataDefinedSizeDialog( const QList& symbolList, QgsVectorLayer * layer ); + + protected: + QgsDataDefined symbolDataDefined( const QgsSymbolV2 * symbol ) const; + + double value( const QgsSymbolV2 * symbol ) const; + + void setDataDefined( QgsSymbolV2* symbol, const QgsDataDefined& dd ); +}; + +class QgsDataDefinedRotationDialog : QgsDataDefinedValueDialog +{ +%TypeHeaderCode +#include +%End + + public: + QgsDataDefinedRotationDialog( const QList& symbolList, QgsVectorLayer * layer ); + + protected: + QgsDataDefined symbolDataDefined( const QgsSymbolV2 * symbol ) const; + + double value( const QgsSymbolV2 * symbol ) const; + + void setDataDefined( QgsSymbolV2* symbol, const QgsDataDefined& dd ); +}; + + +class QgsDataDefinedWidthDialog : QgsDataDefinedValueDialog +{ +%TypeHeaderCode +#include +%End + + public: + QgsDataDefinedWidthDialog( const QList& symbolList, QgsVectorLayer * layer ); + + protected: + QgsDataDefined symbolDataDefined( const QgsSymbolV2 * symbol ) const; + + double value( const QgsSymbolV2 * symbol ) const; + + void setDataDefined( QgsSymbolV2* symbol, const QgsDataDefined& dd ); +}; diff --git a/python/gui/symbology-ng/qgssizescalewidget.sip b/python/gui/symbology-ng/qgssizescalewidget.sip index 0b8eeb4c91f..cacfbd674c8 100644 --- a/python/gui/symbology-ng/qgssizescalewidget.sip +++ b/python/gui/symbology-ng/qgssizescalewidget.sip @@ -8,6 +8,11 @@ class QgsSizeScaleWidget : QgsDataDefinedAssistant QgsDataDefined dataDefined() const; + /** Returns the vector layer associated with the widget. + * @note added in QGIS 2.12 + */ + const QgsVectorLayer* layer() const; + protected: virtual void showEvent( QShowEvent * ); diff --git a/python/gui/symbology-ng/qgssymbollayerv2widget.sip b/python/gui/symbology-ng/qgssymbollayerv2widget.sip index 7b3f77086f3..5209cc2acad 100644 --- a/python/gui/symbology-ng/qgssymbollayerv2widget.sip +++ b/python/gui/symbology-ng/qgssymbollayerv2widget.sip @@ -23,10 +23,17 @@ class QgsSymbolLayerV2Widget : QWidget /** Sets the map canvas associated with the widget. This allows the widget to retrieve the current * map scale and other properties from the canvas. * @param canvas map canvas + * @see mapCanvas() * @note added in QGIS 2.12 */ virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + /** Returns the vector layer associated with the widget. * @note added in QGIS 2.12 */ diff --git a/python/gui/symbology-ng/qgssymbolslistwidget.sip b/python/gui/symbology-ng/qgssymbolslistwidget.sip index 98467ea361e..b3fe4d1f60b 100644 --- a/python/gui/symbology-ng/qgssymbolslistwidget.sip +++ b/python/gui/symbology-ng/qgssymbolslistwidget.sip @@ -17,10 +17,17 @@ class QgsSymbolsListWidget : QWidget /** Sets the map canvas associated with the widget. This allows the widget to retrieve the current * map scale and other properties from the canvas. * @param canvas map canvas + * @see mapCanvas() * @note added in QGIS 2.12 */ virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + /** Returns the vector layer associated with the widget. * @note added in QGIS 2.12 */ diff --git a/src/gui/qgsdatadefinedbutton.cpp b/src/gui/qgsdatadefinedbutton.cpp index d4a4c7152cb..17dfe68b0ed 100644 --- a/src/gui/qgsdatadefinedbutton.cpp +++ b/src/gui/qgsdatadefinedbutton.cpp @@ -698,6 +698,11 @@ void QgsDataDefinedButton::setAssistant( const QString& title, QgsDataDefinedAss mAssistant.data()->setParent( this, Qt::Dialog ); } +QgsDataDefinedAssistant *QgsDataDefinedButton::assistant() +{ + return mAssistant.data(); +} + void QgsDataDefinedButton::checkCheckedWidgets( bool check ) { // don't uncheck, only set to checked diff --git a/src/gui/qgsdatadefinedbutton.h b/src/gui/qgsdatadefinedbutton.h index 272b0b36a52..30d93a5d394 100644 --- a/src/gui/qgsdatadefinedbutton.h +++ b/src/gui/qgsdatadefinedbutton.h @@ -25,6 +25,7 @@ class QgsVectorLayer; class QgsDataDefined; +class QgsMapCanvas; /** \ingroup gui * \class QgsDataDefinedAssistant @@ -36,7 +37,27 @@ class QgsDataDefined; class GUI_EXPORT QgsDataDefinedAssistant: public QDialog { public: + QgsDataDefinedAssistant() : mMapCanvas( 0 ) {} + virtual QgsDataDefined dataDefined() const = 0; + + /** Sets the map canvas associated with the widget. This allows the widget to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @see mapCanvas() + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ) { mMapCanvas = canvas; } + + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const { return mMapCanvas; } + + protected: + + QgsMapCanvas* mMapCanvas; }; /** \ingroup gui @@ -214,9 +235,16 @@ class GUI_EXPORT QgsDataDefinedButton: public QToolButton * @param assistant data defined assistant. Set to null to remove the assistant * option from the button. * @note added in 2.10 + * @see assistant() */ void setAssistant( const QString& title, QgsDataDefinedAssistant * assistant ); + /** Returns the assistant used to defined the data defined object properties, if set. + * @see setAssistant() + * @note added in QGIS 2.12 + */ + QgsDataDefinedAssistant* assistant(); + /** * Common descriptions for expected input values */ diff --git a/src/gui/qgsmapcanvas.h b/src/gui/qgsmapcanvas.h index 5cd9a33ae8d..61e77c1313a 100644 --- a/src/gui/qgsmapcanvas.h +++ b/src/gui/qgsmapcanvas.h @@ -428,6 +428,12 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView */ QgsExpressionContextScope& expressionContextScope() { return mExpressionContextScope; } + /** Returns a const reference to the expression context scope for the map canvas. + * @note added in QGIS 2.12 + * @see setExpressionContextScope() + */ + const QgsExpressionContextScope& expressionContextScope() const { return mExpressionContextScope; } + public slots: /** Repaints the canvas map*/ diff --git a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp index ca19f0298dd..591fb8f5783 100644 --- a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp @@ -29,6 +29,7 @@ #include "qgsproject.h" #include "qgsexpression.h" +#include "qgsmapcanvas.h" #include #include @@ -372,16 +373,25 @@ QgsRendererV2Widget* QgsCategorizedSymbolRendererV2Widget::create( QgsVectorLaye static QgsExpressionContext _getExpressionContext( const void* context ) { + const QgsCategorizedSymbolRendererV2Widget* widget = ( const QgsCategorizedSymbolRendererV2Widget* ) context; + QgsExpressionContext expContext; expContext << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + << QgsExpressionContextUtils::atlasScope( 0 ); - const QgsVectorLayer* layer = ( const QgsVectorLayer* ) context; - if ( layer ) - expContext << QgsExpressionContextUtils::layerScope( layer ); + if ( widget->mapCanvas() ) + { + expContext << QgsExpressionContextUtils::mapSettingsScope( widget->mapCanvas()->mapSettings() ) + << new QgsExpressionContextScope( widget->mapCanvas()->expressionContextScope() ); + } + else + { + expContext << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } + + if ( widget->vectorLayer() ) + expContext << QgsExpressionContextUtils::layerScope( widget->vectorLayer() ); return expContext; } @@ -468,7 +478,7 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV btnAdvanced->setMenu( advMenu ); - mExpressionWidget->registerGetExpressionContextCallback( &_getExpressionContext, layer ); + mExpressionWidget->registerGetExpressionContextCallback( &_getExpressionContext, this ); } QgsCategorizedSymbolRendererV2Widget::~QgsCategorizedSymbolRendererV2Widget() diff --git a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp index d6bcd405bff..106794ea27e 100644 --- a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp @@ -27,6 +27,7 @@ #include "qgsludialog.h" #include "qgsproject.h" +#include "qgsmapcanvas.h" #include #include @@ -381,16 +382,25 @@ QgsRendererV2Widget* QgsGraduatedSymbolRendererV2Widget::create( QgsVectorLayer* static QgsExpressionContext _getExpressionContext( const void* context ) { + const QgsGraduatedSymbolRendererV2Widget* widget = ( const QgsGraduatedSymbolRendererV2Widget* ) context; + QgsExpressionContext expContext; expContext << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + << QgsExpressionContextUtils::atlasScope( 0 ); - const QgsVectorLayer* layer = ( const QgsVectorLayer* ) context; - if ( layer ) - expContext << QgsExpressionContextUtils::layerScope( layer ); + if ( widget->mapCanvas() ) + { + expContext << QgsExpressionContextUtils::mapSettingsScope( widget->mapCanvas()->mapSettings() ) + << new QgsExpressionContextScope( widget->mapCanvas()->expressionContextScope() ); + } + else + { + expContext << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } + + if ( widget->vectorLayer() ) + expContext << QgsExpressionContextUtils::layerScope( widget->vectorLayer() ); return expContext; } @@ -489,7 +499,7 @@ QgsGraduatedSymbolRendererV2Widget::QgsGraduatedSymbolRendererV2Widget( QgsVecto connect( mHistogramWidget, SIGNAL( rangesModified( bool ) ), this, SLOT( refreshRanges( bool ) ) ); connect( mExpressionWidget, SIGNAL( fieldChanged( QString ) ), mHistogramWidget, SLOT( setSourceFieldExp( QString ) ) ); - mExpressionWidget->registerGetExpressionContextCallback( &_getExpressionContext, mLayer ); + mExpressionWidget->registerGetExpressionContextCallback( &_getExpressionContext, this ); } void QgsGraduatedSymbolRendererV2Widget::on_mSizeUnitWidget_changed() diff --git a/src/gui/symbology-ng/qgsheatmaprendererwidget.cpp b/src/gui/symbology-ng/qgsheatmaprendererwidget.cpp index ddd4af02430..c1f6633546c 100644 --- a/src/gui/symbology-ng/qgsheatmaprendererwidget.cpp +++ b/src/gui/symbology-ng/qgsheatmaprendererwidget.cpp @@ -23,6 +23,7 @@ #include "qgsvectorcolorrampv2.h" #include "qgsstylev2.h" #include "qgsproject.h" +#include "qgsmapcanvas.h" #include #include @@ -33,16 +34,25 @@ QgsRendererV2Widget* QgsHeatmapRendererWidget::create( QgsVectorLayer* layer, Qg static QgsExpressionContext _getExpressionContext( const void* context ) { + const QgsHeatmapRendererWidget* widget = ( const QgsHeatmapRendererWidget* ) context; + QgsExpressionContext expContext; expContext << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + << QgsExpressionContextUtils::atlasScope( 0 ); - const QgsVectorLayer* layer = ( const QgsVectorLayer* ) context; - if ( layer ) - expContext << QgsExpressionContextUtils::layerScope( layer ); + if ( widget->mapCanvas() ) + { + expContext << QgsExpressionContextUtils::mapSettingsScope( widget->mapCanvas()->mapSettings() ) + << new QgsExpressionContextScope( widget->mapCanvas()->expressionContextScope() ); + } + else + { + expContext << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } + + if ( widget->vectorLayer() ) + expContext << QgsExpressionContextUtils::layerScope( widget->vectorLayer() ); return expContext; } diff --git a/src/gui/symbology-ng/qgsrendererv2widget.cpp b/src/gui/symbology-ng/qgsrendererv2widget.cpp index 4ff2bf6f59a..7552844ea25 100644 --- a/src/gui/symbology-ng/qgsrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsrendererv2widget.cpp @@ -18,6 +18,7 @@ #include "qgscolordialog.h" #include "qgssymbollevelsv2dialog.h" #include "qgsexpressionbuilderdialog.h" +#include "qgsmapcanvas.h" #include #include @@ -132,6 +133,7 @@ void QgsRendererV2Widget::changeSymbolWidth() } QgsDataDefinedWidthDialog dlg( symbolList, mLayer ); + dlg.setMapCanvas( mMapCanvas ); if ( QDialog::Accepted == dlg.exec() ) { @@ -157,6 +159,7 @@ void QgsRendererV2Widget::changeSymbolSize() } QgsDataDefinedSizeDialog dlg( symbolList, mLayer ); + dlg.setMapCanvas( mMapCanvas ); if ( QDialog::Accepted == dlg.exec() ) { @@ -182,6 +185,7 @@ void QgsRendererV2Widget::changeSymbolAngle() } QgsDataDefinedRotationDialog dlg( symbolList, mLayer ); + dlg.setMapCanvas( mMapCanvas ); if ( QDialog::Accepted == dlg.exec() ) { @@ -215,6 +219,11 @@ void QgsRendererV2Widget::setMapCanvas( QgsMapCanvas *canvas ) mMapCanvas = canvas; } +const QgsMapCanvas*QgsRendererV2Widget::mapCanvas() const +{ + return mMapCanvas; +} + //////////// @@ -397,6 +406,7 @@ void QgsRendererV2DataDefinedMenus::updateMenu( QActionGroup* actionGroup, QStri QgsDataDefinedValueDialog::QgsDataDefinedValueDialog( const QList& symbolList, QgsVectorLayer * layer, const QString & label ) : mSymbolList( symbolList ) , mLayer( layer ) + , mMapCanvas( 0 ) { setupUi( this ); setWindowFlags( Qt::WindowStaysOnTopHint ); @@ -406,18 +416,41 @@ QgsDataDefinedValueDialog::QgsDataDefinedValueDialog( const QList& } +void QgsDataDefinedValueDialog::setMapCanvas( QgsMapCanvas *canvas ) +{ + mMapCanvas = canvas; + Q_FOREACH ( QgsDataDefinedButton* ddButton, findChildren() ) + { + if ( ddButton->assistant() ) + ddButton->assistant()->setMapCanvas( mMapCanvas ); + } +} + +const QgsMapCanvas *QgsDataDefinedValueDialog::mapCanvas() const +{ + return mMapCanvas; +} + static QgsExpressionContext _getExpressionContext( const void* context ) { + const QgsDataDefinedValueDialog* widget = ( const QgsDataDefinedValueDialog* ) context; + QgsExpressionContext expContext; expContext << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + << QgsExpressionContextUtils::atlasScope( 0 ); + if ( widget->mapCanvas() ) + { + expContext << QgsExpressionContextUtils::mapSettingsScope( widget->mapCanvas()->mapSettings() ) + << new QgsExpressionContextScope( widget->mapCanvas()->expressionContextScope() ); + } + else + { + expContext << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } - const QgsVectorLayer* layer = ( const QgsVectorLayer* ) context; - if ( layer ) - expContext << QgsExpressionContextUtils::layerScope( layer ); + if ( widget->vectorLayer() ) + expContext << QgsExpressionContextUtils::layerScope( widget->vectorLayer() ); return expContext; } @@ -426,7 +459,7 @@ void QgsDataDefinedValueDialog::init( const QString & description ) { QgsDataDefined dd = symbolDataDefined(); mDDBtn->init( mLayer, &dd, QgsDataDefinedButton::Double, description ); - mDDBtn->registerGetExpressionContextCallback( &_getExpressionContext, const_cast< QgsVectorLayer* >( mLayer ) ); + mDDBtn->registerGetExpressionContextCallback( &_getExpressionContext, this ); mSpinBox->setValue( value( mSymbolList.back() ) ); mSpinBox->setEnabled( !mDDBtn->isActive() ); } diff --git a/src/gui/symbology-ng/qgsrendererv2widget.h b/src/gui/symbology-ng/qgsrendererv2widget.h index 05b62f8e35a..9d3887256df 100644 --- a/src/gui/symbology-ng/qgsrendererv2widget.h +++ b/src/gui/symbology-ng/qgsrendererv2widget.h @@ -53,10 +53,22 @@ class GUI_EXPORT QgsRendererV2Widget : public QWidget /** Sets the map canvas associated with the widget. This allows the widget to retrieve the current * map scale and other properties from the canvas. * @param canvas map canvas + * @see mapCanvas() * @note added in QGIS 2.12 */ virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + + /** Returns the vector layer associated with the widget. + * @note added in QGIS 2.12 + */ + const QgsVectorLayer* vectorLayer() const { return mLayer; } + protected: QgsVectorLayer* mLayer; QgsStyleV2* mStyle; @@ -159,6 +171,25 @@ class GUI_EXPORT QgsDataDefinedValueDialog : public QDialog, public Ui::QgsDataD QgsDataDefinedValueDialog( const QList& symbolList, QgsVectorLayer * layer, const QString & label ); virtual ~QgsDataDefinedValueDialog() {} + /** Sets the map canvas associated with the dialog. This allows the dialog to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @see mapCanvas() + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + + /** Returns the vector layer associated with the widget. + * @note added in QGIS 2.12 + */ + const QgsVectorLayer* vectorLayer() const { return mLayer; } + public slots: void dataDefinedChanged(); @@ -172,6 +203,7 @@ class GUI_EXPORT QgsDataDefinedValueDialog : public QDialog, public Ui::QgsDataD QList mSymbolList; QgsVectorLayer* mLayer; + QgsMapCanvas* mMapCanvas; }; class GUI_EXPORT QgsDataDefinedSizeDialog : public QgsDataDefinedValueDialog diff --git a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp index 383ac87ba68..f8872623056 100644 --- a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp @@ -510,10 +510,17 @@ void QgsRuleBasedRendererV2Widget::countFeatures() QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ) - << QgsExpressionContextUtils::layerScope( mLayer ); + << QgsExpressionContextUtils::atlasScope( 0 ); + if ( mMapCanvas ) + { + context << QgsExpressionContextUtils::mapSettingsScope( mMapCanvas->mapSettings() ) + << new QgsExpressionContextScope( mMapCanvas->expressionContextScope() ); + } + else + { + context << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } + context << QgsExpressionContextUtils::layerScope( mLayer ); renderContext.setExpressionContext( context ); @@ -637,10 +644,17 @@ void QgsRendererRulePropsDialog::buildExpression() QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ) - << QgsExpressionContextUtils::layerScope( mLayer ); + << QgsExpressionContextUtils::atlasScope( 0 ); + if ( mMapCanvas ) + { + context << QgsExpressionContextUtils::mapSettingsScope( mMapCanvas->mapSettings() ) + << new QgsExpressionContextScope( mMapCanvas->expressionContextScope() ); + } + else + { + context << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } + context << QgsExpressionContextUtils::layerScope( mLayer ); QgsExpressionBuilderDialog dlg( mLayer, editFilter->text(), this, "generic", context ); @@ -660,10 +674,17 @@ void QgsRendererRulePropsDialog::testFilter() QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ) - << QgsExpressionContextUtils::layerScope( mLayer ); + << QgsExpressionContextUtils::atlasScope( 0 ); + if ( mMapCanvas ) + { + context << QgsExpressionContextUtils::mapSettingsScope( mMapCanvas->mapSettings() ) + << new QgsExpressionContextScope( mMapCanvas->expressionContextScope() ); + } + else + { + context << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } + context << QgsExpressionContextUtils::layerScope( mLayer ); if ( !filter.prepare( &context ) ) { diff --git a/src/gui/symbology-ng/qgssizescalewidget.cpp b/src/gui/symbology-ng/qgssizescalewidget.cpp index 3f716513346..43134f42c42 100644 --- a/src/gui/symbology-ng/qgssizescalewidget.cpp +++ b/src/gui/symbology-ng/qgssizescalewidget.cpp @@ -24,6 +24,7 @@ #include "qgssymbollayerv2utils.h" #include "qgsscaleexpression.h" #include "qgsdatadefined.h" +#include "qgsmapcanvas.h" #include #include @@ -80,16 +81,25 @@ void QgsSizeScaleWidget::setFromSymbol() static QgsExpressionContext _getExpressionContext( const void* context ) { + const QgsSizeScaleWidget* widget = ( const QgsSizeScaleWidget* ) context; + QgsExpressionContext expContext; expContext << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + << QgsExpressionContextUtils::atlasScope( 0 ); - const QgsVectorLayer* layer = ( const QgsVectorLayer* ) context; - if ( layer ) - expContext << QgsExpressionContextUtils::layerScope( layer ); + if ( widget->mapCanvas() ) + { + expContext << QgsExpressionContextUtils::mapSettingsScope( widget->mapCanvas()->mapSettings() ) + << new QgsExpressionContextScope( widget->mapCanvas()->expressionContextScope() ); + } + else + { + expContext << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } + + if ( widget->layer() ) + expContext << QgsExpressionContextUtils::layerScope( widget->layer() ); return expContext; } @@ -99,11 +109,12 @@ QgsSizeScaleWidget::QgsSizeScaleWidget( const QgsVectorLayer * layer, const QgsM // we just use the minimumValue and maximumValue from the layer, unfortunately they are // non const, so we get the layer from the registry instead , mLayer( layer ? dynamic_cast( QgsMapLayerRegistry::instance()->mapLayer( layer->id() ) ) : 0 ) + , mMapCanvas( 0 ) { setupUi( this ); setWindowFlags( Qt::WindowStaysOnTopHint ); - mExpressionWidget->registerGetExpressionContextCallback( &_getExpressionContext, mLayer ); + mExpressionWidget->registerGetExpressionContextCallback( &_getExpressionContext, this ); if ( mLayer ) { diff --git a/src/gui/symbology-ng/qgssizescalewidget.h b/src/gui/symbology-ng/qgssizescalewidget.h index 6eb51fba0a8..633a9f512a7 100644 --- a/src/gui/symbology-ng/qgssizescalewidget.h +++ b/src/gui/symbology-ng/qgssizescalewidget.h @@ -28,6 +28,7 @@ class QgsMarkerSymbolV2; class QgsLayerTreeLayer; class QgsScaleExpression; class QgsDataDefined; +class QgsMapCanvas; class GUI_EXPORT QgsSizeScaleWidget : public QgsDataDefinedAssistant, private Ui_SizeScaleBase { @@ -38,6 +39,11 @@ class GUI_EXPORT QgsSizeScaleWidget : public QgsDataDefinedAssistant, private Ui QgsDataDefined dataDefined() const override; + /** Returns the vector layer associated with the widget. + * @note added in QGIS 2.12 + */ + const QgsVectorLayer* layer() const { return mLayer; } + protected: virtual void showEvent( QShowEvent * ) override; @@ -53,6 +59,7 @@ class GUI_EXPORT QgsSizeScaleWidget : public QgsDataDefinedAssistant, private Ui QgsLayerTreeLayer* mLayerTreeLayer; QgsLayerTreeGroup mRoot; QStandardItemModel mPreviewList; + QgsMapCanvas* mMapCanvas; QgsScaleExpression* createExpression() const; void setFromSymbol(); diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp index f87eda94f4b..22243abfef8 100644 --- a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp +++ b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp @@ -30,7 +30,7 @@ #include "qgsvectorgradientcolorrampv2dialog.h" #include "qgsdatadefined.h" #include "qgsstylev2.h" //for symbol selector dialog - +#include "qgsmapcanvas.h" #include "qgsapplication.h" #include "qgslogger.h" @@ -57,9 +57,17 @@ static QgsExpressionContext _getExpressionContext( const void* context ) QgsExpressionContext expContext; expContext << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + << QgsExpressionContextUtils::atlasScope( 0 ); + + if ( widget->mapCanvas() ) + { + expContext << QgsExpressionContextUtils::mapSettingsScope( widget->mapCanvas()->mapSettings() ) + << new QgsExpressionContextScope( widget->mapCanvas()->expressionContextScope() ); + } + else + { + expContext << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } const QgsVectorLayer* layer = widget->vectorLayer(); if ( layer ) @@ -75,6 +83,16 @@ void QgsSymbolLayerV2Widget::setMapCanvas( QgsMapCanvas *canvas ) { unitWidget->setMapCanvas( mMapCanvas ); } + Q_FOREACH ( QgsDataDefinedButton* ddButton, findChildren() ) + { + if ( ddButton->assistant() ) + ddButton->assistant()->setMapCanvas( mMapCanvas ); + } +} + +const QgsMapCanvas* QgsSymbolLayerV2Widget::mapCanvas() const +{ + return mMapCanvas; } void QgsSymbolLayerV2Widget::registerDataDefinedButton( QgsDataDefinedButton * button, const QString & propertyName, QgsDataDefinedButton::DataType type, const QString & description ) diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.h b/src/gui/symbology-ng/qgssymbollayerv2widget.h index bce53befbbf..ca4508c4217 100644 --- a/src/gui/symbology-ng/qgssymbollayerv2widget.h +++ b/src/gui/symbology-ng/qgssymbollayerv2widget.h @@ -47,10 +47,17 @@ class GUI_EXPORT QgsSymbolLayerV2Widget : public QWidget /** Sets the map canvas associated with the widget. This allows the widget to retrieve the current * map scale and other properties from the canvas. * @param canvas map canvas + * @see mapCanvas() * @note added in QGIS 2.12 */ virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + /** Returns the vector layer associated with the widget. * @note added in QGIS 2.12 */ diff --git a/src/gui/symbology-ng/qgssymbolslistwidget.cpp b/src/gui/symbology-ng/qgssymbolslistwidget.cpp index 616312107c8..27bd5e0bb95 100644 --- a/src/gui/symbology-ng/qgssymbolslistwidget.cpp +++ b/src/gui/symbology-ng/qgssymbolslistwidget.cpp @@ -25,7 +25,7 @@ #include "qgsstylev2.h" #include "qgssymbollayerv2utils.h" #include "qgsmarkersymbollayerv2.h" - +#include "qgsmapcanvas.h" #include "qgsapplication.h" #include @@ -47,6 +47,7 @@ QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* sty , mAdvancedMenu( 0 ) , mClipFeaturesAction( 0 ) , mLayer( layer ) + , mMapCanvas( 0 ) , mPresetExpressionContext( 0 ) { setupUi( this ); @@ -119,10 +120,21 @@ QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* sty void QgsSymbolsListWidget::setMapCanvas( QgsMapCanvas* canvas ) { + mMapCanvas = canvas; Q_FOREACH ( QgsUnitSelectionWidget* unitWidget, findChildren() ) { unitWidget->setMapCanvas( canvas ); } + Q_FOREACH ( QgsDataDefinedButton* ddButton, findChildren() ) + { + if ( ddButton->assistant() ) + ddButton->assistant()->setMapCanvas( mMapCanvas ); + } +} + +const QgsMapCanvas*QgsSymbolsListWidget::mapCanvas() const +{ + return mMapCanvas; } void QgsSymbolsListWidget::setExpressionContext( QgsExpressionContext *context ) @@ -385,9 +397,17 @@ static QgsExpressionContext _getExpressionContext( const void* context ) QgsExpressionContext expContext; expContext << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() - << QgsExpressionContextUtils::atlasScope( 0 ) - //TODO - use actual map canvas settings - << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + << QgsExpressionContextUtils::atlasScope( 0 ); + + if ( widget->mapCanvas() ) + { + expContext << QgsExpressionContextUtils::mapSettingsScope( widget->mapCanvas()->mapSettings() ) + << new QgsExpressionContextScope( widget->mapCanvas()->expressionContextScope() ); + } + else + { + expContext << QgsExpressionContextUtils::mapSettingsScope( QgsMapSettings() ); + } const QgsVectorLayer* layer = widget->layer(); if ( layer ) diff --git a/src/gui/symbology-ng/qgssymbolslistwidget.h b/src/gui/symbology-ng/qgssymbolslistwidget.h index 8048a344113..b0e80e02d65 100644 --- a/src/gui/symbology-ng/qgssymbolslistwidget.h +++ b/src/gui/symbology-ng/qgssymbolslistwidget.h @@ -43,10 +43,17 @@ class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::SymbolsListW /** Sets the map canvas associated with the widget. This allows the widget to retrieve the current * map scale and other properties from the canvas. * @param canvas map canvas + * @see mapCanvas() * @note added in QGIS 2.12 */ virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the map canvas associated with the widget. + * @see setMapCanvas + * @note added in QGIS 2.12 + */ + const QgsMapCanvas* mapCanvas() const; + /** Returns the vector layer associated with the widget. * @note added in QGIS 2.12 */ @@ -93,6 +100,7 @@ class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::SymbolsListW QMenu* mAdvancedMenu; QAction* mClipFeaturesAction; const QgsVectorLayer* mLayer; + QgsMapCanvas* mMapCanvas; void populateSymbolView(); void populateSymbols( QStringList symbols );