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
***************************************************************************/
9
/***************************************************************************
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. *
16
***************************************************************************/
18
#include "qgspointdisplacementrendererwidget.h"
19
#include "qgspointdisplacementrenderer.h"
20
#include "qgsrendererv2registry.h"
22
#include "qgsstylev2.h"
23
#include "qgssymbolv2selectordialog.h"
24
#include "qgssymbollayerv2utils.h"
25
#include "qgsvectorlayer.h"
26
#include <QColorDialog>
27
#include <QFontDialog>
29
QgsRendererV2Widget* QgsPointDisplacementRendererWidget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
31
return new QgsPointDisplacementRendererWidget( layer, style, renderer );
34
QgsPointDisplacementRendererWidget::QgsPointDisplacementRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ): \
35
QgsRendererV2Widget( layer, style ), mEmbeddedRendererWidget( 0 )
42
//the renderer only applies to point vector layers
43
if ( layer->wkbType() != QGis::WKBPoint && layer->wkbType() != QGis::WKBPoint25D )
47
setupBlankUi( layer->name() );
52
if ( renderer && renderer->type() == "pointDisplacement" )
54
mRenderer = dynamic_cast<QgsPointDisplacementRenderer*>( renderer->clone() );
58
mRenderer = new QgsPointDisplacementRenderer();
61
blockAllSignals( true );
63
//insert attributes into combo box
66
const QgsFieldMap layerAttributes = layer->pendingFields();
67
QgsFieldMap::const_iterator it = layerAttributes.constBegin();
68
for ( ; it != layerAttributes.constEnd(); ++it )
70
mLabelFieldComboBox->addItem( it.value().name() );
72
mLabelFieldComboBox->addItem( tr( "None" ) );
74
QString currentLabelAttribute = mRenderer->labelAttributeName();
75
if ( !currentLabelAttribute.isEmpty() )
77
mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( currentLabelAttribute ) );
81
mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( tr( "None" ) ) );
85
//insert possible renderer types
86
QStringList rendererList = QgsRendererV2Registry::instance()->renderersList();
87
QStringList::const_iterator it = rendererList.constBegin();
88
for ( ; it != rendererList.constEnd(); ++it )
90
if ( *it != "pointDisplacement" )
92
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( *it );
93
mRendererComboBox->addItem( m->icon(), m->visibleName(), *it );
97
mCircleWidthSpinBox->setValue( mRenderer->circleWidth() );
98
mCircleColorButton->setColor( mRenderer->circleColor() );
99
mLabelColorButton->setColor( mRenderer->labelColor() );
100
mCircleModificationSpinBox->setValue( mRenderer->circleRadiusAddition() );
101
mDistanceSpinBox->setValue( mRenderer->tolerance() );
103
//scale dependent labelling
104
mMaxScaleDenominatorEdit->setText( QString::number( mRenderer->maxLabelScaleDenominator() ) );
105
mMaxScaleDenominatorEdit->setValidator( new QDoubleValidator( mMaxScaleDenominatorEdit ) );
106
if ( mRenderer->maxLabelScaleDenominator() > 0 )
108
mScaleDependentLabelsCheckBox->setCheckState( Qt::Checked );
112
mScaleDependentLabelsCheckBox->setCheckState( Qt::Unchecked );
113
mMaxScaleDenominatorEdit->setEnabled( false );
117
blockAllSignals( false );
119
//set the appropriate renderer dialog
120
if ( mRenderer && mRenderer->embeddedRenderer() )
122
QString rendererName = mRenderer->embeddedRenderer()->type();
123
int rendererIndex = mRendererComboBox->findData( rendererName );
124
if ( rendererIndex != -1 )
126
mRendererComboBox->setCurrentIndex( rendererIndex );
127
on_mRendererComboBox_currentIndexChanged( rendererIndex );
134
QgsPointDisplacementRendererWidget::~QgsPointDisplacementRendererWidget()
137
delete mEmbeddedRendererWidget;
140
QgsFeatureRendererV2* QgsPointDisplacementRendererWidget::renderer()
142
if ( mRenderer && mEmbeddedRendererWidget )
144
QgsFeatureRendererV2* embeddedRenderer = mEmbeddedRendererWidget->renderer();
145
if ( embeddedRenderer )
147
mRenderer->setEmbeddedRenderer( embeddedRenderer->clone() );
153
void QgsPointDisplacementRendererWidget::on_mLabelFieldComboBox_currentIndexChanged( const QString& text )
157
if ( text == tr( "None" ) )
159
mRenderer->setLabelAttributeName( "" );
163
mRenderer->setLabelAttributeName( text );
168
void QgsPointDisplacementRendererWidget::on_mRendererComboBox_currentIndexChanged( int index )
170
QString rendererId = mRendererComboBox->itemData( index ).toString();
171
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( rendererId );
174
delete mEmbeddedRendererWidget;
175
mEmbeddedRendererWidget = m->createRendererWidget( mLayer, mStyle, mRenderer->embeddedRenderer()->clone() );
179
void QgsPointDisplacementRendererWidget::on_mRendererSettingsButton_clicked()
181
if ( mEmbeddedRendererWidget )
183
//create a dialog with the embedded widget
184
QDialog* d = new QDialog();
185
QGridLayout* layout = new QGridLayout( d );
186
mEmbeddedRendererWidget->setParent( d );
187
QDialogButtonBox* buttonBox = new QDialogButtonBox( d );
188
buttonBox->addButton( QDialogButtonBox::Ok );
189
QObject::connect( buttonBox, SIGNAL( accepted() ), d, SLOT( accept() ) );
190
layout->addWidget( mEmbeddedRendererWidget, 0, 0 );
191
layout->addWidget( buttonBox, 1, 0 );
193
mEmbeddedRendererWidget->setParent( 0 );
198
void QgsPointDisplacementRendererWidget::on_mLabelFontButton_clicked()
206
#if defined(Q_WS_MAC) && QT_VERSION >= 0x040500 && defined(QT_MAC_USE_COCOA)
207
// Native Mac dialog works only for QT Carbon
208
QFont newFont = QFontDialog::getFont( &ok, mRenderer->labelFont(), 0, tr( "Label Font" ), QFontDialog::DontUseNativeDialog );
210
QFont newFont = QFontDialog::getFont( &ok, mRenderer->labelFont(), 0, tr( "Label Font" ) );
214
mRenderer->setLabelFont( newFont );
218
void QgsPointDisplacementRendererWidget::on_mCircleWidthSpinBox_valueChanged( double d )
222
mRenderer->setCircleWidth( d );
226
void QgsPointDisplacementRendererWidget::on_mCircleColorButton_clicked()
233
#if QT_VERSION >= 0x040500
234
QColor newColor = QColorDialog::getColor( mRenderer->circleColor(), 0, tr( "Circle color" ), QColorDialog::ShowAlphaChannel );
236
QColor newColor = QColorDialog::getColor( mRenderer->circleColor() );
238
if ( newColor.isValid() )
240
mRenderer->setCircleColor( newColor );
241
mCircleColorButton->setColor( newColor );
245
void QgsPointDisplacementRendererWidget::on_mLabelColorButton_clicked()
252
#if QT_VERSION >= 0x040500
253
QColor newColor = QColorDialog::getColor( mRenderer->labelColor(), 0, tr( "Label color" ), QColorDialog::ShowAlphaChannel );
255
QColor newColor = QColorDialog::getColor( mRenderer->labelColor() );
257
if ( newColor.isValid() )
259
mRenderer->setLabelColor( newColor );
260
mLabelColorButton->setColor( newColor );
264
void QgsPointDisplacementRendererWidget::on_mCircleModificationSpinBox_valueChanged( double d )
271
mRenderer->setCircleRadiusAddition( d );
274
void QgsPointDisplacementRendererWidget::on_mDistanceSpinBox_valueChanged( double d )
278
mRenderer->setTolerance( d );
282
void QgsPointDisplacementRendererWidget::on_mScaleDependentLabelsCheckBox_stateChanged( int state )
284
if ( state == Qt::Unchecked )
286
mMaxScaleDenominatorEdit->setText( "-1" );
287
mMaxScaleDenominatorEdit->setEnabled( false );
291
mMaxScaleDenominatorEdit->setEnabled( true );
295
void QgsPointDisplacementRendererWidget::on_mMaxScaleDenominatorEdit_textChanged( const QString & text )
303
double scaleDenominator = text.toDouble( &ok );
306
mRenderer->setMaxLabelScaleDenominator( scaleDenominator );
310
void QgsPointDisplacementRendererWidget::blockAllSignals( bool block )
312
mLabelFieldComboBox->blockSignals( block );
313
mLabelFontButton->blockSignals( block );
314
mCircleWidthSpinBox->blockSignals( block );
315
mCircleColorButton->blockSignals( block );
316
mRendererComboBox->blockSignals( block );
317
mLabelColorButton->blockSignals( block );
318
mCircleModificationSpinBox->blockSignals( block );
319
mScaleDependentLabelsCheckBox->blockSignals( block );
320
mMaxScaleDenominatorEdit->blockSignals( block );
321
mCenterSymbolPushButton->blockSignals( block );
322
mDistanceSpinBox->blockSignals( block );
325
void QgsPointDisplacementRendererWidget::on_mCenterSymbolPushButton_clicked()
327
if ( !mRenderer || !mRenderer->centerSymbol() )
331
QgsMarkerSymbolV2* markerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( mRenderer->centerSymbol()->clone() );
332
QgsSymbolV2SelectorDialog dlg( markerSymbol, QgsStyleV2::defaultStyle(), this );
333
if ( dlg.exec() == QDialog::Rejected )
338
mRenderer->setCenterSymbol( markerSymbol );
342
void QgsPointDisplacementRendererWidget::updateCenterIcon()
344
QgsMarkerSymbolV2* symbol = mRenderer->centerSymbol();
349
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( symbol, mCenterSymbolPushButton->iconSize() );
350
mCenterSymbolPushButton->setIcon( icon );
353
void QgsPointDisplacementRendererWidget::setupBlankUi( const QString& layerName )
355
QGridLayout* layout = new QGridLayout( this );
356
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 );
357
layout->addWidget( label );