Skip to content

Commit b0034b1

Browse files
committedJul 5, 2012
Merge branch 'raster_transparency'
2 parents b4d8b9a + ba0f5da commit b0034b1

20 files changed

+287
-112
lines changed
 

‎src/app/qgsrasterlayerproperties.cpp

Lines changed: 97 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,6 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
178178
.arg( pyramidSentence2 ).arg( pyramidSentence3 )
179179
.arg( pyramidSentence4 ).arg( pyramidSentence5 ) );
180180

181-
// update based on lyr's current state
182-
sync();
183-
184181
QSettings settings;
185182
restoreGeometry( settings.value( "/Windows/RasterLayerProperties/geometry" ).toByteArray() );
186183
tabBar->setCurrentIndex( settings.value( "/Windows/RasterLayerProperties/row" ).toInt() );
@@ -301,6 +298,9 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
301298
}
302299
}
303300
on_mRenderTypeComboBox_currentIndexChanged( mRenderTypeComboBox->currentIndex() );
301+
302+
// update based on lyr's current state
303+
sync();
304304
} // QgsRasterLayerProperties ctor
305305

306306

@@ -315,100 +315,64 @@ QgsRasterLayerProperties::~QgsRasterLayerProperties()
315315
}
316316
}
317317

318-
/*
319-
*
320-
* PUBLIC METHODS
321-
*
322-
*/
323-
324-
void QgsRasterLayerProperties::populateTransparencyTable()
318+
void QgsRasterLayerProperties::populateTransparencyTable( QgsRasterRenderer* renderer )
325319
{
326320
QgsDebugMsg( "entering." );
327321
if ( !mRasterLayer )
328322
{
329323
return;
330324
}
331-
QgsRasterRenderer* renderer = mRasterLayer->renderer();
325+
332326
if ( !renderer )
333327
{
334328
return;
335329
}
336330

337-
const QgsRasterTransparency* rasterTransparency = renderer->rasterTransparency();
331+
tableTransparency->clear();
332+
tableTransparency->setColumnCount( 0 );
333+
tableTransparency->setRowCount( 0 );
338334

339-
//Clear existing color transparency list
340-
//NOTE: May want to just tableTransparency->clearContents() and fill back in after checking to be sure list and table are the same size
341-
QString myNumberFormatter;
342-
if ( mRasterLayer->bandCount() == 3 )
335+
QList<int> bandList = renderer->usesBands();
336+
tableTransparency->setColumnCount( bandList.size() + 1 );
337+
for ( int i = 0; i < bandList.size(); ++i )
343338
{
344-
for ( int myTableRunner = tableTransparency->rowCount() - 1; myTableRunner >= 0; myTableRunner-- )
345-
{
346-
tableTransparency->removeRow( myTableRunner );
347-
}
348-
349-
tableTransparency->clear();
350-
tableTransparency->setColumnCount( 4 );
351-
tableTransparency->setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Red" ) ) );
352-
tableTransparency->setHorizontalHeaderItem( 1, new QTableWidgetItem( tr( "Green" ) ) );
353-
tableTransparency->setHorizontalHeaderItem( 2, new QTableWidgetItem( tr( "Blue" ) ) );
354-
tableTransparency->setHorizontalHeaderItem( 3, new QTableWidgetItem( tr( "Percent Transparent" ) ) );
339+
tableTransparency->setHorizontalHeaderItem( i, new QTableWidgetItem( QString::number( bandList.at( i ) ) ) );
340+
}
341+
tableTransparency->setHorizontalHeaderItem( bandList.size(), new QTableWidgetItem( tr( "Percent Transparent" ) ) );
355342

343+
const QgsRasterTransparency* rasterTransparency = renderer->rasterTransparency();
344+
if ( !rasterTransparency )
345+
{
346+
return;
347+
}
356348

357-
//populate three band transparency list
358-
if ( rasterTransparency )
349+
if ( bandList.count() == 1 )
350+
{
351+
QList<QgsRasterTransparency::TransparentSingleValuePixel> pixelList = rasterTransparency->transparentSingleValuePixelList();
352+
for ( int i = 0; i < pixelList.size(); ++i )
359353
{
360-
QList<QgsRasterTransparency::TransparentThreeValuePixel> myTransparentThreeValuePixelList = rasterTransparency->transparentThreeValuePixelList();
361-
for ( int myListRunner = 0; myListRunner < myTransparentThreeValuePixelList.count(); myListRunner++ )
362-
{
363-
tableTransparency->insertRow( myListRunner );
364-
QTableWidgetItem* myRedItem = new QTableWidgetItem( myNumberFormatter.sprintf( "%.2f", myTransparentThreeValuePixelList[myListRunner].red ) );
365-
QTableWidgetItem* myGreenItem = new QTableWidgetItem( myNumberFormatter.sprintf( "%.2f", myTransparentThreeValuePixelList[myListRunner].green ) );
366-
QTableWidgetItem* myBlueItem = new QTableWidgetItem( myNumberFormatter.sprintf( "%.2f", myTransparentThreeValuePixelList[myListRunner].blue ) );
367-
QTableWidgetItem* myPercentTransparentItem = new QTableWidgetItem( myNumberFormatter.sprintf( "%.2f", myTransparentThreeValuePixelList[myListRunner].percentTransparent ) );
368-
369-
tableTransparency->setItem( myListRunner, 0, myRedItem );
370-
tableTransparency->setItem( myListRunner, 1, myGreenItem );
371-
tableTransparency->setItem( myListRunner, 2, myBlueItem );
372-
tableTransparency->setItem( myListRunner, 3, myPercentTransparentItem );
373-
}
354+
tableTransparency->insertRow( i );
355+
QTableWidgetItem* grayItem = new QTableWidgetItem( QString::number( pixelList[i].pixelValue ) );
356+
QTableWidgetItem* percentItem = new QTableWidgetItem( QString::number( pixelList[i].percentTransparent ) );
357+
tableTransparency->setItem( i, 0, grayItem );
358+
tableTransparency->setItem( i, 1, percentItem );
374359
}
375360
}
376-
else if ( mRasterLayer->bandCount() == 1 )
361+
else if ( bandList.count() == 3 )
377362
{
378-
//Clear existing single band or palette values transparency list
379-
for ( int myTableRunner = tableTransparency->rowCount() - 1; myTableRunner >= 0; myTableRunner-- )
380-
{
381-
tableTransparency->removeRow( myTableRunner );
382-
}
383-
384-
tableTransparency->clear();
385-
tableTransparency->setColumnCount( 2 );
386-
if ( QgsRasterLayer::PalettedColor != mRasterLayer->drawingStyle() &&
387-
QgsRasterLayer::PalettedSingleBandGray != mRasterLayer->drawingStyle() &&
388-
QgsRasterLayer::PalettedSingleBandPseudoColor != mRasterLayer->drawingStyle() &&
389-
QgsRasterLayer::PalettedMultiBandColor != mRasterLayer->drawingStyle() )
390-
{
391-
tableTransparency->setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Gray" ) ) );
392-
}
393-
else
363+
QList<QgsRasterTransparency::TransparentThreeValuePixel> pixelList = rasterTransparency->transparentThreeValuePixelList();
364+
for ( int i = 0; i < pixelList.size(); ++i )
394365
{
395-
tableTransparency->setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Indexed Value" ) ) );
396-
}
397-
tableTransparency->setHorizontalHeaderItem( 1, new QTableWidgetItem( tr( "Percent Transparent" ) ) );
398-
399-
//populate gray transparency list
400-
if ( rasterTransparency )
401-
{
402-
QList<QgsRasterTransparency::TransparentSingleValuePixel> myTransparentSingleValuePixelList = rasterTransparency->transparentSingleValuePixelList();
403-
for ( int myListRunner = 0; myListRunner < myTransparentSingleValuePixelList.count(); myListRunner++ )
404-
{
405-
tableTransparency->insertRow( myListRunner );
406-
QTableWidgetItem* myGrayItem = new QTableWidgetItem( myNumberFormatter.sprintf( "%g", myTransparentSingleValuePixelList[myListRunner].pixelValue ) );
407-
QTableWidgetItem* myPercentTransparentItem = new QTableWidgetItem( myNumberFormatter.sprintf( "%.2f", myTransparentSingleValuePixelList[myListRunner].percentTransparent ) );
408-
409-
tableTransparency->setItem( myListRunner, 0, myGrayItem );
410-
tableTransparency->setItem( myListRunner, 1, myPercentTransparentItem );
411-
}
366+
tableTransparency->insertRow( i );
367+
QTableWidgetItem* redItem = new QTableWidgetItem( QString::number( pixelList[i].red ) );
368+
QTableWidgetItem* greenItem = new QTableWidgetItem( QString::number( pixelList[i].green ) );
369+
QTableWidgetItem* blueItem = new QTableWidgetItem( QString::number( pixelList[i].blue ) );
370+
QTableWidgetItem* transparentItem = new QTableWidgetItem( QString::number( pixelList[i].percentTransparent ) );
371+
372+
tableTransparency->setItem( i, 0, redItem );
373+
tableTransparency->setItem( i, 1, greenItem );
374+
tableTransparency->setItem( i, 2, blueItem );
375+
tableTransparency->setItem( i, 3, transparentItem );
412376
}
413377
}
414378

@@ -418,8 +382,7 @@ void QgsRasterLayerProperties::populateTransparencyTable()
418382

419383
void QgsRasterLayerProperties::setRendererWidget( const QString& rendererName )
420384
{
421-
delete mRendererWidget;
422-
mRendererWidget = 0;
385+
QgsRasterRendererWidget* oldWidget = mRendererWidget;
423386

424387
QgsRasterRendererRegistryEntry rendererEntry;
425388
if ( QgsRasterRendererRegistry::instance()->rendererData( rendererName, rendererEntry ) )
@@ -428,8 +391,23 @@ void QgsRasterLayerProperties::setRendererWidget( const QString& rendererName )
428391
{
429392
mRendererWidget = ( *rendererEntry.widgetCreateFunction )( mRasterLayer );
430393
mRendererStackedWidget->addWidget( mRendererWidget );
394+
if ( oldWidget )
395+
{
396+
//compare used bands in new and old renderer and reset transparency dialog if different
397+
QgsRasterRenderer* oldRenderer = oldWidget->renderer();
398+
QgsRasterRenderer* newRenderer = mRendererWidget->renderer();
399+
QList<int> oldBands = oldRenderer->usesBands();
400+
QList<int> newBands = newRenderer->usesBands();
401+
if ( oldBands != newBands )
402+
{
403+
populateTransparencyTable( newRenderer );
404+
}
405+
delete oldRenderer;
406+
delete newRenderer;
407+
}
431408
}
432409
}
410+
delete oldWidget;
433411
}
434412

435413
/**
@@ -505,7 +483,7 @@ void QgsRasterLayerProperties::sync()
505483
leNoDataValue->insert( "" );
506484
}
507485

508-
populateTransparencyTable();
486+
populateTransparencyTable( mRasterLayer->renderer() );
509487

510488
QgsDebugMsg( "populate colormap tab" );
511489
/*
@@ -623,7 +601,7 @@ void QgsRasterLayerProperties::apply()
623601

624602
//Walk through each row in table and test value. If not valid set to 0.0 and continue building transparency list
625603
QgsRasterTransparency* rasterTransparency = new QgsRasterTransparency();
626-
if ( mRasterLayer->bandCount() == 3 )
604+
if ( tableTransparency->columnCount() == 4 )
627605
{
628606
double myTransparentValue;
629607
double myPercentTransparent;
@@ -723,7 +701,7 @@ void QgsRasterLayerProperties::apply()
723701
}
724702
rasterTransparency->setTransparentThreeValuePixelList( myTransparentThreeValuePixelList );
725703
}
726-
else if ( mRasterLayer->bandCount() == 1 )
704+
else if ( tableTransparency->columnCount() == 2 )
727705
{
728706
double myTransparentValue;
729707
double myPercentTransparent;
@@ -1012,9 +990,21 @@ void QgsRasterLayerProperties::on_pbnChangeSpatialRefSys_clicked()
1012990

1013991
void QgsRasterLayerProperties::on_pbnDefaultValues_clicked()
1014992
{
993+
if ( !mRendererWidget )
994+
{
995+
return;
996+
}
1015997

1016-
if ( /*rbtnThreeBand->isChecked() &&*/ QgsRasterLayer::PalettedColor != mRasterLayer->drawingStyle() &&
1017-
QgsRasterLayer::PalettedMultiBandColor != mRasterLayer->drawingStyle() )
998+
QgsRasterRenderer* r = mRendererWidget->renderer();
999+
if ( !r )
1000+
{
1001+
return;
1002+
}
1003+
1004+
int nBands = r->usesBands().size();
1005+
delete r;
1006+
1007+
if ( nBands == 3 )
10181008
{
10191009
tableTransparency->clear();
10201010
tableTransparency->setColumnCount( 4 );
@@ -1031,7 +1021,7 @@ void QgsRasterLayerProperties::on_pbnDefaultValues_clicked()
10311021
tableTransparency->setItem( 0, 3, new QTableWidgetItem( "100.0" ) );
10321022
}
10331023
}
1034-
else
1024+
else //1 band
10351025
{
10361026
tableTransparency->clear();
10371027
tableTransparency->setColumnCount( 2 );
@@ -1054,7 +1044,6 @@ void QgsRasterLayerProperties::on_pbnDefaultValues_clicked()
10541044
tableTransparency->setItem( 0, 0, new QTableWidgetItem( QString::number( mRasterLayer->noDataValue(), 'f' ) ) );
10551045
tableTransparency->setItem( 0, 1, new QTableWidgetItem( "100.0" ) );
10561046
}
1057-
10581047
}
10591048
}
10601049

