QGIS API Documentation  2.8.6-Wien
qgspointdisplacementrendererwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgspointdisplacementrendererwidget.cpp
3  --------------------------------------
4  begin : January 26, 2010
5  copyright : (C) 2010 by Marco Hugentobler
6  email : marco at hugis dot net
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
20 #include "qgsrendererv2registry.h"
21 #include "qgsfield.h"
22 #include "qgsstylev2.h"
24 #include "qgssymbollayerv2utils.h"
25 #include "qgsvectorlayer.h"
26 #include "qgisgui.h"
27 
29 {
30  return new QgsPointDisplacementRendererWidget( layer, style, renderer );
31 }
32 
34  : QgsRendererV2Widget( layer, style )
35  , mRenderer( NULL )
36  , mEmbeddedRendererWidget( 0 )
37 {
38  if ( !layer )
39  {
40  return;
41  }
42 
43  //the renderer only applies to point vector layers
44  if ( layer->wkbType() != QGis::WKBPoint && layer->wkbType() != QGis::WKBPoint25D )
45  {
46  //setup blank dialog
47  mRenderer = 0;
48  setupBlankUi( layer->name() );
49  return;
50  }
51  setupUi( this );
52 
53 
54  if ( renderer )
55  {
57  }
58  if ( !mRenderer )
59  {
60  mRenderer = new QgsPointDisplacementRenderer();
61  }
62 
63  blockAllSignals( true );
64 
65  //insert attributes into combo box
66  if ( layer )
67  {
68  const QgsFields& layerAttributes = layer->pendingFields();
69  for ( int idx = 0; idx < layerAttributes.count(); ++idx )
70  {
71  mLabelFieldComboBox->addItem( layerAttributes[idx].name() );
72  }
73  mLabelFieldComboBox->addItem( tr( "None" ) );
74 
75  QString currentLabelAttribute = mRenderer->labelAttributeName();
76  if ( !currentLabelAttribute.isEmpty() )
77  {
78  mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( currentLabelAttribute ) );
79  }
80  else
81  {
82  mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( tr( "None" ) ) );
83  }
84  }
85 
86  //insert possible renderer types
87  QStringList rendererList = QgsRendererV2Registry::instance()->renderersList();
88  QStringList::const_iterator it = rendererList.constBegin();
89  for ( ; it != rendererList.constEnd(); ++it )
90  {
91  if ( *it != "pointDisplacement" && *it != "heatmapRenderer" && *it != "invertedPolygonRenderer" )
92  {
94  mRendererComboBox->addItem( m->icon(), m->visibleName(), *it );
95  }
96  }
97 
98  mCircleColorButton->setColorDialogTitle( tr( "Select color" ) );
99  mCircleColorButton->setContext( "symbology" );
100  mCircleColorButton->setAllowAlpha( true );
101  mLabelColorButton->setContext( "symbology" );
102  mLabelColorButton->setColorDialogTitle( tr( "Select color" ) );
103  mLabelColorButton->setAllowAlpha( true );
104 
105  mCircleWidthSpinBox->setValue( mRenderer->circleWidth() );
106  mCircleColorButton->setColor( mRenderer->circleColor() );
107  mLabelColorButton->setColor( mRenderer->labelColor() );
108  mCircleModificationSpinBox->setValue( mRenderer->circleRadiusAddition() );
109  mDistanceSpinBox->setValue( mRenderer->tolerance() );
110 
111  //scale dependent labelling
112  mMaxScaleDenominatorEdit->setText( QString::number( mRenderer->maxLabelScaleDenominator() ) );
113  mMaxScaleDenominatorEdit->setValidator( new QDoubleValidator( mMaxScaleDenominatorEdit ) );
114  if ( mRenderer->maxLabelScaleDenominator() > 0 )
115  {
116  mScaleDependentLabelsCheckBox->setCheckState( Qt::Checked );
117  }
118  else
119  {
120  mScaleDependentLabelsCheckBox->setCheckState( Qt::Unchecked );
121  mMaxScaleDenominatorEdit->setEnabled( false );
122  }
123 
124 
125  blockAllSignals( false );
126 
127  //set the appropriate renderer dialog
128  if ( mRenderer->embeddedRenderer() )
129  {
130  QString rendererName = mRenderer->embeddedRenderer()->type();
131  int rendererIndex = mRendererComboBox->findData( rendererName );
132  if ( rendererIndex != -1 )
133  {
134  mRendererComboBox->setCurrentIndex( rendererIndex );
135  on_mRendererComboBox_currentIndexChanged( rendererIndex );
136  }
137  }
138 
139  updateCenterIcon();
140 }
141 
143 {
144  delete mRenderer;
145  delete mEmbeddedRendererWidget;
146 }
147 
149 {
150  if ( mRenderer && mEmbeddedRendererWidget )
151  {
152  QgsFeatureRendererV2* embeddedRenderer = mEmbeddedRendererWidget->renderer();
153  if ( embeddedRenderer )
154  {
155  mRenderer->setEmbeddedRenderer( embeddedRenderer->clone() );
156  }
157  }
158  return mRenderer;
159 }
160 
161 void QgsPointDisplacementRendererWidget::on_mLabelFieldComboBox_currentIndexChanged( const QString& text )
162 {
163  if ( mRenderer )
164  {
165  if ( text == tr( "None" ) )
166  {
167  mRenderer->setLabelAttributeName( "" );
168  }
169  else
170  {
171  mRenderer->setLabelAttributeName( text );
172  }
173  }
174 }
175 
176 void QgsPointDisplacementRendererWidget::on_mRendererComboBox_currentIndexChanged( int index )
177 {
178  QString rendererId = mRendererComboBox->itemData( index ).toString();
180  if ( m )
181  {
182  delete mEmbeddedRendererWidget;
183  mEmbeddedRendererWidget = m->createRendererWidget( mLayer, mStyle, mRenderer->embeddedRenderer()->clone() );
184  }
185 }
186 
187 void QgsPointDisplacementRendererWidget::on_mRendererSettingsButton_clicked()
188 {
189  if ( mEmbeddedRendererWidget )
190  {
191  //create a dialog with the embedded widget
192 #ifdef Q_OS_MAC
193  QDialog* d = new QDialog( this->window() );
194  d->setWindowModality( Qt::WindowModal );
195 #else
196  QDialog* d = new QDialog();
197 #endif
198  QGridLayout* layout = new QGridLayout( d );
199  mEmbeddedRendererWidget->setParent( d );
200  QDialogButtonBox* buttonBox = new QDialogButtonBox( d );
201  buttonBox->addButton( QDialogButtonBox::Ok );
202  QObject::connect( buttonBox, SIGNAL( accepted() ), d, SLOT( accept() ) );
203  layout->addWidget( mEmbeddedRendererWidget, 0, 0 );
204  layout->addWidget( buttonBox, 1, 0 );
205  d->exec();
206  mEmbeddedRendererWidget->setParent( 0 );
207  delete d;
208  }
209 }
210 
211 void QgsPointDisplacementRendererWidget::on_mLabelFontButton_clicked()
212 {
213  if ( !mRenderer )
214  {
215  return;
216  }
217 
218  bool ok;
219  QFont newFont = QgisGui::getFont( ok, mRenderer->labelFont(), tr( "Label Font" ) );
220  if ( ok )
221  {
222  mRenderer->setLabelFont( newFont );
223  }
224 }
225 
226 void QgsPointDisplacementRendererWidget::on_mCircleWidthSpinBox_valueChanged( double d )
227 {
228  if ( mRenderer )
229  {
230  mRenderer->setCircleWidth( d );
231  }
232 }
233 
234 void QgsPointDisplacementRendererWidget::on_mCircleColorButton_colorChanged( const QColor& newColor )
235 {
236  if ( !mRenderer )
237  {
238  return;
239  }
240 
241  mRenderer->setCircleColor( newColor );
242 }
243 
244 void QgsPointDisplacementRendererWidget::on_mLabelColorButton_colorChanged( const QColor& newColor )
245 {
246  if ( !mRenderer )
247  {
248  return;
249  }
250 
251  mRenderer->setLabelColor( newColor );
252 }
253 
254 void QgsPointDisplacementRendererWidget::on_mCircleModificationSpinBox_valueChanged( double d )
255 {
256  if ( !mRenderer )
257  {
258  return;
259  }
260 
261  mRenderer->setCircleRadiusAddition( d );
262 }
263 
264 void QgsPointDisplacementRendererWidget::on_mDistanceSpinBox_valueChanged( double d )
265 {
266  if ( mRenderer )
267  {
268  mRenderer->setTolerance( d );
269  }
270 }
271 
272 void QgsPointDisplacementRendererWidget::on_mScaleDependentLabelsCheckBox_stateChanged( int state )
273 {
274  if ( state == Qt::Unchecked )
275  {
276  mMaxScaleDenominatorEdit->setText( "-1" );
277  mMaxScaleDenominatorEdit->setEnabled( false );
278  }
279  else
280  {
281  mMaxScaleDenominatorEdit->setEnabled( true );
282  }
283 }
284 
285 void QgsPointDisplacementRendererWidget::on_mMaxScaleDenominatorEdit_textChanged( const QString & text )
286 {
287  if ( !mRenderer )
288  {
289  return;
290  }
291 
292  bool ok;
293  double scaleDenominator = text.toDouble( &ok );
294  if ( ok )
295  {
296  mRenderer->setMaxLabelScaleDenominator( scaleDenominator );
297  }
298 }
299 
300 void QgsPointDisplacementRendererWidget::blockAllSignals( bool block )
301 {
302  mLabelFieldComboBox->blockSignals( block );
303  mLabelFontButton->blockSignals( block );
304  mCircleWidthSpinBox->blockSignals( block );
305  mCircleColorButton->blockSignals( block );
306  mRendererComboBox->blockSignals( block );
307  mLabelColorButton->blockSignals( block );
308  mCircleModificationSpinBox->blockSignals( block );
309  mScaleDependentLabelsCheckBox->blockSignals( block );
310  mMaxScaleDenominatorEdit->blockSignals( block );
311  mCenterSymbolPushButton->blockSignals( block );
312  mDistanceSpinBox->blockSignals( block );
313 }
314 
315 void QgsPointDisplacementRendererWidget::on_mCenterSymbolPushButton_clicked()
316 {
317  if ( !mRenderer || !mRenderer->centerSymbol() )
318  {
319  return;
320  }
321  QgsMarkerSymbolV2* markerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( mRenderer->centerSymbol()->clone() );
322  QgsSymbolV2SelectorDialog dlg( markerSymbol, QgsStyleV2::defaultStyle(), mLayer, this );
323  if ( dlg.exec() == QDialog::Rejected )
324  {
325  delete markerSymbol;
326  return;
327  }
328  mRenderer->setCenterSymbol( markerSymbol );
329  updateCenterIcon();
330 }
331 
332 void QgsPointDisplacementRendererWidget::updateCenterIcon()
333 {
334  QgsMarkerSymbolV2* symbol = mRenderer->centerSymbol();
335  if ( !symbol )
336  {
337  return;
338  }
339  QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( symbol, mCenterSymbolPushButton->iconSize() );
340  mCenterSymbolPushButton->setIcon( icon );
341 }
342 
343 void QgsPointDisplacementRendererWidget::setupBlankUi( const QString& layerName )
344 {
345  QGridLayout* layout = new QGridLayout( this );
346  QLabel* label = new QLabel( tr( "The point displacement renderer only applies to (single) point layers. \n'%1' is not a point layer and cannot be displayed by the point displacement renderer" ).arg( layerName ), this );
347  layout->addWidget( label );
348 }
static QgsRendererV2Registry * instance()
static unsigned index
QgsRendererV2AbstractMetadata * rendererMetadata(QString rendererName)
get metadata for particular renderer. Returns NULL if not found in registry.
void setLabelAttributeName(const QString &name)
QFont getFont(bool &ok, const QFont &initial, const QString &title)
Show font selection dialog.
Definition: qgisgui.cpp:191
void setCenterSymbol(QgsMarkerSymbolV2 *symbol)
Sets the center symbol (takes ownership)
Container of fields for a vector layer.
Definition: qgsfield.h:172
static QgsPointDisplacementRenderer * convertFromRenderer(const QgsFeatureRendererV2 *renderer)
creates a QgsPointDisplacementRenderer from an existing renderer.
Stores metadata about one renderer class.
QGis::WkbType wkbType() const
Returns the WKBType or WKBUnknown in case of error.
QString type() const
Definition: qgsrendererv2.h:81
const QString & name() const
Get the display name of the layer.
virtual QgsFeatureRendererV2 * clone() const =0
static QIcon symbolPreviewIcon(QgsSymbolV2 *symbol, QSize size)
QgsVectorLayer * mLayer
void setEmbeddedRenderer(QgsFeatureRendererV2 *r)
Sets embedded renderer (takes ownership)
QStringList renderersList()
return a list of available renderers
static QgsStyleV2 * defaultStyle()
return default application-wide style
Definition: qgsstylev2.cpp:51
virtual QgsSymbolV2 * clone() const override
QgsFeatureRendererV2 * renderer() override
return pointer to the renderer (no transfer of ownership)
int count() const
Return number of items.
Definition: qgsfield.h:214
QgsPointDisplacementRendererWidget(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
QgsFeatureRendererV2 * embeddedRenderer() const
A renderer that automatically displaces points with the same position.
Base class for renderer settings widgets.
virtual QgsRendererV2Widget * createRendererWidget(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
Return new instance of settings widget for the renderer.
const QgsFields & pendingFields() const
returns field list in the to-be-committed state
static QgsRendererV2Widget * create(QgsVectorLayer *layer, QgsStyleV2 *style, QgsFeatureRendererV2 *renderer)
QgsMarkerSymbolV2 * centerSymbol()
Returns the symbol for the center of a displacement group (but not ownership of the symbol) ...
Represents a vector layer which manages a vector based data sets.
virtual QgsFeatureRendererV2 * renderer()=0
return pointer to the renderer (no transfer of ownership)
#define tr(sourceText)