Skip to content

Commit 24bcec4

Browse files
committed
[FEATURE] labels support in QgsPalettedRasterRenderer, fixes #8886
1 parent 47b055f commit 24bcec4

File tree

6 files changed

+72
-10
lines changed

6 files changed

+72
-10
lines changed

python/core/raster/qgspalettedrasterrenderer.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class QgsPalettedRasterRenderer : QgsRasterRenderer
55
%End
66
public:
77
/**Renderer owns color array*/
8-
QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QColor* colorArray /Array,Transfer/, int nColors /ArraySize/ );
8+
QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QColor* colorArray /Array,Transfer/, int nColors /ArraySize/, const QVector<QString> labels = QVector<QString>() );
99
~QgsPalettedRasterRenderer();
1010
QgsRasterInterface * clone() const /Factory/;
1111
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input ) /Factory/;

src/core/qgsprojectfiletransform.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,11 @@ void QgsProjectFileTransform::convertRasterProperties( QDomDocument& doc, QDomNo
774774
green = colorRampEntryElem.attribute( "green" ).toInt();
775775
blue = colorRampEntryElem.attribute( "blue" ).toInt();
776776
newPaletteElem.setAttribute( "color", QColor( red, green, blue ).name() );
777+
QString label = colorRampEntryElem.attribute( "label" );
778+
if ( !label.isEmpty() )
779+
{
780+
newPaletteElem.setAttribute( "label", label );
781+
}
777782
newColorPaletteElem.appendChild( newPaletteElem );
778783
}
779784
rasterRendererElem.appendChild( newColorPaletteElem );

src/core/raster/qgspalettedrasterrenderer.cpp

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@
2222
#include <QDomDocument>
2323
#include <QDomElement>
2424
#include <QImage>
25+
#include <QVector>
2526

2627
QgsPalettedRasterRenderer::QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber,
27-
QColor* colorArray, int nColors ):
28-
QgsRasterRenderer( input, "paletted" ), mBand( bandNumber ), mNColors( nColors )
28+
QColor* colorArray, int nColors, const QVector<QString> labels ):
29+
QgsRasterRenderer( input, "paletted" ), mBand( bandNumber ), mNColors( nColors ), mLabels( labels )
2930
{
3031
mColors = new QRgb[nColors];
3132
for ( int i = 0; i < nColors; ++i )
@@ -35,8 +36,8 @@ QgsPalettedRasterRenderer::QgsPalettedRasterRenderer( QgsRasterInterface* input,
3536
delete[] colorArray;
3637
}
3738

38-
QgsPalettedRasterRenderer::QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QRgb* colorArray, int nColors ):
39-
QgsRasterRenderer( input, "paletted" ), mBand( bandNumber ), mColors( colorArray ), mNColors( nColors )
39+
QgsPalettedRasterRenderer::QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QRgb* colorArray, int nColors, const QVector<QString> labels ):
40+
QgsRasterRenderer( input, "paletted" ), mBand( bandNumber ), mColors( colorArray ), mNColors( nColors ), mLabels( labels )
4041
{
4142
}
4243

@@ -51,6 +52,7 @@ QgsRasterInterface * QgsPalettedRasterRenderer::clone() const
5152
renderer->setOpacity( mOpacity );
5253
renderer->setAlphaBand( mAlphaBand );
5354
renderer->setRasterTransparency( mRasterTransparency );
55+
renderer->mLabels = mLabels;
5456
return renderer;
5557
}
5658

