QGIS API Documentation  master-6164ace
src/gui/raster/qgsmultibandcolorrendererwidget.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002                          qgsmultibandcolorrendererwidget.cpp
00003                          -----------------------------------
00004     begin                : February 2012
00005     copyright            : (C) 2012 by Marco Hugentobler
00006     email                : marco at sourcepole dot ch
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 "qgsmultibandcolorrendererwidget.h"
00019 #include "qgsmultibandcolorrenderer.h"
00020 #include "qgsrasterlayer.h"
00021 
00022 QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ): QgsRasterRendererWidget( layer, extent )
00023 {
00024   setupUi( this );
00025   createValidators();
00026 
00027   if ( mRasterLayer )
00028   {
00029     QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
00030     if ( !provider )
00031     {
00032       return;
00033     }
00034 
00035     mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this );
00036     mMinMaxWidget->setExtent( extent );
00037     layout()->addWidget( mMinMaxWidget );
00038     connect( mMinMaxWidget, SIGNAL( load( int, double, double, int ) ),
00039              this, SLOT( loadMinMax( int, double, double, int ) ) );
00040 
00041     connect( mRedBandComboBox, SIGNAL( currentIndexChanged( int ) ),
00042              this, SLOT( onBandChanged( int ) ) );
00043     connect( mGreenBandComboBox, SIGNAL( currentIndexChanged( int ) ),
00044              this, SLOT( onBandChanged( int ) ) );
00045     connect( mBlueBandComboBox, SIGNAL( currentIndexChanged( int ) ),
00046              this, SLOT( onBandChanged( int ) ) );
00047 
00048     //fill available bands into combo boxes
00049     mRedBandComboBox->addItem( tr( "Not set" ), -1 );
00050     mGreenBandComboBox->addItem( tr( "Not set" ), -1 );
00051     mBlueBandComboBox->addItem( tr( "Not set" ), -1 );
00052 
00053     //contrast enhancement algorithms
00054     mContrastEnhancementAlgorithmComboBox->addItem( tr( "No enhancement" ), 0 );
00055     mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch to MinMax" ), 1 );
00056     mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch and clip to MinMax" ), 2 );
00057     mContrastEnhancementAlgorithmComboBox->addItem( tr( "Clip to MinMax" ), 3 );
00058 
00059     int nBands = provider->bandCount();
00060     for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1
00061     {
00062       QString bandName = displayBandName( i );
00063       mRedBandComboBox->addItem( bandName, i );
00064       mGreenBandComboBox->addItem( bandName, i );
00065       mBlueBandComboBox->addItem( bandName, i );
00066     }
00067 
00068     setFromRenderer( mRasterLayer->renderer() );
00069     onBandChanged( 0 ); // reset mMinMaxWidget bands
00070   }
00071 }
00072 
00073 QgsMultiBandColorRendererWidget::~QgsMultiBandColorRendererWidget()
00074 {
00075 }
00076 
00077 QgsRasterRenderer* QgsMultiBandColorRendererWidget::renderer()
00078 {
00079   if ( !mRasterLayer )
00080   {
00081     return 0;
00082   }
00083   QgsRasterDataProvider* provider = mRasterLayer->dataProvider();
00084   if ( !provider )
00085   {
00086     return 0;
00087   }
00088 
00089   int redBand = mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt();
00090   int greenBand = mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt();
00091   int blueBand = mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt();
00092 
00093   QgsMultiBandColorRenderer* r = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand );
00094   setCustomMinMaxValues( r, provider, redBand, greenBand, blueBand );
00095   return r;
00096 }
00097 
00098 void QgsMultiBandColorRendererWidget::createValidators()
00099 {
00100   mRedMinLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) );
00101   mRedMaxLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) );
00102   mGreenMinLineEdit->setValidator( new QDoubleValidator( mGreenMinLineEdit ) );
00103   mGreenMaxLineEdit->setValidator( new QDoubleValidator( mGreenMinLineEdit ) );
00104   mBlueMinLineEdit->setValidator( new QDoubleValidator( mBlueMinLineEdit ) );
00105   mBlueMaxLineEdit->setValidator( new QDoubleValidator( mBlueMinLineEdit ) );
00106 }
00107 
00108 void QgsMultiBandColorRendererWidget::setCustomMinMaxValues( QgsMultiBandColorRenderer* r,
00109     const QgsRasterDataProvider* provider,
00110     int redBand, int greenBand, int blueBand )
00111 {
00112   if ( !r || !provider )
00113   {
00114     return;
00115   }
00116 
00117   if ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ==
00118        QgsContrastEnhancement::NoEnhancement )
00119   {
00120     r->setRedContrastEnhancement( 0 );
00121     r->setGreenContrastEnhancement( 0 );
00122     r->setBlueContrastEnhancement( 0 );
00123     return;
00124   }
00125 
00126   QgsContrastEnhancement* redEnhancement = 0;
00127   QgsContrastEnhancement* greenEnhancement = 0;
00128   QgsContrastEnhancement* blueEnhancement = 0;
00129 
00130   bool redMinOk, redMaxOk;
00131   double redMin = mRedMinLineEdit->text().toDouble( &redMinOk );
00132   double redMax = mRedMaxLineEdit->text().toDouble( &redMaxOk );
00133   if ( redMinOk && redMaxOk )
00134   {
00135     redEnhancement = new QgsContrastEnhancement(( QGis::DataType )(
00136           provider->dataType( redBand ) ) );
00137     redEnhancement->setMinimumValue( redMin );
00138     redEnhancement->setMaximumValue( redMax );
00139   }
00140 
00141   bool greenMinOk, greenMaxOk;
00142   double greenMin = mGreenMinLineEdit->text().toDouble( &greenMinOk );
00143   double greenMax = mGreenMaxLineEdit->text().toDouble( &greenMaxOk );
00144   if ( greenMinOk && greenMaxOk )
00145   {
00146     greenEnhancement = new QgsContrastEnhancement(( QGis::DataType )(
00147           provider->dataType( greenBand ) ) );
00148     greenEnhancement->setMinimumValue( greenMin );
00149     greenEnhancement->setMaximumValue( greenMax );
00150   }
00151 
00152   bool blueMinOk, blueMaxOk;
00153   double blueMin = mBlueMinLineEdit->text().toDouble( &blueMinOk );
00154   double blueMax = mBlueMaxLineEdit->text().toDouble( &blueMaxOk );
00155   if ( blueMinOk && blueMaxOk )
00156   {
00157     blueEnhancement = new QgsContrastEnhancement(( QGis::DataType )(
00158           provider->dataType( blueBand ) ) );
00159     blueEnhancement->setMinimumValue( blueMin );
00160     blueEnhancement->setMaximumValue( blueMax );
00161   }
00162 
00163   if ( redEnhancement )
00164   {
00165     redEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm )
00166         ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) );
00167   }
00168   if ( greenEnhancement )
00169   {
00170     greenEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm )
00171         ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) );
00172   }
00173   if ( blueEnhancement )
00174   {
00175     blueEnhancement->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm )
00176         ( mContrastEnhancementAlgorithmComboBox->itemData( mContrastEnhancementAlgorithmComboBox->currentIndex() ).toInt() ) );
00177   }
00178   r->setRedContrastEnhancement( redEnhancement );
00179   r->setGreenContrastEnhancement( greenEnhancement );
00180   r->setBlueContrastEnhancement( blueEnhancement );
00181 }
00182 
00183 void QgsMultiBandColorRendererWidget::onBandChanged( int index )
00184 {
00185   Q_UNUSED( index );
00186 
00187   QList<int> myBands;
00188   myBands.append( mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt() );
00189   myBands.append( mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt() );
00190   myBands.append( mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt() );
00191   mMinMaxWidget->setBands( myBands );
00192 }
00193 
00194 void QgsMultiBandColorRendererWidget::loadMinMax( int theBandNo, double theMin, double theMax, int theOrigin )
00195 {
00196   Q_UNUSED( theOrigin );
00197   QgsDebugMsg( QString( "theBandNo = %1 theMin = %2 theMax = %3" ).arg( theBandNo ).arg( theMin ).arg( theMax ) );
00198 
00199   QLineEdit *myMinLineEdit, *myMaxLineEdit;
00200 
00201   if ( mRedBandComboBox->itemData( mRedBandComboBox->currentIndex() ).toInt() == theBandNo )
00202   {
00203     myMinLineEdit = mRedMinLineEdit;
00204     myMaxLineEdit = mRedMaxLineEdit;
00205   }
00206   else if ( mGreenBandComboBox->itemData( mGreenBandComboBox->currentIndex() ).toInt() == theBandNo )
00207   {
00208     myMinLineEdit = mGreenMinLineEdit;
00209     myMaxLineEdit = mGreenMaxLineEdit;
00210   }
00211   else if ( mBlueBandComboBox->itemData( mBlueBandComboBox->currentIndex() ).toInt() == theBandNo )
00212   {
00213     myMinLineEdit = mBlueMinLineEdit;
00214     myMaxLineEdit = mBlueMaxLineEdit;
00215   }
00216   else // should not happen
00217   {
00218     QgsDebugMsg( "Band not found" );
00219     return;
00220   }
00221 
00222   if ( qIsNaN( theMin ) )
00223   {
00224     myMinLineEdit->clear();
00225   }
00226   else
00227   {
00228     myMinLineEdit->setText( QString::number( theMin ) );
00229   }
00230 
00231   if ( qIsNaN( theMax ) )
00232   {
00233     myMaxLineEdit->clear();
00234   }
00235   else
00236   {
00237     myMaxLineEdit->setText( QString::number( theMax ) );
00238   }
00239 }
00240 
00241 void QgsMultiBandColorRendererWidget::setMinMaxValue( const QgsContrastEnhancement* ce, QLineEdit* minEdit, QLineEdit* maxEdit )
00242 {
00243   if ( !minEdit || !maxEdit )
00244   {
00245     return;
00246   }
00247 
00248   if ( !ce )
00249   {
00250     minEdit->clear();
00251     maxEdit->clear();
00252     return;
00253   }
00254 
00255   minEdit->setText( QString::number( ce->minimumValue() ) );
00256   maxEdit->setText( QString::number( ce->maximumValue() ) );
00257 
00258   // QgsMultiBandColorRenderer is using individual contrast enhancements for each
00259   // band, but this widget GUI has one for all
00260   mContrastEnhancementAlgorithmComboBox->setCurrentIndex( mContrastEnhancementAlgorithmComboBox->findData(
00261         ( int )( ce->contrastEnhancementAlgorithm() ) ) );
00262 }
00263 
00264 void QgsMultiBandColorRendererWidget::setFromRenderer( const QgsRasterRenderer* r )
00265 {
00266   const QgsMultiBandColorRenderer* mbcr = dynamic_cast<const QgsMultiBandColorRenderer*>( r );
00267   if ( mbcr )
00268   {
00269     mRedBandComboBox->setCurrentIndex( mRedBandComboBox->findData( mbcr->redBand() ) );
00270     mGreenBandComboBox->setCurrentIndex( mGreenBandComboBox->findData( mbcr->greenBand() ) );
00271     mBlueBandComboBox->setCurrentIndex( mBlueBandComboBox->findData( mbcr->blueBand() ) );
00272 
00273     setMinMaxValue( mbcr->redContrastEnhancement(), mRedMinLineEdit, mRedMaxLineEdit );
00274     setMinMaxValue( mbcr->greenContrastEnhancement(), mGreenMinLineEdit, mGreenMaxLineEdit );
00275     setMinMaxValue( mbcr->blueContrastEnhancement(), mBlueMinLineEdit, mBlueMaxLineEdit );
00276   }
00277   else
00278   {
00279     mRedBandComboBox->setCurrentIndex( mRedBandComboBox->findText( tr( "Red" ) ) );
00280     mGreenBandComboBox->setCurrentIndex( mGreenBandComboBox->findText( tr( "Green" ) ) );
00281     mBlueBandComboBox->setCurrentIndex( mBlueBandComboBox->findText( tr( "Blue" ) ) );
00282   }
00283 }
00284 
00285 QString QgsMultiBandColorRendererWidget::min( int index )
00286 {
00287   switch ( index )
00288   {
00289     case 0:
00290       return mRedMinLineEdit->text();
00291       break;
00292     case 1:
00293       return mGreenMinLineEdit->text();
00294       break;
00295     case 2:
00296       return mBlueMinLineEdit->text();
00297       break;
00298     default:
00299       break;
00300   }
00301   return QString( );
00302 }
00303 
00304 QString QgsMultiBandColorRendererWidget::max( int index )
00305 {
00306   switch ( index )
00307   {
00308     case 0:
00309       return mRedMaxLineEdit->text();
00310       break;
00311     case 1:
00312       return mGreenMaxLineEdit->text();
00313       break;
00314     case 2:
00315       return mBlueMaxLineEdit->text();
00316       break;
00317     default:
00318       break;
00319   }
00320   return QString( );
00321 }
00322 
00323 void QgsMultiBandColorRendererWidget::setMin( QString value, int index )
00324 {
00325   switch ( index )
00326   {
00327     case 0:
00328       mRedMinLineEdit->setText( value );
00329       break;
00330     case 1:
00331       mGreenMinLineEdit->setText( value );
00332       break;
00333     case 2:
00334       mBlueMinLineEdit->setText( value );
00335       break;
00336     default:
00337       break;
00338   }
00339 }
00340 
00341 void QgsMultiBandColorRendererWidget::setMax( QString value, int index )
00342 {
00343   switch ( index )
00344   {
00345     case 0:
00346       mRedMaxLineEdit->setText( value );
00347       break;
00348     case 1:
00349       mGreenMaxLineEdit->setText( value );
00350       break;
00351     case 2:
00352       mBlueMaxLineEdit->setText( value );
00353       break;
00354     default:
00355       break;
00356   }
00357 }
00358 
00359 int QgsMultiBandColorRendererWidget::selectedBand( int index )
00360 {
00361   switch ( index )
00362   {
00363     case 0:
00364       return mRedBandComboBox->currentIndex();
00365       break;
00366     case 1:
00367       return mGreenBandComboBox->currentIndex();
00368       break;
00369     case 2:
00370       return mBlueBandComboBox->currentIndex();
00371       break;
00372     default:
00373       break;
00374   }
00375   return -1;
00376 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines