QGIS API Documentation  2.12.0-Lyon
qgsrendererv2propertiesdialog.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsrendererv2propertiesdialog.cpp
3  ---------------------
4  begin : December 2009
5  copyright : (C) 2009 by Martin Dobias
6  email : wonder dot sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
16 
17 #include "qgsrendererv2.h"
18 #include "qgsrendererv2registry.h"
19 
20 #include "qgsrendererv2widget.h"
28 
29 #include "qgsapplication.h"
30 #include "qgslogger.h"
31 #include "qgsvectorlayer.h"
32 
33 #include <QKeyEvent>
34 #include <QMessageBox>
35 
36 static bool _initRenderer( const QString& name, QgsRendererV2WidgetFunc f, const QString& iconName = QString() )
37 {
40  if ( am == NULL )
41  return false;
42  QgsRendererV2Metadata* m = dynamic_cast<QgsRendererV2Metadata*>( am );
43  if ( m == NULL )
44  return false;
45 
46  m->setWidgetFunction( f );
47 
48  if ( !iconName.isEmpty() )
49  {
51  QPixmap pix;
52  if ( pix.load( iconPath, "png" ) )
53  m->setIcon( pix );
54  }
55 
56  QgsDebugMsg( "Set for " + name );
57  return true;
58 }
59 
61 {
62  static bool initialized = false;
63  if ( initialized )
64  return;
65 
66  _initRenderer( "singleSymbol", QgsSingleSymbolRendererV2Widget::create, "rendererSingleSymbol.png" );
67  _initRenderer( "categorizedSymbol", QgsCategorizedSymbolRendererV2Widget::create, "rendererCategorizedSymbol.png" );
68  _initRenderer( "graduatedSymbol", QgsGraduatedSymbolRendererV2Widget::create, "rendererGraduatedSymbol.png" );
71  _initRenderer( "invertedPolygonRenderer", QgsInvertedPolygonRendererWidget::create );
72  _initRenderer( "heatmapRenderer", QgsHeatmapRendererWidget::create );
73  initialized = true;
74 }
75 
77  : mLayer( layer )
78  , mStyle( style )
79  , mActiveWidget( NULL )
80  , mPaintEffect( 0 )
81  , mMapCanvas( 0 )
82 {
83  setupUi( this );
84 
85  // can be embedded in vector layer properties
86  if ( embedded )
87  {
88  buttonBox->hide();
89  layout()->setContentsMargins( 0, 0, 0, 0 );
90  }
91 
92  connect( buttonBox, SIGNAL( accepted() ), this, SLOT( onOK() ) );
93 
94  // initialize registry's widget functions
96 
97  // Blend mode
98  mBlendModeComboBox->setBlendMode( mLayer->blendMode() );
99 
100  // Feature blend mode
101  mFeatureBlendComboBox->setBlendMode( mLayer->featureBlendMode() );
102 
103  // Layer transparency
104  mLayerTransparencySlider->setValue( mLayer->layerTransparency() );
105  mLayerTransparencySpnBx->setValue( mLayer->layerTransparency() );
106 
107  // connect layer transparency slider and spin box
108  connect( mLayerTransparencySlider, SIGNAL( valueChanged( int ) ), mLayerTransparencySpnBx, SLOT( setValue( int ) ) );
109  connect( mLayerTransparencySpnBx, SIGNAL( valueChanged( int ) ), mLayerTransparencySlider, SLOT( setValue( int ) ) );
110 
111  //paint effect widget
112  if ( mLayer->rendererV2() && mLayer->rendererV2()->paintEffect() )
113  {
115  mEffectWidget->setPaintEffect( mPaintEffect );
116  }
117 
118  QPixmap pix;
120  QStringList renderers = reg->renderersList();
121  Q_FOREACH ( const QString& name, renderers )
122  {
124  cboRenderers->addItem( m->icon(), m->visibleName(), name );
125  }
126 
127  cboRenderers->setCurrentIndex( -1 ); // set no current renderer
128 
129  // setup slot rendererChanged()
130  connect( cboRenderers, SIGNAL( currentIndexChanged( int ) ), this, SLOT( rendererChanged() ) );
131 
132  // set current renderer from layer
133  QString rendererName = mLayer->rendererV2()->type();
134  for ( int i = 0; i < cboRenderers->count(); i++ )
135  {
136  if ( cboRenderers->itemData( i ).toString() == rendererName )
137  {
138  cboRenderers->setCurrentIndex( i );
139  return;
140  }
141  }
142 
143  // no renderer found... this mustn't happen
144  Q_ASSERT( false && "there must be a renderer!" );
145 
146 }
147 
149 {
150  delete mPaintEffect;
151 }
152 
154 {
155  mMapCanvas = canvas;
156  if ( mActiveWidget )
158 }
159 
160 
162 {
163 
164  if ( cboRenderers->currentIndex() == -1 )
165  {
166  QgsDebugMsg( "No current item -- this should never happen!" );
167  return;
168  }
169 
170  QString rendererName = cboRenderers->itemData( cboRenderers->currentIndex() ).toString();
171 
172  //Retrieve the previous renderer: from the old active widget if possible, otherwise from the layer
173  QgsFeatureRendererV2* oldRenderer;
175  {
176  oldRenderer = mActiveWidget->renderer()->clone();
177  }
178  else
179  {
180  oldRenderer = mLayer->rendererV2()->clone();
181  }
182 
183  // get rid of old active widget (if any)
184  if ( mActiveWidget )
185  {
186  stackedWidget->removeWidget( mActiveWidget );
187 
188  delete mActiveWidget;
189  mActiveWidget = NULL;
190  }
191 
192  QgsRendererV2Widget* w = NULL;
194  if ( m != NULL )
195  w = m->createRendererWidget( mLayer, mStyle, oldRenderer );
196  delete oldRenderer;
197 
198  if ( w != NULL )
199  {
200  // instantiate the widget and set as active
201  mActiveWidget = w;
202  stackedWidget->addWidget( mActiveWidget );
203  stackedWidget->setCurrentWidget( mActiveWidget );
204  if ( mMapCanvas && mActiveWidget->renderer() )
206  }
207  else
208  {
209  // set default "no edit widget available" page
210  stackedWidget->setCurrentWidget( pageNoWidget );
211  }
212 
213 }
214 
216 {
217  if ( !mActiveWidget || !mLayer )
218  {
219  return;
220  }
221 
223  if ( renderer )
224  {
225  renderer->setPaintEffect( mPaintEffect->clone() );
226  mLayer->setRendererV2( renderer->clone() );
227  }
228 
229  // set the blend modes for the layer
230  mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
231  mLayer->setFeatureBlendMode( mFeatureBlendComboBox->blendMode() );
232 
233  // set transparency for the layer
234  mLayer->setLayerTransparency( mLayerTransparencySlider->value() );
235 }
236 
238 {
239  apply();
240  accept();
241 }
242 
243 
245 {
246  // Ignore the ESC key to avoid close the dialog without the properties window
247  if ( !isWindow() && e->key() == Qt::Key_Escape )
248  {
249  e->ignore();
250  }
251  else
252  {
254  }
255 }
QLayout * layout() const
void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the dialog.
static QgsRendererV2Registry * instance()
void setContentsMargins(int left, int top, int right, int bottom)
void setupUi(QWidget *widget)
static QString defaultThemePath()
Returns the path to the default theme directory.
#define QgsDebugMsg(str)
Definition: qgslogger.h:33
void setRendererV2(QgsFeatureRendererV2 *r)
Set renderer V2.
static QgsRendererV2Widget * create(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
void accepted()
void setLayerTransparency(int layerTransparency)
Set the transparency for the vector layer.
Stores metadata about one renderer class.
QString iconPath(const QString &iconFile)
void setBlendMode(const QPainter::CompositionMode &blendMode)
Set the blending mode used for rendering a layer.
Registry of renderers.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:107
QgsRendererV2AbstractMetadata * rendererMetadata(const QString &rendererName)
get metadata for particular renderer. Returns NULL if not found in registry.
virtual QgsPaintEffect * clone() const =0
Duplicates an effect by creating a deep copy of the effect.
void setIcon(const QIcon &icon)
static void _initRendererWidgetFunctions()
QString type() const
Definition: qgsrendererv2.h:82
void setWidgetFunction(QgsRendererV2WidgetFunc f)
const char * name() const
virtual QgsFeatureRendererV2 * clone() const =0
QgsFeatureRendererV2 * rendererV2()
Return renderer V2.
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
void ignore()
QPainter::CompositionMode featureBlendMode() const
Returns the current blending mode for features.
QStringList renderersList()
return a list of available renderers
static QgsRendererV2Widget * create(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the renderer.
void setFeatureBlendMode(const QPainter::CompositionMode &blendMode)
Set the blending mode used for rendering each feature.
static QgsRendererV2Widget * create(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
bool load(const QString &fileName, const char *format, QFlags< Qt::ImageConversionFlag > flags)
static QgsRendererV2Widget * create(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
virtual void accept()
bool isWindow() const
QgsRendererV2PropertiesDialog(QgsVectorLayer *layer, QgsStyleV2 *style, bool embedded=false)
int key() const
static bool _initRenderer(const QString &name, QgsRendererV2WidgetFunc f, const QString &iconName=QString())
void rendererChanged()
called when user changes renderer type
int layerTransparency() const
Returns the current transparency for the vector layer.
virtual void keyPressEvent(QKeyEvent *e)
static QgsRendererV2Widget * create(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
Static creation method.
Convenience metadata class that uses static functions to create renderer and its widget.
void keyPressEvent(QKeyEvent *event) override
Reimplements dialog keyPress event so we can ignore it.
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the renderer.
Base class for renderer settings widgets.
virtual QgsRendererV2Widget * createRendererWidget(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
Return new instance of settings widget for the renderer.
static QgsRendererV2Widget * create(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Represents a vector layer which manages a vector based data sets.
virtual QgsFeatureRendererV2 * renderer()=0
return pointer to the renderer (no transfer of ownership)
QgsRendererV2Widget *(* QgsRendererV2WidgetFunc)(QgsVectorLayer *, QgsStyleV2 *, QgsFeatureRendererV2 *)
virtual void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the widget.
static QgsRendererV2Widget * create(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
Static creation method.