Skip to content

Commit 2001249

Browse files
committed
Started widget for multiband color
1 parent ae2899a commit 2001249

18 files changed

+710
-31
lines changed

src/app/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ INCLUDE_DIRECTORIES(
388388
../core
389389
../core/gps ../core/gps/qextserialport
390390
../core/composer ../core/raster ../core/renderer ../core/symbology ../core/symbology-ng
391-
../gui ../gui/symbology-ng ../gui/attributetable
391+
../gui ../gui/symbology-ng ../gui/attributetable ../gui/raster
392392
../plugins
393393
../python
394394
gps

src/app/qgsrasterlayerproperties.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
#include "qgsrastertransparency.h"
4040
#include "qgsmaptoolemitpoint.h"
4141

42+
#include "qgsrasterrendererregistry.h"
43+
#include "qgsmultibandcolorrendererwidget.h"
44+
#include "qgspalettedrendererwidget.h"
45+
4246
#include <QTableWidgetItem>
4347
#include <QHeaderView>
4448

@@ -67,7 +71,7 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
6771
: QDialog( parent, fl ),
6872
// Constant that signals property not used.
6973
TRSTRING_NOT_SET( tr( "Not Set" ) ),
70-
mRasterLayer( qobject_cast<QgsRasterLayer *>( lyr ) )
74+
mRasterLayer( qobject_cast<QgsRasterLayer *>( lyr ) ), mRendererWidget( 0 )
7175
{
7276
ignoreSpinBoxEvent = false; //Short circuit signal loop between min max field and stdDev spin box
7377
mGrayMinimumMaximumEstimated = true;
@@ -329,6 +333,19 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
329333
}
330334
mMaximumOversamplingSpinBox->setValue( renderer->maxOversampling() );
331335
}
336+
337+
//insert renderer widgets into registry
338+
QgsRasterRendererRegistry::instance()->insertWidgetFunction( "paletted", QgsPalettedRendererWidget::create );
339+
QgsRasterRendererRegistry::instance()->insertWidgetFunction( "multibandcolor", QgsMultiBandColorRendererWidget::create );
340+
341+
//fill available renderers into combo box
342+
QList< QgsRasterRendererRegistryEntry > rendererEntries = QgsRasterRendererRegistry::instance()->entries();
343+
QList< QgsRasterRendererRegistryEntry >::const_iterator rendererIt = rendererEntries.constBegin();
344+
for ( ; rendererIt != rendererEntries.constEnd(); ++rendererIt )
345+
{
346+
mRenderTypeComboBox->addItem( rendererIt->visibleName, rendererIt->name );
347+
}
348+
on_mRenderTypeComboBox_currentIndexChanged( mRenderTypeComboBox->currentIndex() );
332349
} // QgsRasterLayerProperties ctor
333350

334351

@@ -1397,6 +1414,11 @@ void QgsRasterLayerProperties::apply()
13971414
pixmapLegend->setScaledContents( true );
13981415
pixmapLegend->repaint();
13991416

1417+
//set renderer from widget
1418+
QgsRasterRendererWidget* rendererWidget = dynamic_cast<QgsRasterRendererWidget*>( mRendererStackedWidget->currentWidget() );
1419+
mRasterLayer->setRenderer( rendererWidget->renderer() );
1420+
1421+
#if 0
14001422
//set the appropriate render style
14011423
if ( rbtnSingleBand->isChecked() )
14021424
{
@@ -1489,6 +1511,7 @@ void QgsRasterLayerProperties::apply()
14891511
}
14901512
}
14911513
//set render style finished
1514+
#endif //0
14921515

14931516

14941517
//resampling
@@ -1715,6 +1738,29 @@ void QgsRasterLayerProperties::on_buttonBuildPyramids_clicked()
17151738
txtbMetadata->document()->setDefaultStyleSheet( myStyle );
17161739
}
17171740

1741+
void QgsRasterLayerProperties::on_mRenderTypeComboBox_currentIndexChanged( int index )
1742+
{
1743+
delete mRendererWidget;
1744+
mRendererWidget = 0;
1745+
1746+
if ( index < 0 )
1747+
{
1748+
return;
1749+
}
1750+
1751+
QString rendererName = mRenderTypeComboBox->itemData( index ).toString();
1752+
1753+
QgsRasterRendererRegistryEntry rendererEntry;
1754+
if ( QgsRasterRendererRegistry::instance()->rendererData( rendererName, rendererEntry ) )
1755+
{
1756+
if ( rendererEntry.widgetCreateFunction )
1757+
{
1758+
mRendererWidget = ( *rendererEntry.widgetCreateFunction )( mRasterLayer );
1759+
mRendererStackedWidget->addWidget( mRendererWidget );
1760+
}
1761+
}
1762+
}
1763+
17181764
void QgsRasterLayerProperties::on_cboBlue_currentIndexChanged( const QString& theText )
17191765
{
17201766
if ( TRSTRING_NOT_SET != theText )

src/app/qgsrasterlayerproperties.h

Lines changed: 4 additions & 0 deletions
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 QgsRasterRendererWidget;
3233

3334
/**Property sheet for a raster map layer
3435
*@author Tim Sutton
@@ -99,6 +100,7 @@ class QgsRasterLayerProperties : public QDialog, private Ui::QgsRasterLayerPrope
99100
void userDefinedMinMax_textEdited( QString );
100101

101102
private slots:
103+
void on_mRenderTypeComboBox_currentIndexChanged( int index );
102104
/** This slow handles necessary interface modifications (i.e. loading min max values) */
103105
void on_cboBlue_currentIndexChanged( const QString& );
104106
/** This slow handles necessary interface modifications (i.e. loading min max values) */
@@ -186,6 +188,8 @@ class QgsRasterLayerProperties : public QDialog, private Ui::QgsRasterLayerPrope
186188
*/
187189
//bool mRasterLayerIsInternal;
188190

191+
QgsRasterRendererWidget* mRendererWidget;
192+
189193
/** \brief Clear current color map table and population with values from new list */
190194
void populateColorMapTable( const QList<QgsColorRampShader::ColorRampItem>& );
191195

src/core/raster/qgsmultibandcolorrenderer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ QgsMultiBandColorRenderer::~QgsMultiBandColorRenderer()
3535
{
3636
}
3737

38+
QgsRasterRenderer* QgsMultiBandColorRenderer::create( const QDomElement& elem )
39+
{
40+
return 0;
41+
}
42+
3843
void QgsMultiBandColorRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel )
3944
{
4045
if ( !p || !mProvider || !viewPort || !theQgsMapToPixel )

src/core/raster/qgsmultibandcolorrenderer.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsrasterrenderer.h"
2222

2323
class QgsContrastEnhancement;
24+
class QDomElement;
2425

2526
/**Renderer for multiband images with the color components*/
2627
class QgsMultiBandColorRenderer: public QgsRasterRenderer
@@ -31,8 +32,17 @@ class QgsMultiBandColorRenderer: public QgsRasterRenderer
3132
QgsContrastEnhancement* blueEnhancement = 0 );
3233
~QgsMultiBandColorRenderer();
3334

35+
static QgsRasterRenderer* create( const QDomElement& elem );
36+
3437
void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
3538

39+
int redBand() const { return mRedBand; }
40+
void setRedBand( int band ) { mRedBand = band; }
41+
int greenBand() const { return mGreenBand; }
42+
void setGreenBand( int band ) { mGreenBand = band; }
43+
int blueBand() const { return mBlueBand; }
44+
void setBlueBand( int band ) { mBlueBand = band; }
45+
3646
const QgsContrastEnhancement* redContrastEnhancement() const { return mRedContrastEnhancement; }
3747
void setRedContrastEnhancement( QgsContrastEnhancement* ce ) { mRedContrastEnhancement = ce; }
3848

src/core/raster/qgspalettedrasterrenderer.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,25 @@ QgsPalettedRasterRenderer::~QgsPalettedRasterRenderer()
3232
delete[] mColors;
3333
}
3434

