@@ -178,9 +178,6 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
178
178
.arg ( pyramidSentence2 ).arg ( pyramidSentence3 )
179
179
.arg ( pyramidSentence4 ).arg ( pyramidSentence5 ) );
180
180
181
- // update based on lyr's current state
182
- sync ();
183
-
184
181
QSettings settings;
185
182
restoreGeometry ( settings.value ( " /Windows/RasterLayerProperties/geometry" ).toByteArray () );
186
183
tabBar->setCurrentIndex ( settings.value ( " /Windows/RasterLayerProperties/row" ).toInt () );
@@ -301,6 +298,9 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
301
298
}
302
299
}
303
300
on_mRenderTypeComboBox_currentIndexChanged ( mRenderTypeComboBox ->currentIndex () );
301
+
302
+ // update based on lyr's current state
303
+ sync ();
304
304
} // QgsRasterLayerProperties ctor
305
305
306
306
@@ -315,100 +315,64 @@ QgsRasterLayerProperties::~QgsRasterLayerProperties()
315
315
}
316
316
}
317
317
318
- /*
319
- *
320
- * PUBLIC METHODS
321
- *
322
- */
323
-
324
- void QgsRasterLayerProperties::populateTransparencyTable ()
318
+ void QgsRasterLayerProperties::populateTransparencyTable ( QgsRasterRenderer* renderer )
325
319
{
326
320
QgsDebugMsg ( " entering." );
327
321
if ( !mRasterLayer )
328
322
{
329
323
return ;
330
324
}
331
- QgsRasterRenderer* renderer = mRasterLayer -> renderer ();
325
+
332
326
if ( !renderer )
333
327
{
334
328
return ;
335
329
}
336
330
337
- const QgsRasterTransparency* rasterTransparency = renderer->rasterTransparency ();
331
+ tableTransparency->clear ();
332
+ tableTransparency->setColumnCount ( 0 );
333
+ tableTransparency->setRowCount ( 0 );
338
334
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 )
343
338
{
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" ) ) );
355
342
343
+ const QgsRasterTransparency* rasterTransparency = renderer->rasterTransparency ();
344
+ if ( !rasterTransparency )
345
+ {
346
+ return ;
347
+ }
356
348
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 )
359
353
{
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 );
374
359
}
375
360
}
376
- else if ( mRasterLayer -> bandCount () == 1 )
361
+ else if ( bandList. count () == 3 )
377
362
{
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 )
394
365
{
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 );
412
376
}
413
377
}
414
378
@@ -418,8 +382,7 @@ void QgsRasterLayerProperties::populateTransparencyTable()
418
382
419
383
void QgsRasterLayerProperties::setRendererWidget ( const QString& rendererName )
420
384
{
421
- delete mRendererWidget ;
422
- mRendererWidget = 0 ;
385
+ QgsRasterRendererWidget* oldWidget = mRendererWidget ;
423
386
424
387
QgsRasterRendererRegistryEntry rendererEntry;
425
388
if ( QgsRasterRendererRegistry::instance ()->rendererData ( rendererName, rendererEntry ) )
@@ -428,8 +391,23 @@ void QgsRasterLayerProperties::setRendererWidget( const QString& rendererName )
428
391
{
429
392
mRendererWidget = ( *rendererEntry.widgetCreateFunction )( mRasterLayer );
430
393
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
+ }
431
408
}
432
409
}
410
+ delete oldWidget;
433
411
}
434
412
435
413
/* *
@@ -505,7 +483,7 @@ void QgsRasterLayerProperties::sync()
505
483
leNoDataValue->insert ( " " );
506
484
}
507
485
508
- populateTransparencyTable ();
486
+ populateTransparencyTable ( mRasterLayer -> renderer () );
509
487
510
488
QgsDebugMsg ( " populate colormap tab" );
511
489
/*
@@ -623,7 +601,7 @@ void QgsRasterLayerProperties::apply()
623
601
624
602
// Walk through each row in table and test value. If not valid set to 0.0 and continue building transparency list
625
603
QgsRasterTransparency* rasterTransparency = new QgsRasterTransparency ();
626
- if ( mRasterLayer -> bandCount () == 3 )
604
+ if ( tableTransparency-> columnCount () == 4 )
627
605
{
628
606
double myTransparentValue;
629
607
double myPercentTransparent;
@@ -723,7 +701,7 @@ void QgsRasterLayerProperties::apply()
723
701
}
724
702
rasterTransparency->setTransparentThreeValuePixelList ( myTransparentThreeValuePixelList );
725
703
}
726
- else if ( mRasterLayer -> bandCount () == 1 )
704
+ else if ( tableTransparency-> columnCount () == 2 )
727
705
{
728
706
double myTransparentValue;
729
707
double myPercentTransparent;
@@ -1012,9 +990,21 @@ void QgsRasterLayerProperties::on_pbnChangeSpatialRefSys_clicked()
1012
990
1013
991
void QgsRasterLayerProperties::on_pbnDefaultValues_clicked ()
1014
992
{
993
+ if ( !mRendererWidget )
994
+ {
995
+ return ;
996
+ }
1015
997
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 )
1018
1008
{
1019
1009
tableTransparency->clear ();
1020
1010
tableTransparency->setColumnCount ( 4 );
@@ -1031,7 +1021,7 @@ void QgsRasterLayerProperties::on_pbnDefaultValues_clicked()
1031
1021
tableTransparency->setItem ( 0 , 3 , new QTableWidgetItem ( " 100.0" ) );
1032
1022
}
1033
1023
}
1034
- else
1024
+ else // 1 band
1035
1025
{
1036
1026
tableTransparency->clear ();
1037
1027
tableTransparency->setColumnCount ( 2 );
@@ -1054,7 +1044,6 @@ void QgsRasterLayerProperties::on_pbnDefaultValues_clicked()
1054
1044
tableTransparency->setItem ( 0 , 0 , new QTableWidgetItem ( QString::number ( mRasterLayer ->noDataValue (), ' f' ) ) );
1055
1045
tableTransparency->setItem ( 0 , 1 , new QTableWidgetItem ( " 100.0" ) );
1056
1046
}
1057
-
1058
1047
}
1059
1048
}
1060
1049
@@ -1362,44 +1351,42 @@ void QgsRasterLayerProperties::on_pbnRemoveSelectedRow_clicked()
1362
1351
1363
1352
void QgsRasterLayerProperties::pixelSelected ( const QgsPoint& canvasPoint )
1364
1353
{
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
+
1367
1360
raise ();
1368
1361
setModal ( true );
1369
1362
activateWindow ();
1370
1363
1371
1364
// Get the pixel values and add a new entry to the transparency table
1372
1365
if ( mMapCanvas && mPixelSelectorTool )
1373
1366
{
1374
- QMap< QString , QString > myPixelMap;
1367
+ QMap< int , QString > myPixelMap;
1375
1368
mMapCanvas ->unsetMapTool ( mPixelSelectorTool );
1376
1369
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 )
1388
1376
{
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 ( ) )
1391
1379
{
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
+ }
1397
1385
}
1398
1386
}
1399
1387
}
1400
- #else
1401
- Q_UNUSED ( canvasPoint );
1402
- #endif // 0
1388
+
1389
+ delete renderer;
1403
1390
}
1404
1391
1405
1392
void QgsRasterLayerProperties::sliderTransparency_valueChanged ( int theValue )
0 commit comments