@@ -64,6 +66,7 @@ QgsRasterRenderer* QgsPalettedRasterRenderer::create( const QDomElement& elem, Q
6466
int bandNumber = elem.attribute( "band", "-1" ).toInt();
6567
int nColors = 0;
6668
QRgb* colors = 0;
69+
QVector<QString> labels;
6770

6871
QDomElement paletteElem = elem.firstChildElement( "colorPalette" );
6972
if ( !paletteElem.isNull() )
@@ -94,14 +97,20 @@ QgsRasterRenderer* QgsPalettedRasterRenderer::create( const QDomElement& elem, Q
9497
if ( value >= 0 && value < nColors )
9598
{
9699
colors[value] = QColor( entryElem.attribute( "color", "#000000" ) ).rgba();
100+
QString label = entryElem.attribute( "label" );
101+
if ( !label.isEmpty() )
102+
{
103+
if ( value >= labels.size() ) labels.resize( value + 1 );
104+
labels[value] = label;
105+
}
97106
}
98107
else
99108
{
100109
QgsDebugMsg( QString( "value %1 out of range" ).arg( value ) );
101110
}
102111
}
103112
}
104-
QgsRasterRenderer* r = new QgsPalettedRasterRenderer( input, bandNumber, colors, nColors );
113+
QgsPalettedRasterRenderer* r = new QgsPalettedRasterRenderer( input, bandNumber, colors, nColors, labels );
105114
r->readXML( elem );
106115
return r;
107116
}
@@ -134,6 +143,15 @@ QRgb* QgsPalettedRasterRenderer::rgbArray() const
134143
return rgbValues;
135144
}
136145

146+
void QgsPalettedRasterRenderer::setLabel( int idx, QString label )
147+
{
148+
if ( idx >= mLabels.size() )
149+
{
150+
mLabels.resize( idx + 1 );
151+
}
152+
mLabels[idx] = label;
153+
}
154+
137155
QgsRasterBlock * QgsPalettedRasterRenderer::block( int bandNo, QgsRectangle const & extent, int width, int height )
138156
{
139157
QgsRasterBlock *outputBlock = new QgsRasterBlock();
@@ -240,6 +258,10 @@ void QgsPalettedRasterRenderer::writeXML( QDomDocument& doc, QDomElement& parent
240258
QDomElement colorElem = doc.createElement( "paletteEntry" );
241259
colorElem.setAttribute( "value", i );
242260
colorElem.setAttribute( "color", QColor( mColors[i] ).name() );
261+
if ( !label( i ).isEmpty() )
262+
{
263+
colorElem.setAttribute( "label", label( i ) );
264+
}
243265
colorPaletteElem.appendChild( colorElem );
244266
}
245267
rasterRendererElem.appendChild( colorPaletteElem );
@@ -251,7 +273,8 @@ void QgsPalettedRasterRenderer::legendSymbologyItems( QList< QPair< QString, QCo
251273
{
252274
for ( int i = 0; i < mNColors; ++i )
253275
{
254-
symbolItems.push_back( qMakePair( QString::number( i ), QColor( mColors[i] ) ) );
276+
QString lab = label( i ).isEmpty() ? QString::number( i ) : label( i );
277+
symbolItems.push_back( qMakePair( lab, QColor( mColors[i] ) ) );
255278
}
256279
}
257280

src/core/raster/qgspalettedrasterrenderer.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#ifndef QGSPALETTEDRASTERRENDERER_H
1919
#define QGSPALETTEDRASTERRENDERER_H
2020

21+
#include <QVector>
22+
2123
#include "qgsrasterrenderer.h"
2224

2325
class QColor;
@@ -30,8 +32,8 @@ class CORE_EXPORT QgsPalettedRasterRenderer: public QgsRasterRenderer
3032
{
3133
public:
3234
/**Renderer owns color array*/
33-
QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QColor* colorArray, int nColors );
34-
QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QRgb* colorArray, int nColors );
35+
QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QColor* colorArray, int nColors, const QVector<QString> labels = QVector<QString>() );
36+
QgsPalettedRasterRenderer( QgsRasterInterface* input, int bandNumber, QRgb* colorArray, int nColors, const QVector<QString> labels = QVector<QString>() );
3537
~QgsPalettedRasterRenderer();
3638
QgsRasterInterface * clone() const;
3739
static QgsRasterRenderer* create( const QDomElement& elem, QgsRasterInterface* input );
@@ -48,6 +50,14 @@ class CORE_EXPORT QgsPalettedRasterRenderer: public QgsRasterRenderer
4850
*/
4951
QRgb* rgbArray() const;
5052