35+
QgsRasterRenderer* QgsPalettedRasterRenderer::create( const QDomElement& elem )
36+
{
37+
return 0;
38+
}
39+
40+
QColor* QgsPalettedRasterRenderer::colors() const
41+
{
42+
if ( mNColors < 1 )
43+
{
44+
return 0;
45+
}
46+
QColor* colorArray = new QColor[ mNColors ];
47+
for ( int i = 0; i < mNColors; ++i )
48+
{
49+
colorArray[i] = mColors[i];
50+
}
51+
return colorArray;
52+
}
53+
3554
void QgsPalettedRasterRenderer::draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel )
3655
{
3756
if ( !p || !mProvider || !viewPort || !theQgsMapToPixel )

src/core/raster/qgspalettedrasterrenderer.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,23 @@
2121
#include "qgsrasterrenderer.h"
2222

2323
class QColor;
24+
class QDomElement;
2425

2526
class QgsPalettedRasterRenderer: public QgsRasterRenderer
2627
{
2728
public:
2829
/**Renderer owns color array*/
2930
QgsPalettedRasterRenderer( QgsRasterDataProvider* provider, int bandNumber, QColor* colorArray, int nColors );
3031
~QgsPalettedRasterRenderer();
32+
static QgsRasterRenderer* create( const QDomElement& elem );
33+
3134
void draw( QPainter* p, QgsRasterViewPort* viewPort, const QgsMapToPixel* theQgsMapToPixel );
3235

36+
/**Returns number of colors*/
37+
int nColors() const { return mNColors; }
38+
/**Returns copy of color array (caller takes ownership)*/
39+
QColor* colors() const;
40+
3341
private:
3442
int mBandNumber;
3543
/**Color array*/

src/core/raster/qgsrasterrendererregistry.cpp

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
***************************************************************************/
1717

1818
#include "qgsrasterrendererregistry.h"
19+
#include "qgsmultibandcolorrenderer.h"
20+
#include "qgspalettedrasterrenderer.h"
1921

2022
QgsRasterRendererRegistry* QgsRasterRendererRegistry::mInstance = 0;
2123

2224
QgsRasterRendererRegistry* QgsRasterRendererRegistry::instance()
2325
{
24-
if( !mInstance )
26+
if ( !mInstance )
2527
{
2628
mInstance = new QgsRasterRendererRegistry();
2729
}
@@ -30,6 +32,21 @@ QgsRasterRendererRegistry* QgsRasterRendererRegistry::instance()
3032

3133
QgsRasterRendererRegistry::QgsRasterRendererRegistry()
3234
{
35+
//add entry for palleted renderer
36+
QgsRasterRendererRegistryEntry palettedEntry;
37+
palettedEntry.name = "paletted";
38+
palettedEntry.visibleName = QObject::tr( "Paletted" );
39+
palettedEntry.rendererCreateFunction = QgsPalettedRasterRenderer::create;
40+
//widget function will be assigned later in raster properties dialog with QgsRasterRendererRegistry::insertWidgetFunction
41+
palettedEntry.widgetCreateFunction = 0;
42+
insert( palettedEntry );
43+
44+
QgsRasterRendererRegistryEntry multiBandColorEntry;
45+
multiBandColorEntry.name = "multibandcolor";
46+
multiBandColorEntry.visibleName = QObject::tr( "Multiband color" );
47+
palettedEntry.rendererCreateFunction = QgsMultiBandColorRenderer::create;
48+
multiBandColorEntry.widgetCreateFunction = 0;
49+
insert( multiBandColorEntry );
3350
}
3451

3552
QgsRasterRendererRegistry::~QgsRasterRendererRegistry()
@@ -41,15 +58,42 @@ void QgsRasterRendererRegistry::insert( QgsRasterRendererRegistryEntry entry )
4158
mEntries.insert( entry.name, entry );
4259
}
4360

61+
void QgsRasterRendererRegistry::insertWidgetFunction( const QString& rendererName, QgsRasterRendererWidgetCreateFunc func )
62+
{
63+
if ( !mEntries.contains( rendererName ) )
64+
{
65+
return;
66+
}
67+
68+
mEntries[rendererName].widgetCreateFunction = func;
69+
}
70+
4471
bool QgsRasterRendererRegistry::rendererData( const QString& rendererName, QgsRasterRendererRegistryEntry& data ) const
4572
{
4673
QHash< QString, QgsRasterRendererRegistryEntry >::const_iterator it = mEntries.find( rendererName );
47-
if( it == mEntries.constEnd() )
74+
if ( it == mEntries.constEnd() )
4875
{
4976
return false;
5077
}
5178
data = it.value();
5279
return true;
5380
}
5481

82+
QStringList QgsRasterRendererRegistry::renderersList() const
83+
{
84+
return QStringList( mEntries.keys() );
85+
}
86+
87+
QList< QgsRasterRendererRegistryEntry > QgsRasterRendererRegistry::entries() const
88+
{
89+
QList< QgsRasterRendererRegistryEntry > result;
90+
91+
QHash< QString, QgsRasterRendererRegistryEntry >::const_iterator it = mEntries.constBegin();
92+
for ( ; it != mEntries.constEnd(); ++it )
93+
{
94+
result.push_back( it.value() );
95+
}
96+
return result;
97+
}
98+
5599

src/core/raster/qgsrasterrendererregistry.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,21 @@
2121
#include <QHash>
2222
#include <QString>
2323

24+
class QDomElement;
2425
class QgsRasterDataProvider;
26+
class QgsRasterLayer;
2527
class QgsRasterRenderer;
28+
class QgsRasterRendererWidget;
2629

27-
typedef QgsRasterRenderer*(*QgsRasterRendererCreateFunc)(const QDomElement&);
30+
typedef QgsRasterRenderer*( *QgsRasterRendererCreateFunc )( const QDomElement& );
31+
typedef QgsRasterRendererWidget*( *QgsRasterRendererWidgetCreateFunc )( QgsRasterLayer* );
2832

2933
struct QgsRasterRendererRegistryEntry
3034
{
3135
QString name;
36+
QString visibleName; //visible (and translatable) name
3237
QgsRasterRendererCreateFunc rendererCreateFunction; //pointer to create function
33-
//pointer to create function for renderer widget
38+
QgsRasterRendererWidgetCreateFunc widgetCreateFunction; //pointer to create function for renderer widget
3439
};
3540

3641
class QgsRasterRendererRegistry
@@ -40,7 +45,10 @@ class QgsRasterRendererRegistry
4045
~QgsRasterRendererRegistry();
4146

4247
void insert( QgsRasterRendererRegistryEntry entry );
48+
void insertWidgetFunction( const QString& rendererName, QgsRasterRendererWidgetCreateFunc func );
4349
bool rendererData( const QString& rendererName, QgsRasterRendererRegistryEntry& data ) const;
50+
QStringList renderersList() const;
51+
QList< QgsRasterRendererRegistryEntry > entries() const;
4452

4553
protected:
4654
QgsRasterRendererRegistry();

src/gui/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11

22
SET(QGIS_GUI_SRCS
33

4+
raster/qgsmultibandcolorrendererwidget.cpp
5+
raster/qgspalettedrendererwidget.cpp
6+
47
symbology-ng/qgsbrushstylecombobox.cpp
58
symbology-ng/qgscolorrampcombobox.cpp
69
symbology-ng/qgsdashspacedialog.cpp
@@ -80,6 +83,9 @@ qgsquerybuilder.cpp
8083

8184
SET(QGIS_GUI_MOC_HDRS
8285

86+
raster/qgspalettedrendererwidget.h
87+
raster/qgsmultibandcolorrendererwidget.h
88+
8389
symbology-ng/qgsdashspacedialog.h
8490
symbology-ng/qgssymbollayerv2widget.h
8591
symbology-ng/qgssymbolv2propertiesdialog.h
@@ -212,6 +218,7 @@ ELSE (WITH_INTERNAL_SPATIALITE)
212218
ENDIF (WITH_INTERNAL_SPATIALITE)
213219

214220
INCLUDE_DIRECTORIES(${GEOS_INCLUDE_DIR})
221+
INCLUDE_DIRECTORIES(${GDAL_INCLUDE_DIR})
215222

216223
IF (WIN32)
217224
IF (MSVC)

0 commit comments

Comments
 (0)