@@ -1362,44 +1351,42 @@ void QgsRasterLayerProperties::on_pbnRemoveSelectedRow_clicked()
13621351

13631352
void QgsRasterLayerProperties::pixelSelected( const QgsPoint& canvasPoint )
13641353
{
1365-
#if 0 //needs to be fixed
1366-
//PixelSelectorTool has registered a mouse click on the canvas, so bring the dialog back to the front
1354+
QgsRasterRenderer* renderer = mRendererWidget->renderer();
1355+
if ( !renderer )
1356+
{
1357+
return;
1358+
}
1359+
13671360
raise();
13681361
setModal( true );
13691362
activateWindow();
13701363

13711364
//Get the pixel values and add a new entry to the transparency table
13721365
if ( mMapCanvas && mPixelSelectorTool )
13731366
{
1374-
QMap< QString, QString > myPixelMap;
1367+
QMap< int, QString > myPixelMap;
13751368
mMapCanvas->unsetMapTool( mPixelSelectorTool );
13761369
mRasterLayer->identify( mMapCanvas->mapRenderer()->mapToLayerCoordinates( mRasterLayer, canvasPoint ), myPixelMap );
1377-
if ( tableTransparency->columnCount() == 2 )
1378-
{
1379-
QString myValue = myPixelMap[ mRasterLayer->grayBandName()];
1380-
if ( myValue != tr( "out of extent" ) )
1381-
{
1382-
tableTransparency->insertRow( tableTransparency->rowCount() );
1383-
tableTransparency->setItem( tableTransparency->rowCount() - 1, tableTransparency->columnCount() - 1, new QTableWidgetItem( "100.0" ) );
1384-
tableTransparency->setItem( tableTransparency->rowCount() - 1, 0, new QTableWidgetItem( myValue ) );
1385-
}
1386-
}
1387-
else
1370+
1371+
QList<int> bands = renderer->usesBands();
1372+
tableTransparency->insertRow( tableTransparency->rowCount() );
1373+
tableTransparency->setItem( tableTransparency->rowCount() - 1, tableTransparency->columnCount() - 1, new QTableWidgetItem( "100.0" ) );
1374+
1375+
for ( int i = 0; i < bands.size(); ++i )
13881376
{
1389-
QString myValue = myPixelMap[ mRasterLayer->redBandName()];
1390-
if ( myValue != tr( "out of extent" ) )
1377+
QMap< int, QString >::const_iterator pixelResult = myPixelMap.find( bands.at( i ) );
1378+
if ( pixelResult != myPixelMap.constEnd() )
13911379
{
1392-
tableTransparency->insertRow( tableTransparency->rowCount() );
1393-
tableTransparency->setItem( tableTransparency->rowCount() - 1, tableTransparency->columnCount() - 1, new QTableWidgetItem( "100.0" ) );
1394-
tableTransparency->setItem( tableTransparency->rowCount() - 1, 0, new QTableWidgetItem( myValue ) );
1395-
tableTransparency->setItem( tableTransparency->rowCount() - 1, 1, new QTableWidgetItem( myPixelMap[ mRasterLayer->greenBandName()] ) );
1396-
tableTransparency->setItem( tableTransparency->rowCount() - 1, 2, new QTableWidgetItem( myPixelMap[ mRasterLayer->blueBandName()] ) );
1380+
QString value = pixelResult.value();
1381+
if ( value != tr( "out of extent" ) )
1382+
{
1383+
tableTransparency->setItem( tableTransparency->rowCount() - 1, i, new QTableWidgetItem( value ) );
1384+
}
13971385
}
13981386
}
13991387
}
1400-
#else
1401-
Q_UNUSED( canvasPoint );
1402-
#endif //0
1388+
1389+
delete renderer;
14031390
}
14041391

14051392
void QgsRasterLayerProperties::sliderTransparency_valueChanged( int theValue )

‎src/app/qgsrasterlayerproperties.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class QgsMapLayer;
2929
class QgsMapCanvas;
3030
class QgsRasterLayer;
3131
class QgsMapToolEmitPoint;
32+
class QgsRasterRenderer;
3233
class QgsRasterRendererWidget;
3334

3435
/**Property sheet for a raster map layer
@@ -137,7 +138,7 @@ class QgsRasterLayerProperties : public QDialog, private Ui::QgsRasterLayerPrope
137138
QgsRasterRendererWidget* mRendererWidget;
138139

139140
/** \brief Clear the current transparency table and populate the table with the correct types for current drawing mode and data type*/
140-
void populateTransparencyTable();
141+
void populateTransparencyTable( QgsRasterRenderer* renderer );
141142

142143
void setRendererWidget( const QString& rendererName );
143144

‎src/core/qgsrasterdataprovider.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,13 @@ bool QgsRasterDataProvider::identify( const QgsPoint& thePoint, QMap<QString, QS
184184
return false;
185185
}
186186

187+
bool QgsRasterDataProvider::identify( const QgsPoint & point, QMap<int, QString>& results )
188+
{
189+
Q_UNUSED( point );
190+
results.clear();
191+
return false;
192+
}
193+
187194
QString QgsRasterDataProvider::lastErrorFormat()
188195
{
189196
return "text/plain";

‎src/core/qgsrasterdataprovider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,8 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider
390390
/** \brief Identify raster value(s) found on the point position */
391391
virtual bool identify( const QgsPoint & point, QMap<QString, QString>& results );
392392

393+
virtual bool identify( const QgsPoint & point, QMap<int, QString>& results );
394+
393395
/**
394396
* \brief Identify details from a server (e.g. WMS) from the last screen update
395397
*

0 commit comments

Comments
 (0)
Please sign in to comment.