Skip to content

Commit a32314d

Browse files
committed
Add a new QgsRasterBandComboBox widget
And use wherever custom widgets were being created. Reduces duplicate code and allows specialised handling for raster band display/selection to be centralized.
1 parent 3cd3e5d commit a32314d

21 files changed

+402
-156
lines changed

doc/api_break.dox

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1766,11 +1766,18 @@ QgsRasterProjector {#qgis_api_break_3_0_QgsRasterProjector}
17661766

17671767
- extentSize() now takes a QgsCoordinateTransform reference, not a pointer. An invalid QgsCoordinateTransform should be used instead of a null pointer if no transformation is required.
17681768

1769-
QgsRasterRenderer
1769+
QgsRasterRenderer {#qgis_api_break_3_0_QgsRasterRenderer}
17701770
-----------------
17711771

17721772
- MinMaxOrigin enum, minMaxOriginName(), minMaxOriginLabel(), minMaxOriginFromName() removed. Use minMaxOrigin() instead
17731773

1774+
1775+
QgsRasterRendererWidget {#qgis_api_break_3_0_QgsRasterRendererWidget}
1776+
-----------------
1777+
1778+
- displayBandName() was removed.
1779+
1780+
17741781
QgsRectangle {#qgis_api_break_3_0_QgsRectangle}
17751782
------------
17761783

python/gui/gui.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@
212212

213213
%Include raster/qgsmultibandcolorrendererwidget.sip
214214
%Include raster/qgspalettedrendererwidget.sip
215+
%Include raster/qgsrasterbandcombobox.sip
215216
%Include raster/qgsrasterhistogramwidget.sip
216217
%Include raster/qgsrasterminmaxwidget.sip
217218
%Include raster/qgsrasterrendererwidget.sip
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/************************************************************************
2+
* This file has been generated automatically from *
3+
* *
4+
* src/gui/raster/qgsrasterbandcombobox.h *
5+
* *
6+
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
7+
************************************************************************/
8+
9+
10+
11+
12+
class QgsRasterBandComboBox : QComboBox
13+
{
14+
%Docstring
15+
A combobox widget which displays the bands present in a raster layer.
16+
.. versionadded:: 3.0
17+
%End
18+
19+
%TypeHeaderCode
20+
#include "qgsrasterbandcombobox.h"
21+
%End
22+
public:
23+
24+
QgsRasterBandComboBox( QWidget *parent /TransferThis/ = 0 );
25+
%Docstring
26+
Constructor for QgsRasterBandComboBox.
27+
%End
28+
29+
QgsRasterLayer *layer() const;
30+
%Docstring
31+
Returns the layer currently associated with the combobox.
32+
.. seealso:: setLayer()
33+
:rtype: QgsRasterLayer
34+
%End
35+
36+
int currentBand() const;
37+
%Docstring
38+
Returns the current band number selected in the combobox, or -1
39+
if no band is selected.
40+
.. seealso:: setBand()
41+
:rtype: int
42+
%End
43+
44+
public slots:
45+
46+
void setLayer( QgsMapLayer *layer );
47+
%Docstring
48+
Sets the raster ``layer`` for which the bands are listed in the combobox. If no layer is set
49+
or a non-raster layer is set then the combobox will be empty.
50+
.. seealso:: layer()
51+
%End
52+
53+
void setBand( int band );
54+
%Docstring
55+
Sets the current ``band`` number selected in the combobox.
56+
.. seealso:: band()
57+
%End
58+
59+
signals:
60+
61+
void bandChanged( int band );
62+
%Docstring
63+
This signal is emitted when the currently selected band changes.
64+
%End
65+
66+
};
67+
68+
/************************************************************************
69+
* This file has been generated automatically from *
70+
* *
71+
* src/gui/raster/qgsrasterbandcombobox.h *
72+
* *
73+
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
74+
************************************************************************/

python/gui/raster/qgsrasterrendererwidget.sip

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,4 @@ class QgsRasterRendererWidget: QWidget
4444
*/
4545
void widgetChanged();
4646

47-
48-
protected:
49-
/** Returns a band name for display. First choice is color name, otherwise band number*/
50-
QString displayBandName( int band ) const;
5147
};

src/gui/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
SET(QGIS_GUI_SRCS
22
raster/qgsmultibandcolorrendererwidget.cpp
33
raster/qgspalettedrendererwidget.cpp
4+
raster/qgsrasterbandcombobox.cpp
45
raster/qgsrasterhistogramwidget.cpp
56
raster/qgsrasterminmaxwidget.cpp
67
raster/qgsrasterrendererwidget.cpp
@@ -460,6 +461,7 @@ SET(QGIS_GUI_MOC_HDRS
460461

461462
raster/qgsmultibandcolorrendererwidget.h
462463
raster/qgspalettedrendererwidget.h
464+
raster/qgsrasterbandcombobox.h
463465
raster/qgsrasterhistogramwidget.h
464466
raster/qgsrasterminmaxwidget.h
465467
raster/qgsrasterrendererwidget.h

src/gui/raster/qgshillshaderendererwidget.cpp

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,7 @@ QgsHillshadeRendererWidget::QgsHillshadeRendererWidget( QgsRasterLayer *layer, c
4141
mZFactor->setClearValue( 1 );
4242

4343
mMultiDirection->setChecked( false );
44-
45-
if ( mRasterLayer )
46-
{
47-
QgsRasterDataProvider *provider = mRasterLayer->dataProvider();
48-
if ( !provider )
49-
{
50-
return;
51-
}
52-
53-
//fill available bands into combo box
54-
int nBands = provider->bandCount();
55-
for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1
56-
{
57-
mBandsCombo->addItem( displayBandName( i ), i );
58-
}
59-
60-
}
44+
mBandsCombo->setLayer( mRasterLayer );
6145

6246
setFromRenderer( layer->renderer() );
6347

@@ -66,6 +50,7 @@ QgsHillshadeRendererWidget::QgsHillshadeRendererWidget( QgsRasterLayer *layer, c
6650
connect( mLightAzimuthDial, &QAbstractSlider::valueChanged, this, &QgsHillshadeRendererWidget::on_mLightAzimuthDail_updated );
6751
connect( mZFactor, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsRasterRendererWidget::widgetChanged );
6852
connect( mMultiDirection, &QAbstractButton::toggled, this, &QgsRasterRendererWidget::widgetChanged );
53+
connect( mBandsCombo, &QgsRasterBandComboBox::bandChanged, this, &QgsHillshadeRendererWidget::widgetChanged );
6954
}
7055

7156
QgsRasterRenderer *QgsHillshadeRendererWidget::renderer()
@@ -81,7 +66,7 @@ QgsRasterRenderer *QgsHillshadeRendererWidget::renderer()
8166
return nullptr;
8267
}
8368

84-
int band = mBandsCombo->currentData().toInt();
69+
int band = mBandsCombo->currentBand();
8570
QgsHillshadeRenderer *renderer = new QgsHillshadeRenderer( provider, band, mLightAzimuth->value(), mLightAngle->value() );
8671
double value = mZFactor->value();
8772
renderer->setZFactor( value );
@@ -94,7 +79,7 @@ void QgsHillshadeRendererWidget::setFromRenderer( const QgsRasterRenderer *rende
9479
const QgsHillshadeRenderer *r = dynamic_cast<const QgsHillshadeRenderer *>( renderer );
9580
if ( r )
9681
{
97-
mBandsCombo->setCurrentIndex( mBandsCombo->findData( r->band() ) );
82+
mBandsCombo->setBand( r->band() );
9883
mLightAngle->setValue( r->altitude() );
9984
mLightAzimuth->setValue( r->azimuth() );
10085
mZFactor->setValue( r->zFactor() );

src/gui/raster/qgsmultibandcolorrendererwidget.cpp

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -50,33 +50,28 @@ QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer
5050
connect( mMinMaxWidget, &QgsRasterMinMaxWidget::load,
5151
this, &QgsMultiBandColorRendererWidget::loadMinMax );
5252

53-
connect( mRedBandComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ),
53+
connect( mRedBandComboBox, &QgsRasterBandComboBox::bandChanged,
5454
this, &QgsMultiBandColorRendererWidget::onBandChanged );
55-
connect( mGreenBandComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ),
55+
connect( mGreenBandComboBox, &QgsRasterBandComboBox::bandChanged,
5656
this, &QgsMultiBandColorRendererWidget::onBandChanged );
57-
connect( mBlueBandComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ),
57+
connect( mBlueBandComboBox, &QgsRasterBandComboBox::bandChanged,
5858
this, &QgsMultiBandColorRendererWidget::onBandChanged );
5959

60+
mRedBandComboBox->setLayer( mRasterLayer );
61+
mGreenBandComboBox->setLayer( mRasterLayer );
62+
mBlueBandComboBox->setLayer( mRasterLayer );
63+
6064
//fill available bands into combo boxes
61-
mRedBandComboBox->addItem( tr( "Not set" ), -1 );
62-
mGreenBandComboBox->addItem( tr( "Not set" ), -1 );
63-
mBlueBandComboBox->addItem( tr( "Not set" ), -1 );
65+
mRedBandComboBox->insertItem( 0, tr( "Not set" ), -1 );
66+
mGreenBandComboBox->insertItem( 0, tr( "Not set" ), -1 );
67+
mBlueBandComboBox->insertItem( 0, tr( "Not set" ), -1 );
6468

6569
//contrast enhancement algorithms
6670
mContrastEnhancementAlgorithmComboBox->addItem( tr( "No enhancement" ), QgsContrastEnhancement::NoEnhancement );
6771
mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch to MinMax" ), QgsContrastEnhancement::StretchToMinimumMaximum );
6872
mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch and clip to MinMax" ), QgsContrastEnhancement::StretchAndClipToMinimumMaximum );
6973
mContrastEnhancementAlgorithmComboBox->addItem( tr( "Clip to MinMax" ), QgsContrastEnhancement::ClipToMinimumMaximum );
7074

71-
int nBands = provider->bandCount();
72-
for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1
73-
{
74-
QString bandName = displayBandName( i );
75-
mRedBandComboBox->addItem( bandName, i );
76-
mGreenBandComboBox->addItem( bandName, i );
77-
mBlueBandComboBox->addItem( bandName, i );
78-
}
79-
8075
setFromRenderer( mRasterLayer->renderer() );
8176
onBandChanged( 0 ); // reset mMinMaxWidget bands
8277

@@ -96,9 +91,9 @@ QgsRasterRenderer *QgsMultiBandColorRendererWidget::renderer()
9691
return nullptr;
9792
}
9893

99-
int redBand = mRedBandComboBox->currentData().toInt();
100-
int greenBand = mGreenBandComboBox->currentData().toInt();
101-
int blueBand = mBlueBandComboBox->currentData().toInt();
94+
int redBand = mRedBandComboBox->currentBand();
95+
int greenBand = mGreenBandComboBox->currentBand();
96+
int blueBand = mBlueBandComboBox->currentBand();
10297

10398
QgsMultiBandColorRenderer *r = new QgsMultiBandColorRenderer( provider, redBand, greenBand, blueBand );
10499
setCustomMinMaxValues( r, provider, redBand, greenBand, blueBand );
@@ -209,9 +204,9 @@ void QgsMultiBandColorRendererWidget::onBandChanged( int index )
209204
Q_UNUSED( index );
210205

211206
QList<int> myBands;
212-
myBands.append( mRedBandComboBox->currentData().toInt() );
213-
myBands.append( mGreenBandComboBox->currentData().toInt() );
214-
myBands.append( mBlueBandComboBox->currentData().toInt() );
207+
myBands.append( mRedBandComboBox->currentBand() );
208+
myBands.append( mGreenBandComboBox->currentBand() );
209+
myBands.append( mBlueBandComboBox->currentBand() );
215210
mMinMaxWidget->setBands( myBands );
216211
emit widgetChanged();
217212
}
@@ -266,17 +261,17 @@ void QgsMultiBandColorRendererWidget::loadMinMax( int bandNo, double min, double
266261

267262
QLineEdit *myMinLineEdit, *myMaxLineEdit;
268263

269-
if ( mRedBandComboBox->currentData().toInt() == bandNo )
264+
if ( mRedBandComboBox->currentBand() == bandNo )
270265
{
271266
myMinLineEdit = mRedMinLineEdit;
272267
myMaxLineEdit = mRedMaxLineEdit;
273268
}
274-
else if ( mGreenBandComboBox->currentData().toInt() == bandNo )
269+
else if ( mGreenBandComboBox->currentBand() == bandNo )
275270
{
276271
myMinLineEdit = mGreenMinLineEdit;
277272
myMaxLineEdit = mGreenMaxLineEdit;
278273
}
279-
else if ( mBlueBandComboBox->currentData().toInt() == bandNo )
274+
else if ( mBlueBandComboBox->currentBand() == bandNo )
280275
{
281276
myMinLineEdit = mBlueMinLineEdit;
282277
myMaxLineEdit = mBlueMaxLineEdit;
@@ -336,9 +331,9 @@ void QgsMultiBandColorRendererWidget::setFromRenderer( const QgsRasterRenderer *
336331
const QgsMultiBandColorRenderer *mbcr = dynamic_cast<const QgsMultiBandColorRenderer *>( r );
337332
if ( mbcr )
338333
{
339-
mRedBandComboBox->setCurrentIndex( mRedBandComboBox->findData( mbcr->redBand() ) );
340-
mGreenBandComboBox->setCurrentIndex( mGreenBandComboBox->findData( mbcr->greenBand() ) );
341-
mBlueBandComboBox->setCurrentIndex( mBlueBandComboBox->findData( mbcr->blueBand() ) );
334+
mRedBandComboBox->setBand( mbcr->redBand() );
335+
mGreenBandComboBox->setBand( mbcr->greenBand() );
336+
mBlueBandComboBox->setBand( mbcr->blueBand() );
342337

343338
mDisableMinMaxWidgetRefresh = true;
344339
setMinMaxValue( mbcr->redContrastEnhancement(), mRedMinLineEdit, mRedMaxLineEdit );
@@ -443,11 +438,11 @@ int QgsMultiBandColorRendererWidget::selectedBand( int index )
443438
switch ( index )
444439
{
445440
case 0:
446-
return mRedBandComboBox->currentIndex();
441+
return mRedBandComboBox->currentBand();
447442
case 1:
448-
return mGreenBandComboBox->currentIndex();
443+
return mGreenBandComboBox->currentBand();
449444
case 2:
450-
return mBlueBandComboBox->currentIndex();
445+
return mBlueBandComboBox->currentBand();
451446
default:
452447
break;
453448
}

src/gui/raster/qgspalettedrendererwidget.cpp

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,25 +72,19 @@ QgsPalettedRendererWidget::QgsPalettedRendererWidget( QgsRasterLayer *layer, con
7272

7373
connect( btnColorRamp, &QgsColorRampButton::colorRampChanged, this, &QgsPalettedRendererWidget::applyColorRamp );
7474

75+
mBandComboBox->setLayer( mRasterLayer );
76+
7577
if ( mRasterLayer )
7678
{
7779
QgsRasterDataProvider *provider = mRasterLayer->dataProvider();
7880
if ( !provider )
7981
{
8082
return;
8183
}
82-
83-
//fill available bands into combo box
84-
int nBands = provider->bandCount();
85-
for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1
86-
{
87-
mBandComboBox->addItem( displayBandName( i ), i );
88-
}
89-
9084
setFromRenderer( mRasterLayer->renderer() );
91-
connect( mBandComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsRasterRendererWidget::widgetChanged );
9285
}
9386

87+
connect( mBandComboBox, &QgsRasterBandComboBox::bandChanged, this, &QgsRasterRendererWidget::widgetChanged );
9488
connect( mModel, &QgsPalettedRendererModel::classesChanged, this, &QgsPalettedRendererWidget::widgetChanged );
9589
connect( mDeleteEntryButton, &QPushButton::clicked, this, &QgsPalettedRendererWidget::deleteEntry );
9690
connect( mAddEntryButton, &QPushButton::clicked, this, &QgsPalettedRendererWidget::addEntry );
@@ -102,15 +96,15 @@ QgsPalettedRendererWidget::QgsPalettedRendererWidget( QgsRasterLayer *layer, con
10296
QgsRasterDataProvider *provider = mRasterLayer->dataProvider();
10397
if ( provider )
10498
{
105-
mButtonLoadFromLayer->setEnabled( !provider->colorTable( mBandComboBox->currentData().toInt() ).isEmpty() );
99+
mButtonLoadFromLayer->setEnabled( !provider->colorTable( mBandComboBox->currentBand() ).isEmpty() );
106100
}
107101
else
108102
{
109103
mButtonLoadFromLayer->setEnabled( false );
110104
}
111105

112106
connect( QgsProject::instance(), static_cast < void ( QgsProject::* )( QgsMapLayer * ) >( &QgsProject::layerWillBeRemoved ), this, &QgsPalettedRendererWidget::layerWillBeRemoved );
113-
connect( mBandComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPalettedRendererWidget::loadFromLayer );
107+
connect( mBandComboBox, &QgsRasterBandComboBox::bandChanged, this, &QgsPalettedRendererWidget::loadFromLayer );
114108
}
115109

116110
QgsPalettedRendererWidget::~QgsPalettedRendererWidget()
@@ -125,7 +119,7 @@ QgsPalettedRendererWidget::~QgsPalettedRendererWidget()
125119
QgsRasterRenderer *QgsPalettedRendererWidget::renderer()
126120
{
127121
QgsPalettedRasterRenderer::ClassData classes = mModel->classData();
128-
int bandNumber = mBandComboBox->currentData().toInt();
122+
int bandNumber = mBandComboBox->currentBand();
129123

130124
QgsPalettedRasterRenderer *r = new QgsPalettedRasterRenderer( mRasterLayer->dataProvider(), bandNumber, classes );
131125
if ( !btnColorRamp->isNull() )
@@ -406,7 +400,7 @@ void QgsPalettedRendererWidget::classify()
406400
return;
407401
}
408402

409-
mGatherer = new QgsPalettedRendererClassGatherer( mRasterLayer, mBandComboBox->currentData().toInt(), mModel->classData(), btnColorRamp->colorRamp() );
403+
mGatherer = new QgsPalettedRendererClassGatherer( mRasterLayer, mBandComboBox->currentBand(), btnColorRamp->colorRamp() );
410404

411405
connect( mGatherer, &QgsPalettedRendererClassGatherer::progressChanged, mCalculatingProgressBar, &QProgressBar::setValue );
412406
mCalculatingProgressBar->show();
@@ -427,10 +421,10 @@ void QgsPalettedRendererWidget::loadFromLayer()
427421
QgsRasterDataProvider *provider = mRasterLayer->dataProvider();
428422
if ( provider )
429423
{
430-
QList<QgsColorRampShader::ColorRampItem> table = provider->colorTable( mBandComboBox->currentData().toInt() );
424+
QList<QgsColorRampShader::ColorRampItem> table = provider->colorTable( mBandComboBox->currentBand() );
431425
if ( !table.isEmpty() )
432426
{
433-
QgsPalettedRasterRenderer::ClassData classes = QgsPalettedRasterRenderer::colorTableToClassData( provider->colorTable( mBandComboBox->currentData().toInt() ) );
427+
QgsPalettedRasterRenderer::ClassData classes = QgsPalettedRasterRenderer::colorTableToClassData( provider->colorTable( mBandComboBox->currentBand() ) );
434428
mModel->setClassData( classes );
435429
emit widgetChanged();
436430
}
@@ -450,7 +444,7 @@ void QgsPalettedRendererWidget::gathererThreadFinished()
450444
{
451445
mGatherer->deleteLater();
452446
mGatherer = nullptr;
453-
mClassifyButton->setText( tr( "Populate Values" ) );
447+
mClassifyButton->setText( tr( "Add Unique Values" ) );
454448
mClassifyButton->setEnabled( true );
455449
mCalculatingProgressBar->hide();
456450
mCancelButton->hide();

0 commit comments

Comments
 (0)