QGIS API Documentation  master-59fd5e0
src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines