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.
This commit is contained in:
Nyall Dawson 2015-09-16 21:55:32 +10:00
parent 60cce74913
commit a62c6a917a
36 changed files with 228 additions and 12 deletions

View File

@ -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();

View File

@ -9,4 +9,5 @@ class QgsPointDisplacementRendererWidget: QgsRendererV2Widget
~QgsPointDisplacementRendererWidget();
QgsFeatureRendererV2* renderer();
void setMapCanvas( QgsMapCanvas* canvas );
};

View File

@ -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

View File

@ -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&)*/

View File

@ -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();

View File

@ -11,6 +11,8 @@ class QgsSingleSymbolRendererV2Widget : QgsRendererV2Widget
virtual QgsFeatureRendererV2* renderer();
virtual void setMapCanvas( QgsMapCanvas* canvas );
public slots:
void changeSingleSymbol();

View File

@ -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
*/

View File

@ -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
*/

View File

@ -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 );

View File

@ -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" ) );

View File

@ -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 */

View File

@ -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;

View File

@ -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;

View File

@ -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 )

View File

@ -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;

View File

@ -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<QgsFeatureRendererV2*>( mRenderer->embeddedRenderer() )->clone() ) );
mEmbeddedRendererWidget->setMapCanvas( mMapCanvas );
if ( mLayout->count() > 2 )
{

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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<QgsMarkerSymbolV2*>( mRenderer->centerSymbol()->clone() );
QgsSymbolV2SelectorDialog dlg( markerSymbol, QgsStyleV2::defaultStyle(), mLayer, this );
dlg.setMapCanvas( mMapCanvas );
if ( dlg.exec() == QDialog::Rejected )
{
delete markerSymbol;

View File

@ -32,6 +32,7 @@ class GUI_EXPORT QgsPointDisplacementRendererWidget: public QgsRendererV2Widget,
~QgsPointDisplacementRendererWidget();
QgsFeatureRendererV2* renderer() override;
void setMapCanvas( QgsMapCanvas* canvas ) override;
private:
QgsPointDisplacementRenderer* mRenderer;

View File

@ -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
{

View File

@ -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;
};

View File

@ -24,7 +24,10 @@
#include <QMenu>
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;
}
////////////

View File

@ -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&)*/

View File

@ -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 );

View File

@ -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;
};

View File

@ -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

View File

@ -34,6 +34,9 @@ class GUI_EXPORT QgsSingleSymbolRendererV2Widget : public QgsRendererV2Widget
virtual QgsFeatureRendererV2* renderer() override;
virtual void setMapCanvas( QgsMapCanvas* canvas ) override;
public slots:
void changeSingleSymbol();

View File

@ -68,6 +68,15 @@ static QgsExpressionContext _getExpressionContext( const void* context )
return expContext;
}
void QgsSymbolLayerV2Widget::setMapCanvas( QgsMapCanvas *canvas )
{
mMapCanvas = canvas;
Q_FOREACH ( QgsUnitSelectionWidget* unitWidget, findChildren<QgsUnitSelectionWidget*>() )
{
unitWidget->setMapCanvas( mMapCanvas );
}
}
void QgsSymbolLayerV2Widget::registerDataDefinedButton( QgsDataDefinedButton * button, const QString & propertyName, QgsDataDefinedButton::DataType type, const QString & description )
{
const QgsDataDefined* dd = symbolLayer()->getDataDefinedProperty( propertyName );

View File

@ -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.

View File

@ -117,6 +117,14 @@ QgsSymbolsListWidget::QgsSymbolsListWidget( QgsSymbolV2* symbol, QgsStyleV2* sty
btnColor->setContext( "symbology" );
}
void QgsSymbolsListWidget::setMapCanvas( QgsMapCanvas* canvas )
{
Q_FOREACH ( QgsUnitSelectionWidget* unitWidget, findChildren<QgsUnitSelectionWidget*>() )
{
unitWidget->setMapCanvas( canvas );
}
}
void QgsSymbolsListWidget::setExpressionContext( QgsExpressionContext *context )
{
mPresetExpressionContext = context;

View File

@ -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
*/

View File

@ -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() ) );

View File

@ -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<DataDefinedRestorer> mDataDefineRestorer;
QScopedPointer< QgsExpressionContext > mPresetExpressionContext;
QgsMapCanvas* mMapCanvas;
};
#endif

View File

@ -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):