|
QGIS API Documentation
master-59fd5e0
|
00001 /*************************************************************************** 00002 qgspointdisplacementrendererwidget.cpp 00003 -------------------------------------- 00004 begin : January 26, 2010 00005 copyright : (C) 2010 by Marco Hugentobler 00006 email : marco at hugis dot net 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 00015 * * 00016 ***************************************************************************/ 00017 00018 #include "qgspointdisplacementrendererwidget.h" 00019 #include "qgspointdisplacementrenderer.h" 00020 #include "qgsrendererv2registry.h" 00021 #include "qgsfield.h" 00022 #include "qgsstylev2.h" 00023 #include "qgssymbolv2selectordialog.h" 00024 #include "qgssymbollayerv2utils.h" 00025 #include "qgsvectorlayer.h" 00026 #include <QColorDialog> 00027 #include <QFontDialog> 00028 00029 QgsRendererV2Widget* QgsPointDisplacementRendererWidget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) 00030 { 00031 return new QgsPointDisplacementRendererWidget( layer, style, renderer ); 00032 } 00033 00034 QgsPointDisplacementRendererWidget::QgsPointDisplacementRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) 00035 : QgsRendererV2Widget( layer, style ), mEmbeddedRendererWidget( 0 ) 00036 { 00037 if ( !layer ) 00038 { 00039 return; 00040 } 00041 00042 //the renderer only applies to point vector layers 00043 if ( layer->wkbType() != QGis::WKBPoint && layer->wkbType() != QGis::WKBPoint25D ) 00044 { 00045 //setup blank dialog 00046 mRenderer = 0; 00047 setupBlankUi( layer->name() ); 00048 return; 00049 } 00050 setupUi( this ); 00051 00052 if ( renderer && renderer->type() == "pointDisplacement" ) 00053 { 00054 mRenderer = dynamic_cast<QgsPointDisplacementRenderer*>( renderer->clone() ); 00055 } 00056 else 00057 { 00058 mRenderer = new QgsPointDisplacementRenderer(); 00059 } 00060 00061 blockAllSignals( true ); 00062 00063 //insert attributes into combo box 00064 if ( layer ) 00065 { 00066 const QgsFields& layerAttributes = layer->pendingFields(); 00067 for ( int idx = 0; idx < layerAttributes.count(); ++idx ) 00068 { 00069 mLabelFieldComboBox->addItem( layerAttributes[idx].name() ); 00070 } 00071 mLabelFieldComboBox->addItem( tr( "None" ) ); 00072 00073 QString currentLabelAttribute = mRenderer->labelAttributeName(); 00074 if ( !currentLabelAttribute.isEmpty() ) 00075 { 00076 mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( currentLabelAttribute ) ); 00077 } 00078 else 00079 { 00080 mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( tr( "None" ) ) ); 00081 } 00082 } 00083 00084 //insert possible renderer types 00085 QStringList rendererList = QgsRendererV2Registry::instance()->renderersList(); 00086 QStringList::const_iterator it = rendererList.constBegin(); 00087 for ( ; it != rendererList.constEnd(); ++it ) 00088 { 00089 if ( *it != "pointDisplacement" ) 00090 { 00091 QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( *it ); 00092 mRendererComboBox->addItem( m->icon(), m->visibleName(), *it ); 00093 } 00094 } 00095 00096 mCircleWidthSpinBox->setValue( mRenderer->circleWidth() ); 00097 mCircleColorButton->setColor( mRenderer->circleColor() ); 00098 mLabelColorButton->setColor( mRenderer->labelColor() ); 00099 mCircleModificationSpinBox->setValue( mRenderer->circleRadiusAddition() ); 00100 mDistanceSpinBox->setValue( mRenderer->tolerance() ); 00101 00102 //scale dependent labelling 00103 mMaxScaleDenominatorEdit->setText( QString::number( mRenderer->maxLabelScaleDenominator() ) ); 00104 mMaxScaleDenominatorEdit->setValidator( new QDoubleValidator( mMaxScaleDenominatorEdit ) ); 00105 if ( mRenderer->maxLabelScaleDenominator() > 0 ) 00106 { 00107 mScaleDependentLabelsCheckBox->setCheckState( Qt::Checked ); 00108 } 00109 else 00110 { 00111 mScaleDependentLabelsCheckBox->setCheckState( Qt::Unchecked ); 00112 mMaxScaleDenominatorEdit->setEnabled( false ); 00113 } 00114 00115 00116 blockAllSignals( false ); 00117 00118 //set the appropriate renderer dialog 00119 if ( mRenderer && mRenderer->embeddedRenderer() ) 00120 { 00121 QString rendererName = mRenderer->embeddedRenderer()->type(); 00122 int rendererIndex = mRendererComboBox->findData( rendererName ); 00123 if ( rendererIndex != -1 ) 00124 { 00125 mRendererComboBox->setCurrentIndex( rendererIndex ); 00126 on_mRendererComboBox_currentIndexChanged( rendererIndex ); 00127 } 00128 } 00129 00130 updateCenterIcon(); 00131 } 00132 00133 QgsPointDisplacementRendererWidget::~QgsPointDisplacementRendererWidget() 00134 { 00135 delete mRenderer; 00136 delete mEmbeddedRendererWidget; 00137 } 00138 00139 QgsFeatureRendererV2* QgsPointDisplacementRendererWidget::renderer() 00140 { 00141 if ( mRenderer && mEmbeddedRendererWidget ) 00142 { 00143 QgsFeatureRendererV2* embeddedRenderer = mEmbeddedRendererWidget->renderer(); 00144 if ( embeddedRenderer ) 00145 { 00146 mRenderer->setEmbeddedRenderer( embeddedRenderer->clone() ); 00147 } 00148 } 00149 return mRenderer; 00150 } 00151 00152 void QgsPointDisplacementRendererWidget::on_mLabelFieldComboBox_currentIndexChanged( const QString& text ) 00153 { 00154 if ( mRenderer ) 00155 { 00156 if ( text == tr( "None" ) ) 00157 { 00158 mRenderer->setLabelAttributeName( "" ); 00159 } 00160 else 00161 { 00162 mRenderer->setLabelAttributeName( text ); 00163 } 00164 } 00165 } 00166 00167 void QgsPointDisplacementRendererWidget::on_mRendererComboBox_currentIndexChanged( int index ) 00168 { 00169 QString rendererId = mRendererComboBox->itemData( index ).toString(); 00170 QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( rendererId ); 00171 if ( m ) 00172 { 00173 delete mEmbeddedRendererWidget; 00174 mEmbeddedRendererWidget = m->createRendererWidget( mLayer, mStyle, mRenderer->embeddedRenderer()->clone() ); 00175 } 00176 } 00177 00178 void QgsPointDisplacementRendererWidget::on_mRendererSettingsButton_clicked() 00179 { 00180 if ( mEmbeddedRendererWidget ) 00181 { 00182 //create a dialog with the embedded widget 00183 QDialog* d = new QDialog(); 00184 QGridLayout* layout = new QGridLayout( d ); 00185 mEmbeddedRendererWidget->setParent( d ); 00186 QDialogButtonBox* buttonBox = new QDialogButtonBox( d ); 00187 buttonBox->addButton( QDialogButtonBox::Ok ); 00188 QObject::connect( buttonBox, SIGNAL( accepted() ), d, SLOT( accept() ) ); 00189 layout->addWidget( mEmbeddedRendererWidget, 0, 0 ); 00190 layout->addWidget( buttonBox, 1, 0 ); 00191 d->exec(); 00192 mEmbeddedRendererWidget->setParent( 0 ); 00193 delete d; 00194 } 00195 } 00196 00197 void QgsPointDisplacementRendererWidget::on_mLabelFontButton_clicked() 00198 { 00199 if ( !mRenderer ) 00200 { 00201 return; 00202 } 00203 00204 bool ok; 00205 #if defined(Q_WS_MAC) && QT_VERSION >= 0x040500 && defined(QT_MAC_USE_COCOA) 00206 // Native Mac dialog works only for QT Carbon 00207 QFont newFont = QFontDialog::getFont( &ok, mRenderer->labelFont(), 0, tr( "Label Font" ), QFontDialog::DontUseNativeDialog ); 00208 #else 00209 QFont newFont = QFontDialog::getFont( &ok, mRenderer->labelFont(), 0, tr( "Label Font" ) ); 00210 #endif 00211 if ( ok ) 00212 { 00213 mRenderer->setLabelFont( newFont ); 00214 } 00215 } 00216 00217 void QgsPointDisplacementRendererWidget::on_mCircleWidthSpinBox_valueChanged( double d ) 00218 { 00219 if ( mRenderer ) 00220 { 00221 mRenderer->setCircleWidth( d ); 00222 } 00223 } 00224 00225 void QgsPointDisplacementRendererWidget::on_mCircleColorButton_colorChanged( const QColor& newColor ) 00226 { 00227 if ( !mRenderer ) 00228 { 00229 return; 00230 } 00231 00232 mRenderer->setCircleColor( newColor ); 00233 } 00234 00235 void QgsPointDisplacementRendererWidget::on_mLabelColorButton_colorChanged( const QColor& newColor ) 00236 { 00237 if ( !mRenderer ) 00238 { 00239 return; 00240 } 00241 00242 mRenderer->setLabelColor( newColor ); 00243 } 00244 00245 void QgsPointDisplacementRendererWidget::on_mCircleModificationSpinBox_valueChanged( double d ) 00246 { 00247 if ( !mRenderer ) 00248 { 00249 return; 00250 } 00251 00252 mRenderer->setCircleRadiusAddition( d ); 00253 } 00254 00255 void QgsPointDisplacementRendererWidget::on_mDistanceSpinBox_valueChanged( double d ) 00256 { 00257 if ( mRenderer ) 00258 { 00259 mRenderer->setTolerance( d ); 00260 } 00261 } 00262 00263 void QgsPointDisplacementRendererWidget::on_mScaleDependentLabelsCheckBox_stateChanged( int state ) 00264 { 00265 if ( state == Qt::Unchecked ) 00266 { 00267 mMaxScaleDenominatorEdit->setText( "-1" ); 00268 mMaxScaleDenominatorEdit->setEnabled( false ); 00269 } 00270 else 00271 { 00272 mMaxScaleDenominatorEdit->setEnabled( true ); 00273 } 00274 } 00275 00276 void QgsPointDisplacementRendererWidget::on_mMaxScaleDenominatorEdit_textChanged( const QString & text ) 00277 { 00278 if ( !mRenderer ) 00279 { 00280 return; 00281 } 00282 00283 bool ok; 00284 double scaleDenominator = text.toDouble( &ok ); 00285 if ( ok ) 00286 { 00287 mRenderer->setMaxLabelScaleDenominator( scaleDenominator ); 00288 } 00289 } 00290 00291 void QgsPointDisplacementRendererWidget::blockAllSignals( bool block ) 00292 { 00293 mLabelFieldComboBox->blockSignals( block ); 00294 mLabelFontButton->blockSignals( block ); 00295 mCircleWidthSpinBox->blockSignals( block ); 00296 mCircleColorButton->blockSignals( block ); 00297 mRendererComboBox->blockSignals( block ); 00298 mLabelColorButton->blockSignals( block ); 00299 mCircleModificationSpinBox->blockSignals( block ); 00300 mScaleDependentLabelsCheckBox->blockSignals( block ); 00301 mMaxScaleDenominatorEdit->blockSignals( block ); 00302 mCenterSymbolPushButton->blockSignals( block ); 00303 mDistanceSpinBox->blockSignals( block ); 00304 } 00305 00306 void QgsPointDisplacementRendererWidget::on_mCenterSymbolPushButton_clicked() 00307 { 00308 if ( !mRenderer || !mRenderer->centerSymbol() ) 00309 { 00310 return; 00311 } 00312 QgsMarkerSymbolV2* markerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( mRenderer->centerSymbol()->clone() ); 00313 QgsSymbolV2SelectorDialog dlg( markerSymbol, QgsStyleV2::defaultStyle(), mLayer, this ); 00314 if ( dlg.exec() == QDialog::Rejected ) 00315 { 00316 delete markerSymbol; 00317 return; 00318 } 00319 mRenderer->setCenterSymbol( markerSymbol ); 00320 updateCenterIcon(); 00321 } 00322 00323 void QgsPointDisplacementRendererWidget::updateCenterIcon() 00324 { 00325 QgsMarkerSymbolV2* symbol = mRenderer->centerSymbol(); 00326 if ( !symbol ) 00327 { 00328 return; 00329 } 00330 QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( symbol, mCenterSymbolPushButton->iconSize() ); 00331 mCenterSymbolPushButton->setIcon( icon ); 00332 } 00333 00334 void QgsPointDisplacementRendererWidget::setupBlankUi( const QString& layerName ) 00335 { 00336 QGridLayout* layout = new QGridLayout( this ); 00337 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 ); 00338 layout->addWidget( label ); 00339 }