From a62c6a917a3245cd35e5c6820fc12a71b1f727ce Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 16 Sep 2015 21:55:32 +1000 Subject: [PATCH] Give symbol widgets optional access to a map canvas This allows symbol widgets to fetch properties from the main map canvas, for instance fetching the current scale from the map. --- .../symbology-ng/qgslayerpropertieswidget.sip | 7 +++++++ .../qgspointdisplacementrendererwidget.sip | 1 + .../qgsrendererv2propertiesdialog.sip | 8 +++++++ .../gui/symbology-ng/qgsrendererv2widget.sip | 7 +++++++ .../qgsrulebasedrendererv2widget.sip | 2 +- .../qgssinglesymbolrendererv2widget.sip | 2 ++ .../symbology-ng/qgssymbollayerv2widget.sip | 7 +++++++ .../gui/symbology-ng/qgssymbolslistwidget.sip | 7 +++++++ .../qgssymbolv2selectordialog.sip | 7 +++++++ src/app/qgsvectorlayerproperties.cpp | 1 + src/app/qgsvectorlayerproperties.h | 3 ++- .../qgscategorizedsymbolrendererv2widget.cpp | 3 +++ .../qgsgraduatedsymbolrendererv2widget.cpp | 3 +++ .../symbology-ng/qgsheatmaprendererwidget.cpp | 6 ++++++ .../symbology-ng/qgsheatmaprendererwidget.h | 2 ++ .../qgsinvertedpolygonrendererwidget.cpp | 7 +++++++ .../qgsinvertedpolygonrendererwidget.h | 1 + .../symbology-ng/qgslayerpropertieswidget.cpp | 11 ++++++++++ .../symbology-ng/qgslayerpropertieswidget.h | 10 +++++++++ .../qgspointdisplacementrendererwidget.cpp | 9 ++++++++ .../qgspointdisplacementrendererwidget.h | 1 + .../qgsrendererv2propertiesdialog.cpp | 10 +++++++++ .../qgsrendererv2propertiesdialog.h | 10 +++++++++ src/gui/symbology-ng/qgsrendererv2widget.cpp | 10 ++++++++- src/gui/symbology-ng/qgsrendererv2widget.h | 10 ++++++++- .../qgsrulebasedrendererv2widget.cpp | 12 +++++++---- .../qgsrulebasedrendererv2widget.h | 4 +++- .../qgssinglesymbolrendererv2widget.cpp | 6 ++++++ .../qgssinglesymbolrendererv2widget.h | 3 +++ .../symbology-ng/qgssymbollayerv2widget.cpp | 9 ++++++++ src/gui/symbology-ng/qgssymbollayerv2widget.h | 12 ++++++++++- src/gui/symbology-ng/qgssymbolslistwidget.cpp | 8 +++++++ src/gui/symbology-ng/qgssymbolslistwidget.h | 7 +++++++ .../qgssymbolv2selectordialog.cpp | 21 ++++++++++++++++++- .../symbology-ng/qgssymbolv2selectordialog.h | 11 ++++++++++ tests/src/python/test_qgsdoccoverage.py | 2 +- 36 files changed, 228 insertions(+), 12 deletions(-) diff --git a/python/gui/symbology-ng/qgslayerpropertieswidget.sip b/python/gui/symbology-ng/qgslayerpropertieswidget.sip index ca811cc3620..2e50f67a55b 100644 --- a/python/gui/symbology-ng/qgslayerpropertieswidget.sip +++ b/python/gui/symbology-ng/qgslayerpropertieswidget.sip @@ -15,6 +15,13 @@ class QgsLayerPropertiesWidget : QWidget */ QgsExpressionContext* expressionContext() const; + /** 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 + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + public slots: void layerTypeChanged(); void emitSignalChanged(); diff --git a/python/gui/symbology-ng/qgspointdisplacementrendererwidget.sip b/python/gui/symbology-ng/qgspointdisplacementrendererwidget.sip index 38a044b5368..19444aa7abc 100644 --- a/python/gui/symbology-ng/qgspointdisplacementrendererwidget.sip +++ b/python/gui/symbology-ng/qgspointdisplacementrendererwidget.sip @@ -9,4 +9,5 @@ class QgsPointDisplacementRendererWidget: QgsRendererV2Widget ~QgsPointDisplacementRendererWidget(); QgsFeatureRendererV2* renderer(); + void setMapCanvas( QgsMapCanvas* canvas ); }; diff --git a/python/gui/symbology-ng/qgsrendererv2propertiesdialog.sip b/python/gui/symbology-ng/qgsrendererv2propertiesdialog.sip index 403649b6e6d..bdbd3fa523a 100644 --- a/python/gui/symbology-ng/qgsrendererv2propertiesdialog.sip +++ b/python/gui/symbology-ng/qgsrendererv2propertiesdialog.sip @@ -6,6 +6,14 @@ class QgsRendererV2PropertiesDialog : QDialog public: QgsRendererV2PropertiesDialog( QgsVectorLayer* layer, QgsStyleV2* style, bool embedded = false ); + ~QgsRendererV2PropertiesDialog(); + + /** Sets the map canvas associated with the dialog. This allows the widget to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @note added in QGIS 2.12 + */ + void setMapCanvas( QgsMapCanvas* canvas ); public slots: //! called when user changes renderer type diff --git a/python/gui/symbology-ng/qgsrendererv2widget.sip b/python/gui/symbology-ng/qgsrendererv2widget.sip index 0f3df8f88a0..825cb253a0c 100644 --- a/python/gui/symbology-ng/qgsrendererv2widget.sip +++ b/python/gui/symbology-ng/qgsrendererv2widget.sip @@ -15,6 +15,13 @@ class QgsRendererV2Widget : QWidget //! show a dialog with renderer's symbol level settings void showSymbolLevelsDialog( QgsFeatureRendererV2* r ); + /** 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 + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + 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&)*/ diff --git a/python/gui/symbology-ng/qgsrulebasedrendererv2widget.sip b/python/gui/symbology-ng/qgsrulebasedrendererv2widget.sip index 5570cb24fba..314181369e1 100644 --- a/python/gui/symbology-ng/qgsrulebasedrendererv2widget.sip +++ b/python/gui/symbology-ng/qgsrulebasedrendererv2widget.sip @@ -106,7 +106,7 @@ class QgsRendererRulePropsDialog : QDialog %End public: - QgsRendererRulePropsDialog( QgsRuleBasedRendererV2::Rule* rule, QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent /TransferThis/ = 0 ); + QgsRendererRulePropsDialog( QgsRuleBasedRendererV2::Rule* rule, QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent /TransferThis/ = 0, QgsMapCanvas* mapCanvas = 0 ); ~QgsRendererRulePropsDialog(); QgsRuleBasedRendererV2::Rule* rule(); diff --git a/python/gui/symbology-ng/qgssinglesymbolrendererv2widget.sip b/python/gui/symbology-ng/qgssinglesymbolrendererv2widget.sip index 31e1155072c..438cdb2967a 100644 --- a/python/gui/symbology-ng/qgssinglesymbolrendererv2widget.sip +++ b/python/gui/symbology-ng/qgssinglesymbolrendererv2widget.sip @@ -11,6 +11,8 @@ class QgsSingleSymbolRendererV2Widget : QgsRendererV2Widget virtual QgsFeatureRendererV2* renderer(); + virtual void setMapCanvas( QgsMapCanvas* canvas ); + public slots: void changeSingleSymbol(); diff --git a/python/gui/symbology-ng/qgssymbollayerv2widget.sip b/python/gui/symbology-ng/qgssymbollayerv2widget.sip index c1ae607c3c1..7b3f77086f3 100644 --- a/python/gui/symbology-ng/qgssymbollayerv2widget.sip +++ b/python/gui/symbology-ng/qgssymbollayerv2widget.sip @@ -20,6 +20,13 @@ class QgsSymbolLayerV2Widget : QWidget */ QgsExpressionContext* expressionContext() const; + /** 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 + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** 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 1200ffc3994..98467ea361e 100644 --- a/python/gui/symbology-ng/qgssymbolslistwidget.sip +++ b/python/gui/symbology-ng/qgssymbolslistwidget.sip @@ -14,6 +14,13 @@ class QgsSymbolsListWidget : QWidget */ QgsExpressionContext* expressionContext() const; + /** 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 + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the vector layer associated with the widget. * @note added in QGIS 2.12 */ diff --git a/python/gui/symbology-ng/qgssymbolv2selectordialog.sip b/python/gui/symbology-ng/qgssymbolv2selectordialog.sip index c882ee0a75c..fc03c116293 100644 --- a/python/gui/symbology-ng/qgssymbolv2selectordialog.sip +++ b/python/gui/symbology-ng/qgssymbolv2selectordialog.sip @@ -27,6 +27,13 @@ class QgsSymbolV2SelectorDialog : QDialog */ QgsExpressionContext* expressionContext() const; + /** Sets the map canvas associated with the dialog. This allows the widget to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @note added in QGIS 2.12 + */ + void setMapCanvas( QgsMapCanvas* canvas ); + protected: //! Reimplements dialog keyPress event so we can ignore it void keyPressEvent( QKeyEvent * event ); diff --git a/src/app/qgsvectorlayerproperties.cpp b/src/app/qgsvectorlayerproperties.cpp index 04d45208d61..233cac4664f 100644 --- a/src/app/qgsvectorlayerproperties.cpp +++ b/src/app/qgsvectorlayerproperties.cpp @@ -1237,6 +1237,7 @@ void QgsVectorLayerProperties::updateSymbologyPage() if ( layer->rendererV2() ) { mRendererDialog = new QgsRendererV2PropertiesDialog( layer, QgsStyleV2::defaultStyle(), true ); + mRendererDialog->setMapCanvas( QgisApp::instance()->mapCanvas() ); // display the menu to choose the output format (fix #5136) mActionSaveStyleAs->setText( tr( "Save Style" ) ); diff --git a/src/app/qgsvectorlayerproperties.h b/src/app/qgsvectorlayerproperties.h index f839fc8aa05..55643b671ce 100644 --- a/src/app/qgsvectorlayerproperties.h +++ b/src/app/qgsvectorlayerproperties.h @@ -40,6 +40,7 @@ class QgsVectorLayer; class QgsLabelingGui; class QgsDiagramProperties; class QgsFieldsProperties; +class QgsRendererV2PropertiesDialog; class APP_EXPORT QgsVectorLayerProperties : public QgsOptionsDialogBase, private Ui::QgsVectorLayerPropertiesBase { @@ -164,7 +165,7 @@ class APP_EXPORT QgsVectorLayerProperties : public QgsOptionsDialogBase, private QAction* mActionSaveStyleAs; /** Renderer dialog which is shown*/ - QDialog* mRendererDialog; + QgsRendererV2PropertiesDialog* mRendererDialog; /** Labeling dialog. If apply is pressed, options are applied to vector's QgsLabel */ QgsLabelingGui* labelingDialog; /** Label dialog. If apply is pressed, options are applied to vector's QgsLabel */ diff --git a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp index 70311668e7d..ca19f0298dd 100644 --- a/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp @@ -522,6 +522,7 @@ void QgsCategorizedSymbolRendererV2Widget::changeSelectedSymbols() { QgsSymbolV2* newSymbol = mCategorizedSymbol->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); + dlg.setMapCanvas( mMapCanvas ); if ( !dlg.exec() ) { delete newSymbol; @@ -555,6 +556,7 @@ void QgsCategorizedSymbolRendererV2Widget::changeCategorizedSymbol() QgsSymbolV2* newSymbol = mCategorizedSymbol->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); + dlg.setMapCanvas( mMapCanvas ); if ( !dlg.exec() ) { delete newSymbol; @@ -605,6 +607,7 @@ void QgsCategorizedSymbolRendererV2Widget::changeCategorySymbol() } QgsSymbolV2SelectorDialog dlg( symbol, mStyle, mLayer, this ); + dlg.setMapCanvas( mMapCanvas ); if ( !dlg.exec() ) { delete symbol; diff --git a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp index 10829b367c6..d6bcd405bff 100644 --- a/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp @@ -773,6 +773,7 @@ void QgsGraduatedSymbolRendererV2Widget::changeGraduatedSymbol() QgsSymbolV2* newSymbol = mGraduatedSymbol->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); + dlg.setMapCanvas( mMapCanvas ); if ( !dlg.exec() ) { delete newSymbol; @@ -860,6 +861,7 @@ void QgsGraduatedSymbolRendererV2Widget::changeSelectedSymbols() { QgsSymbolV2* newSymbol = mGraduatedSymbol->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); + dlg.setMapCanvas( mMapCanvas ); if ( !dlg.exec() ) { delete newSymbol; @@ -885,6 +887,7 @@ void QgsGraduatedSymbolRendererV2Widget::changeRangeSymbol( int rangeIdx ) QgsSymbolV2* newSymbol = mRenderer->ranges()[rangeIdx].symbol()->clone(); QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this ); + dlg.setMapCanvas( mMapCanvas ); if ( !dlg.exec() ) { delete newSymbol; diff --git a/src/gui/symbology-ng/qgsheatmaprendererwidget.cpp b/src/gui/symbology-ng/qgsheatmaprendererwidget.cpp index 96d6d30c6dc..ddd4af02430 100644 --- a/src/gui/symbology-ng/qgsheatmaprendererwidget.cpp +++ b/src/gui/symbology-ng/qgsheatmaprendererwidget.cpp @@ -120,6 +120,12 @@ QgsFeatureRendererV2* QgsHeatmapRendererWidget::renderer() return mRenderer; } +void QgsHeatmapRendererWidget::setMapCanvas( QgsMapCanvas* canvas ) +{ + QgsRendererV2Widget::setMapCanvas( canvas ); + mRadiusUnitWidget->setMapCanvas( canvas ); +} + void QgsHeatmapRendererWidget::applyColorRamp() { if ( !mRenderer ) diff --git a/src/gui/symbology-ng/qgsheatmaprendererwidget.h b/src/gui/symbology-ng/qgsheatmaprendererwidget.h index 5fbdc25ae04..f3329d3d0f1 100644 --- a/src/gui/symbology-ng/qgsheatmaprendererwidget.h +++ b/src/gui/symbology-ng/qgsheatmaprendererwidget.h @@ -43,6 +43,8 @@ class GUI_EXPORT QgsHeatmapRendererWidget : public QgsRendererV2Widget, private /** @returns the current feature renderer */ virtual QgsFeatureRendererV2* renderer() override; + void setMapCanvas( QgsMapCanvas* canvas ) override; + protected: QgsHeatmapRenderer* mRenderer; diff --git a/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp b/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp index 24c0872c2cd..d5a5fa03638 100644 --- a/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp +++ b/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.cpp @@ -111,6 +111,12 @@ QgsFeatureRendererV2* QgsInvertedPolygonRendererWidget::renderer() return mRenderer.data(); } +void QgsInvertedPolygonRendererWidget::setMapCanvas( QgsMapCanvas* canvas ) +{ + QgsRendererV2Widget::setMapCanvas( canvas ); + mEmbeddedRendererWidget->setMapCanvas( canvas ); +} + void QgsInvertedPolygonRendererWidget::on_mRendererComboBox_currentIndexChanged( int index ) { QString rendererId = mRendererComboBox->itemData( index ).toString(); @@ -118,6 +124,7 @@ void QgsInvertedPolygonRendererWidget::on_mRendererComboBox_currentIndexChanged( if ( m ) { mEmbeddedRendererWidget.reset( m->createRendererWidget( mLayer, mStyle, const_cast( mRenderer->embeddedRenderer() )->clone() ) ); + mEmbeddedRendererWidget->setMapCanvas( mMapCanvas ); if ( mLayout->count() > 2 ) { diff --git a/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.h b/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.h index f184c1febc6..165743429c7 100644 --- a/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.h +++ b/src/gui/symbology-ng/qgsinvertedpolygonrendererwidget.h @@ -47,6 +47,7 @@ class GUI_EXPORT QgsInvertedPolygonRendererWidget : public QgsRendererV2Widget, /** @returns the current feature renderer */ virtual QgsFeatureRendererV2* renderer() override; + void setMapCanvas( QgsMapCanvas* canvas ) override; protected: /** The mask renderer */ diff --git a/src/gui/symbology-ng/qgslayerpropertieswidget.cpp b/src/gui/symbology-ng/qgslayerpropertieswidget.cpp index a8cda92fd4f..1f10b1903e9 100644 --- a/src/gui/symbology-ng/qgslayerpropertieswidget.cpp +++ b/src/gui/symbology-ng/qgslayerpropertieswidget.cpp @@ -83,6 +83,7 @@ static void _initWidgetFunctions() QgsLayerPropertiesWidget::QgsLayerPropertiesWidget( QgsSymbolLayerV2* layer, const QgsSymbolV2* symbol, const QgsVectorLayer* vl, QWidget* parent ) : QWidget( parent ) , mPresetExpressionContext( 0 ) + , mMapCanvas( 0 ) { mLayer = layer; @@ -116,6 +117,14 @@ QgsLayerPropertiesWidget::QgsLayerPropertiesWidget( QgsSymbolLayerV2* layer, con mEffectWidget->setPaintEffect( mLayer->paintEffect() ); } +void QgsLayerPropertiesWidget::setMapCanvas( QgsMapCanvas *canvas ) +{ + mMapCanvas = canvas; + QgsSymbolLayerV2Widget* w = dynamic_cast< QgsSymbolLayerV2Widget* >( stackedWidget->currentWidget() ); + if ( w ) + w->setMapCanvas( mMapCanvas ); +} + void QgsLayerPropertiesWidget::setExpressionContext( QgsExpressionContext *context ) { mPresetExpressionContext = context; @@ -165,6 +174,8 @@ void QgsLayerPropertiesWidget::updateSymbolLayerWidget( QgsSymbolLayerV2* layer { w->setSymbolLayer( layer ); w->setExpressionContext( mPresetExpressionContext ); + if ( mMapCanvas ) + w->setMapCanvas( mMapCanvas ); stackedWidget->addWidget( w ); stackedWidget->setCurrentWidget( w ); // start receiving updates from widget diff --git a/src/gui/symbology-ng/qgslayerpropertieswidget.h b/src/gui/symbology-ng/qgslayerpropertieswidget.h index 7a9cae8a800..46926b8f47d 100644 --- a/src/gui/symbology-ng/qgslayerpropertieswidget.h +++ b/src/gui/symbology-ng/qgslayerpropertieswidget.h @@ -22,6 +22,7 @@ class QgsSymbolV2; class QgsSymbolLayerV2; class QgsSymbolLayerV2Widget; class QgsVectorLayer; +class QgsMapCanvas; class SymbolLayerItem; @@ -44,6 +45,13 @@ class GUI_EXPORT QgsLayerPropertiesWidget : public QWidget, private Ui::LayerPro */ QgsExpressionContext* expressionContext() const { return mPresetExpressionContext; } + /** 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 + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + public slots: void layerTypeChanged(); void emitSignalChanged(); @@ -74,6 +82,8 @@ class GUI_EXPORT QgsLayerPropertiesWidget : public QWidget, private Ui::LayerPro private: QgsExpressionContext* mPresetExpressionContext; + QgsMapCanvas* mMapCanvas; + }; #endif //QGSLAYERPROPERTIESWIDGET_H diff --git a/src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp b/src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp index 719470eb232..5e9d83cd479 100644 --- a/src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp +++ b/src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp @@ -160,6 +160,13 @@ QgsFeatureRendererV2* QgsPointDisplacementRendererWidget::renderer() return mRenderer; } +void QgsPointDisplacementRendererWidget::setMapCanvas( QgsMapCanvas* canvas ) +{ + QgsRendererV2Widget::setMapCanvas( canvas ); + mDistanceUnitWidget->setMapCanvas( canvas ); + mEmbeddedRendererWidget->setMapCanvas( canvas ); +} + void QgsPointDisplacementRendererWidget::on_mLabelFieldComboBox_currentIndexChanged( const QString& text ) { if ( mRenderer ) @@ -183,6 +190,7 @@ void QgsPointDisplacementRendererWidget::on_mRendererComboBox_currentIndexChange { delete mEmbeddedRendererWidget; mEmbeddedRendererWidget = m->createRendererWidget( mLayer, mStyle, mRenderer->embeddedRenderer()->clone() ); + mEmbeddedRendererWidget->setMapCanvas( mMapCanvas ); } } @@ -332,6 +340,7 @@ void QgsPointDisplacementRendererWidget::on_mCenterSymbolPushButton_clicked() } QgsMarkerSymbolV2* markerSymbol = dynamic_cast( mRenderer->centerSymbol()->clone() ); QgsSymbolV2SelectorDialog dlg( markerSymbol, QgsStyleV2::defaultStyle(), mLayer, this ); + dlg.setMapCanvas( mMapCanvas ); if ( dlg.exec() == QDialog::Rejected ) { delete markerSymbol; diff --git a/src/gui/symbology-ng/qgspointdisplacementrendererwidget.h b/src/gui/symbology-ng/qgspointdisplacementrendererwidget.h index 65791f112e3..679abc9b31b 100644 --- a/src/gui/symbology-ng/qgspointdisplacementrendererwidget.h +++ b/src/gui/symbology-ng/qgspointdisplacementrendererwidget.h @@ -32,6 +32,7 @@ class GUI_EXPORT QgsPointDisplacementRendererWidget: public QgsRendererV2Widget, ~QgsPointDisplacementRendererWidget(); QgsFeatureRendererV2* renderer() override; + void setMapCanvas( QgsMapCanvas* canvas ) override; private: QgsPointDisplacementRenderer* mRenderer; diff --git a/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp b/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp index 91e45787867..9c69bcb1e55 100644 --- a/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp +++ b/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp @@ -78,6 +78,7 @@ QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog( QgsVectorLayer* la , mStyle( style ) , mActiveWidget( NULL ) , mPaintEffect( 0 ) + , mMapCanvas( 0 ) { setupUi( this ); @@ -149,6 +150,13 @@ QgsRendererV2PropertiesDialog::~QgsRendererV2PropertiesDialog() delete mPaintEffect; } +void QgsRendererV2PropertiesDialog::setMapCanvas( QgsMapCanvas* canvas ) +{ + mMapCanvas = canvas; + if ( mActiveWidget ) + mActiveWidget->setMapCanvas( mMapCanvas ); +} + void QgsRendererV2PropertiesDialog::rendererChanged() { @@ -193,6 +201,8 @@ void QgsRendererV2PropertiesDialog::rendererChanged() mActiveWidget = w; stackedWidget->addWidget( mActiveWidget ); stackedWidget->setCurrentWidget( mActiveWidget ); + if ( mMapCanvas ) + mActiveWidget->setMapCanvas( mMapCanvas ); } else { diff --git a/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h b/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h index 673655251fa..d7622a15324 100644 --- a/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h +++ b/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h @@ -28,6 +28,7 @@ class QgsStyleV2; class QgsSymbolV2; class QgsPaintEffect; class QgsRendererV2Widget; +class QgsMapCanvas; class GUI_EXPORT QgsRendererV2PropertiesDialog : public QDialog, private Ui::QgsRendererV2PropsDialogBase { @@ -37,6 +38,13 @@ class GUI_EXPORT QgsRendererV2PropertiesDialog : public QDialog, private Ui::Qgs QgsRendererV2PropertiesDialog( QgsVectorLayer* layer, QgsStyleV2* style, bool embedded = false ); ~QgsRendererV2PropertiesDialog(); + /** Sets the map canvas associated with the dialog. This allows the widget to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @note added in QGIS 2.12 + */ + void setMapCanvas( QgsMapCanvas* canvas ); + public slots: //! called when user changes renderer type void rendererChanged(); @@ -56,6 +64,8 @@ class GUI_EXPORT QgsRendererV2PropertiesDialog : public QDialog, private Ui::Qgs QgsRendererV2Widget* mActiveWidget; QgsPaintEffect* mPaintEffect; + + QgsMapCanvas* mMapCanvas; }; diff --git a/src/gui/symbology-ng/qgsrendererv2widget.cpp b/src/gui/symbology-ng/qgsrendererv2widget.cpp index 15909c351f4..4ff2bf6f59a 100644 --- a/src/gui/symbology-ng/qgsrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsrendererv2widget.cpp @@ -24,7 +24,10 @@ #include QgsRendererV2Widget::QgsRendererV2Widget( QgsVectorLayer* layer, QgsStyleV2* style ) - : QWidget(), mLayer( layer ), mStyle( style ) + : QWidget() + , mLayer( layer ) + , mStyle( style ) + , mMapCanvas( 0 ) { contextMenu = new QMenu( tr( "Renderer Options" ), this ); @@ -207,6 +210,11 @@ void QgsRendererV2Widget::showSymbolLevelsDialog( QgsFeatureRendererV2* r ) } } +void QgsRendererV2Widget::setMapCanvas( QgsMapCanvas *canvas ) +{ + mMapCanvas = canvas; +} + //////////// diff --git a/src/gui/symbology-ng/qgsrendererv2widget.h b/src/gui/symbology-ng/qgsrendererv2widget.h index eba3aefcaeb..05b62f8e35a 100644 --- a/src/gui/symbology-ng/qgsrendererv2widget.h +++ b/src/gui/symbology-ng/qgsrendererv2widget.h @@ -24,7 +24,7 @@ class QgsVectorLayer; class QgsStyleV2; class QgsFeatureRendererV2; class QgsSymbolV2SelectorDialog; - +class QgsMapCanvas; /** Base class for renderer settings widgets @@ -50,12 +50,20 @@ class GUI_EXPORT QgsRendererV2Widget : public QWidget //! show a dialog with renderer's symbol level settings void showSymbolLevelsDialog( QgsFeatureRendererV2* r ); + /** 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 + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + protected: QgsVectorLayer* mLayer; QgsStyleV2* mStyle; QMenu* contextMenu; QAction* mCopyAction; QAction* mPasteAction; + QgsMapCanvas* mMapCanvas; /** 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&)*/ diff --git a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp index 3c66610ac06..383ac87ba68 100644 --- a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp @@ -129,7 +129,7 @@ void QgsRuleBasedRendererV2Widget::addRule() QgsSymbolV2* s = QgsSymbolV2::defaultSymbol( mLayer->geometryType() ); QgsRuleBasedRendererV2::Rule* newrule = new QgsRuleBasedRendererV2::Rule( s ); - QgsRendererRulePropsDialog dlg( newrule, mLayer, mStyle, this ); + QgsRendererRulePropsDialog dlg( newrule, mLayer, mStyle, this, mMapCanvas ); if ( dlg.exec() ) { QgsRuleBasedRendererV2::Rule* current = currentRule(); @@ -173,7 +173,7 @@ void QgsRuleBasedRendererV2Widget::editRule( const QModelIndex& index ) return; QgsRuleBasedRendererV2::Rule* rule = mModel->ruleForIndex( index ); - QgsRendererRulePropsDialog dlg( rule, mLayer, mStyle, this ); + QgsRendererRulePropsDialog dlg( rule, mLayer, mStyle, this, mMapCanvas ); if ( dlg.exec() ) { // model should know about the change and emit dataChanged signal for the view @@ -256,6 +256,7 @@ void QgsRuleBasedRendererV2Widget::refineRuleCategoriesGui( const QModelIndexLis dlg.setWindowTitle( tr( "Refine a rule to categories" ) ); QVBoxLayout* l = new QVBoxLayout(); QgsCategorizedSymbolRendererV2Widget* w = new QgsCategorizedSymbolRendererV2Widget( mLayer, mStyle, NULL ); + w->setMapCanvas( mMapCanvas ); l->addWidget( w ); QDialogButtonBox* bb = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel ); l->addWidget( bb ); @@ -286,6 +287,7 @@ void QgsRuleBasedRendererV2Widget::refineRuleRangesGui( const QModelIndexList& i dlg.setWindowTitle( tr( "Refine a rule to ranges" ) ); QVBoxLayout* l = new QVBoxLayout(); QgsGraduatedSymbolRendererV2Widget* w = new QgsGraduatedSymbolRendererV2Widget( mLayer, mStyle, NULL ); + w->setMapCanvas( mMapCanvas ); l->addWidget( w ); QDialogButtonBox* bb = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel ); l->addWidget( bb ); @@ -571,8 +573,8 @@ void QgsRuleBasedRendererV2Widget::countFeatures() /////////// -QgsRendererRulePropsDialog::QgsRendererRulePropsDialog( QgsRuleBasedRendererV2::Rule* rule, QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent ) - : QDialog( parent ), mRule( rule ), mLayer( layer ), mSymbolSelector( NULL ), mSymbol( NULL ) +QgsRendererRulePropsDialog::QgsRendererRulePropsDialog( QgsRuleBasedRendererV2::Rule* rule, QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent , QgsMapCanvas* mapCanvas ) + : QDialog( parent ), mRule( rule ), mLayer( layer ), mSymbolSelector( NULL ), mSymbol( NULL ), mMapCanvas( mapCanvas ) { setupUi( this ); #ifdef Q_OS_MAC @@ -597,6 +599,7 @@ QgsRendererRulePropsDialog::QgsRendererRulePropsDialog( QgsRuleBasedRendererV2:: if ( rule->scaleMaxDenom() > 0 ) mScaleRangeWidget->setMinimumScale( 1.0 / rule->scaleMaxDenom() ); } + mScaleRangeWidget->setMapCanvas( mMapCanvas ); if ( mRule->symbol() ) { @@ -610,6 +613,7 @@ QgsRendererRulePropsDialog::QgsRendererRulePropsDialog( QgsRuleBasedRendererV2:: } mSymbolSelector = new QgsSymbolV2SelectorDialog( mSymbol, style, mLayer, this, true ); + mSymbolSelector->setMapCanvas( mMapCanvas ); QVBoxLayout* l = new QVBoxLayout; l->addWidget( mSymbolSelector ); groupSymbol->setLayout( l ); diff --git a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.h b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.h index fcda7017376..88fd6dc441d 100644 --- a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.h +++ b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.h @@ -167,7 +167,7 @@ class GUI_EXPORT QgsRendererRulePropsDialog : public QDialog, private Ui::QgsRen Q_OBJECT public: - QgsRendererRulePropsDialog( QgsRuleBasedRendererV2::Rule* rule, QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent = 0 ); + QgsRendererRulePropsDialog( QgsRuleBasedRendererV2::Rule* rule, QgsVectorLayer* layer, QgsStyleV2* style, QWidget* parent = 0, QgsMapCanvas* mapCanvas = 0 ); ~QgsRendererRulePropsDialog(); QgsRuleBasedRendererV2::Rule* rule() { return mRule; } @@ -183,6 +183,8 @@ class GUI_EXPORT QgsRendererRulePropsDialog : public QDialog, private Ui::QgsRen QgsSymbolV2SelectorDialog* mSymbolSelector; QgsSymbolV2* mSymbol; // a clone of original symbol + + QgsMapCanvas* mMapCanvas; }; diff --git a/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp b/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp index 6d35dcab155..87caf8621f1 100644 --- a/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp +++ b/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.cpp @@ -80,6 +80,12 @@ QgsFeatureRendererV2* QgsSingleSymbolRendererV2Widget::renderer() return mRenderer; } +void QgsSingleSymbolRendererV2Widget::setMapCanvas( QgsMapCanvas* canvas ) +{ + QgsRendererV2Widget::setMapCanvas( canvas ); + mSelector->setMapCanvas( canvas ); +} + void QgsSingleSymbolRendererV2Widget::changeSingleSymbol() { // update symbol from the GUI diff --git a/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h b/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h index 979dec5e4e2..e64e4a35a46 100644 --- a/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h +++ b/src/gui/symbology-ng/qgssinglesymbolrendererv2widget.h @@ -34,6 +34,9 @@ class GUI_EXPORT QgsSingleSymbolRendererV2Widget : public QgsRendererV2Widget virtual QgsFeatureRendererV2* renderer() override; + + virtual void setMapCanvas( QgsMapCanvas* canvas ) override; + public slots: void changeSingleSymbol(); diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp index 0c4af34bc8f..f87eda94f4b 100644 --- a/src/gui/symbology-ng/qgssymbollayerv2widget.cpp +++ b/src/gui/symbology-ng/qgssymbollayerv2widget.cpp @@ -68,6 +68,15 @@ static QgsExpressionContext _getExpressionContext( const void* context ) return expContext; } +void QgsSymbolLayerV2Widget::setMapCanvas( QgsMapCanvas *canvas ) +{ + mMapCanvas = canvas; + Q_FOREACH ( QgsUnitSelectionWidget* unitWidget, findChildren() ) + { + unitWidget->setMapCanvas( mMapCanvas ); + } +} + void QgsSymbolLayerV2Widget::registerDataDefinedButton( QgsDataDefinedButton * button, const QString & propertyName, QgsDataDefinedButton::DataType type, const QString & description ) { const QgsDataDefined* dd = symbolLayer()->getDataDefinedProperty( propertyName ); diff --git a/src/gui/symbology-ng/qgssymbollayerv2widget.h b/src/gui/symbology-ng/qgssymbollayerv2widget.h index 43c057d89c5..bce53befbbf 100644 --- a/src/gui/symbology-ng/qgssymbollayerv2widget.h +++ b/src/gui/symbology-ng/qgssymbollayerv2widget.h @@ -23,13 +23,14 @@ class QgsSymbolLayerV2; class QgsVectorLayer; +class QgsMapCanvas; class GUI_EXPORT QgsSymbolLayerV2Widget : public QWidget { Q_OBJECT public: - QgsSymbolLayerV2Widget( QWidget* parent, const QgsVectorLayer* vl = 0 ) : QWidget( parent ), mVectorLayer( vl ), mPresetExpressionContext( 0 ) {} + QgsSymbolLayerV2Widget( QWidget* parent, const QgsVectorLayer* vl = 0 ) : QWidget( parent ), mVectorLayer( vl ), mPresetExpressionContext( 0 ), mMapCanvas( 0 ) {} virtual ~QgsSymbolLayerV2Widget() {} virtual void setSymbolLayer( QgsSymbolLayerV2* layer ) = 0; @@ -43,6 +44,13 @@ class GUI_EXPORT QgsSymbolLayerV2Widget : public QWidget */ QgsExpressionContext* expressionContext() const { return mPresetExpressionContext; } + /** 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 + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the vector layer associated with the widget. * @note added in QGIS 2.12 */ @@ -66,6 +74,8 @@ class GUI_EXPORT QgsSymbolLayerV2Widget : public QWidget //! Optional preset expression context QgsExpressionContext* mPresetExpressionContext; + QgsMapCanvas* mMapCanvas; + void registerDataDefinedButton( QgsDataDefinedButton * button, const QString & propertyName, QgsDataDefinedButton::DataType type, const QString & description ); /** Get label for data defined entry. diff --git a/src/gui/symbology-ng/qgssymbolslistwidget.cpp b/src/gui/symbology-ng/qgssymbolslistwidget.cpp index e19f0dba6d2..616312107c8 100644 --- a/src/gui/symbology-ng/qgssymbolslistwidget.cpp +++ b/src/gui/symbology-ng/qgssymbolslistwidget.cpp @@ -117,6 +117,14 @@ QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* sty btnColor->setContext( "symbology" ); } +void QgsSymbolsListWidget::setMapCanvas( QgsMapCanvas* canvas ) +{ + Q_FOREACH ( QgsUnitSelectionWidget* unitWidget, findChildren() ) + { + unitWidget->setMapCanvas( canvas ); + } +} + void QgsSymbolsListWidget::setExpressionContext( QgsExpressionContext *context ) { mPresetExpressionContext = context; diff --git a/src/gui/symbology-ng/qgssymbolslistwidget.h b/src/gui/symbology-ng/qgssymbolslistwidget.h index a5ef9feb9a8..8048a344113 100644 --- a/src/gui/symbology-ng/qgssymbolslistwidget.h +++ b/src/gui/symbology-ng/qgssymbolslistwidget.h @@ -40,6 +40,13 @@ class GUI_EXPORT QgsSymbolsListWidget : public QWidget, private Ui::SymbolsListW */ QgsExpressionContext* expressionContext() const { return mPresetExpressionContext; } + /** 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 + * @note added in QGIS 2.12 + */ + virtual void setMapCanvas( QgsMapCanvas* canvas ); + /** Returns the vector layer associated with the widget. * @note added in QGIS 2.12 */ diff --git a/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp b/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp index 40036469595..aa0c50f3883 100644 --- a/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp +++ b/src/gui/symbology-ng/qgssymbolv2selectordialog.cpp @@ -205,7 +205,10 @@ class SymbolLayerItem : public QStandardItem ////////// QgsSymbolV2SelectorDialog::QgsSymbolV2SelectorDialog( QgsSymbolV2* symbol, QgsStyleV2* style, const QgsVectorLayer* vl, QWidget* parent, bool embedded ) - : QDialog( parent ), mAdvancedMenu( NULL ), mVectorLayer( vl ) + : QDialog( parent ) + , mAdvancedMenu( NULL ) + , mVectorLayer( vl ) + , mMapCanvas( 0 ) { #ifdef Q_OS_MAC setWindowModality( Qt::WindowModal ); @@ -287,6 +290,20 @@ void QgsSymbolV2SelectorDialog::setExpressionContext( QgsExpressionContext *cont updatePreview(); } +void QgsSymbolV2SelectorDialog::setMapCanvas( QgsMapCanvas *canvas ) +{ + mMapCanvas = canvas; + + QWidget* widget = stackedWidget->currentWidget(); + QgsLayerPropertiesWidget* layerProp = dynamic_cast< QgsLayerPropertiesWidget* >( widget ); + QgsSymbolsListWidget* listWidget = dynamic_cast< QgsSymbolsListWidget* >( widget ); + + if ( layerProp ) + layerProp->setMapCanvas( canvas ); + if ( listWidget ) + listWidget->setMapCanvas( canvas ); +} + void QgsSymbolV2SelectorDialog::loadSymbol( QgsSymbolV2* symbol, SymbolLayerItem* parent ) { SymbolLayerItem* symbolItem = new SymbolLayerItem( symbol ); @@ -399,6 +416,7 @@ void QgsSymbolV2SelectorDialog::layerChanged() mDataDefineRestorer.reset( new DataDefinedRestorer( parent->symbol(), currentItem->layer() ) ); QgsLayerPropertiesWidget *layerProp = new QgsLayerPropertiesWidget( currentItem->layer(), parent->symbol(), mVectorLayer ); layerProp->setExpressionContext( mPresetExpressionContext.data() ); + layerProp->setMapCanvas( mMapCanvas ); setWidget( layerProp ); connect( layerProp, SIGNAL( changed() ), mDataDefineRestorer.data(), SLOT( restore() ) ); connect( layerProp, SIGNAL( changed() ), this, SLOT( updateLayerPreview() ) ); @@ -413,6 +431,7 @@ void QgsSymbolV2SelectorDialog::layerChanged() // Now populate symbols of that type using the symbols list widget: QgsSymbolsListWidget *symbolsList = new QgsSymbolsListWidget( currentItem->symbol(), mStyle, mAdvancedMenu, this, mVectorLayer ); symbolsList->setExpressionContext( mPresetExpressionContext.data() ); + symbolsList->setMapCanvas( mMapCanvas ); setWidget( symbolsList ); connect( symbolsList, SIGNAL( changed() ), this, SLOT( symbolChanged() ) ); diff --git a/src/gui/symbology-ng/qgssymbolv2selectordialog.h b/src/gui/symbology-ng/qgssymbolv2selectordialog.h index 9f6b18f9869..c3f0280e746 100644 --- a/src/gui/symbology-ng/qgssymbolv2selectordialog.h +++ b/src/gui/symbology-ng/qgssymbolv2selectordialog.h @@ -39,6 +39,8 @@ class QgsLineSymbolV2; class QgsMarkerSymbolLayerV2; class QgsLineSymbolLayerV2; +class QgsMapCanvas; + class DataDefinedRestorer: public QObject { Q_OBJECT @@ -93,6 +95,13 @@ class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog, private Ui::QgsSymb */ QgsExpressionContext* expressionContext() const { return mPresetExpressionContext.data(); } + /** Sets the map canvas associated with the dialog. This allows the widget to retrieve the current + * map scale and other properties from the canvas. + * @param canvas map canvas + * @note added in QGIS 2.12 + */ + void setMapCanvas( QgsMapCanvas* canvas ); + protected: //! Reimplements dialog keyPress event so we can ignore it void keyPressEvent( QKeyEvent * event ) override; @@ -150,6 +159,8 @@ class GUI_EXPORT QgsSymbolV2SelectorDialog : public QDialog, private Ui::QgsSymb private: QScopedPointer mDataDefineRestorer; QScopedPointer< QgsExpressionContext > mPresetExpressionContext; + + QgsMapCanvas* mMapCanvas; }; #endif diff --git a/tests/src/python/test_qgsdoccoverage.py b/tests/src/python/test_qgsdoccoverage.py index 2687e437f4a..a55ade1feba 100644 --- a/tests/src/python/test_qgsdoccoverage.py +++ b/tests/src/python/test_qgsdoccoverage.py @@ -33,7 +33,7 @@ from PyQt4.QtCore import qDebug # DON'T RAISE THIS THRESHOLD!!! # (changes which lower this threshold are welcomed though!) -ACCEPTABLE_MISSING_DOCS = 4038 +ACCEPTABLE_MISSING_DOCS = 4036 def elemIsDocumentableClass(elem):