53+
/** Return optional category label
54+
* @note added in 2.1 */
55+
QString label( int idx ) const { return mLabels.value( idx ); }
56+
57+
/** Set category label
58+
* @note added in 2.1 */
59+
void setLabel( int idx, QString label );
60+
5161
void writeXML( QDomDocument& doc, QDomElement& parentElem ) const;
5262

5363
void legendSymbologyItems( QList< QPair< QString, QColor > >& symbolItems ) const;
@@ -60,6 +70,8 @@ class CORE_EXPORT QgsPalettedRasterRenderer: public QgsRasterRenderer
6070
QRgb* mColors;
6171
/**Number of colors*/
6272
int mNColors;
73+
/** Optional category labels, size of vector may be < mNColors */
74+
QVector<QString> mLabels;
6375
};
6476

6577
#endif // QGSPALETTEDRASTERRENDERER_H

src/gui/raster/qgspalettedrendererwidget.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,24 +52,36 @@ QgsRasterRenderer* QgsPalettedRendererWidget::renderer()
5252
{
5353
int nColors = mTreeWidget->topLevelItemCount();
5454
QColor* colorArray = new QColor[nColors];
55+
QVector<QString> labels;
5556
for ( int i = 0; i < nColors; ++i )
5657
{
5758
colorArray[i] = mTreeWidget->topLevelItem( i )->background( 1 ).color();
59+
QString label = mTreeWidget->topLevelItem( i )->text( 2 );
60+
if ( !label.isEmpty() )
61+
{
62+
if ( i >= labels.size() ) labels.resize( i + 1 );
63+
labels[i] = label;
64+
}
5865
}
5966
int bandNumber = mBandComboBox->itemData( mBandComboBox->currentIndex() ).toInt();
60-
return new QgsPalettedRasterRenderer( mRasterLayer->dataProvider(), bandNumber, colorArray, nColors );
67+
return new QgsPalettedRasterRenderer( mRasterLayer->dataProvider(), bandNumber, colorArray, nColors, labels );
6168
}
6269

6370
void QgsPalettedRendererWidget::on_mTreeWidget_itemDoubleClicked( QTreeWidgetItem * item, int column )
6471
{
6572
if ( column == 1 && item ) //change item color
6673
{
74+
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
6775
QColor c = QColorDialog::getColor( item->background( column ).color() );
6876
if ( c.isValid() )
6977
{
7078
item->setBackground( column, QBrush( c ) );
7179
}
7280
}
81+
else if ( column == 2 && item )
82+
{
83+
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable );
84+
}
7385
}
7486

7587
void QgsPalettedRendererWidget::setFromRenderer( const QgsRasterRenderer* r )
@@ -85,6 +97,7 @@ void QgsPalettedRendererWidget::setFromRenderer( const QgsRasterRenderer* r )
8597
QTreeWidgetItem* item = new QTreeWidgetItem( mTreeWidget );
8698
item->setText( 0, QString::number( i ) );
8799
item->setBackground( 1, QBrush( colors[i] ) );
100+
item->setText( 2, pr->label( i ) );
88101
}
89102
delete[] colors;
90103
}
@@ -102,6 +115,7 @@ void QgsPalettedRendererWidget::setFromRenderer( const QgsRasterRenderer* r )
102115
QTreeWidgetItem* item = new QTreeWidgetItem( mTreeWidget );
103116
item->setText( 0, QString::number( index ) );
104117
item->setBackground( 1, QBrush( itemIt->color ) );
118+
item->setText( 2, itemIt->label );
105119
++index;
106120
}
107121
}

src/ui/qgspalettedrendererwidgetbase.ui

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242
<height>280</height>
4343
</size>
4444
</property>
45+
<property name="columnCount">
46+
<number>3</number>
47+
</property>
4548
<column>
4649
<property name="text">
4750
<string>Value</string>
@@ -52,6 +55,11 @@
5255
<string>Color</string>
5356
</property>
5457
</column>
58+
<column>
59+
<property name="text">
60+
<string>Label</string>
61+
</property>
62+
</column>
5563
</widget>
5664
</item>
5765
</layout>

0 commit comments

Comments
 (0)