pseudocolor renderer GUI min/max support

This commit is contained in:
Radim Blazek 2012-10-05 22:55:40 +02:00
parent b331d45e5c
commit d9c5a68d80
14 changed files with 1019 additions and 503 deletions

View File

@ -20,5 +20,5 @@ class QgsSingleBandGrayRendererWidget: QgsRasterRendererWidget
int selectedBand( int index = 0 );
public slots:
void loadMinMax( int theBandNo, double theMin, double theMax );
void loadMinMax( int theBandNo, double theMin, double theMax, int theOrigin );
};

View File

@ -26,11 +26,14 @@
#include "qgsbilinearrasterresampler.h"
#include "qgscubicrasterresampler.h"
#include <QCoreApplication>
#include <QDomDocument>
#include <QDomElement>
#include <QImage>
#include <QPainter>
#define tr( sourceText ) QCoreApplication::translate ( "QgsRasterRenderer", sourceText )
QgsRasterRenderer::QgsRasterRenderer( QgsRasterInterface* input, const QString& type )
: QgsRasterInterface( input )
, mType( type ), mOpacity( 1.0 ), mRasterTransparency( 0 )
@ -140,3 +143,146 @@ void QgsRasterRenderer::readXML( const QDomElement& rendererElem )
mRasterTransparency->readXML( rasterTransparencyElem );
}
}
QString QgsRasterRenderer::minMaxOriginName( int theOrigin )
{
if ( theOrigin == MinMaxUnknown )
{
return "Unknown";
}
else if ( theOrigin == MinMaxUser )
{
return "User";
}
QString name;
if ( theOrigin & MinMaxMinMax )
{
name += "MinMax";
}
else if ( theOrigin & MinMaxCumulativeCut )
{
name += "CumulativeCut";
}
else if ( theOrigin & MinMaxStdDev )
{
name += "StdDev";
}
if ( theOrigin & MinMaxFullExtent )
{
name += "FullExtent";
}
else if ( theOrigin & MinMaxSubExtent )
{
name += "SubExtent";
}
if ( theOrigin & MinMaxEstimated )
{
name += "Estimated";
}
else if ( theOrigin & MinMaxExact )
{
name += "Exact";
}
return name;
}
QString QgsRasterRenderer::minMaxOriginLabel( int theOrigin )
{
if ( theOrigin == MinMaxUnknown )
{
return tr( "Unknown" );
}
else if ( theOrigin == MinMaxUser )
{
return tr( "User defined" );
}
QString name;
if ( theOrigin & MinMaxEstimated )
{
name += tr( "Estimated" );
}
else if ( theOrigin & MinMaxExact )
{
name += tr( "Exact" );
}
name += " ";
if ( theOrigin & MinMaxMinMax )
{
name += tr( "min / max" );
}
else if ( theOrigin & MinMaxCumulativeCut )
{
name += "cumulative cut";
}
else if ( theOrigin & MinMaxStdDev )
{
name += "standard deviation";
}
name += " " + tr( " of " ) + " ";
if ( theOrigin & MinMaxFullExtent )
{
name += "full extent";
}
else if ( theOrigin & MinMaxSubExtent )
{
name += "sub extent";
}
name += ".";
return name;
}
int QgsRasterRenderer::minMaxOriginFromName( QString theName )
{
if ( theName.contains( "Unknown" ) )
{
return MinMaxUnknown;
}
else if ( theName.contains( "User" ) )
{
return MinMaxUser;
}
int origin = 0;
if ( theName.contains( "MinMax" ) )
{
origin |= MinMaxMinMax;
}
else if ( theName.contains( "CumulativeCut" ) )
{
origin |= MinMaxCumulativeCut;
}
else if ( theName.contains( "StdDev" ) )
{
origin |= MinMaxStdDev;
}
if ( theName.contains( "FullExtent" ) )
{
origin |= MinMaxFullExtent;
}
else if ( theName.contains( "SubExtent" ) )
{
origin |= MinMaxSubExtent;
}
if ( theName.contains( "Estimated" ) )
{
origin |= MinMaxEstimated;
}
else if ( theName.contains( "Exact" ) )
{
origin |= MinMaxExact;
}
return origin;
}

View File

@ -39,6 +39,23 @@ class QDomElement;
class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
{
public:
// Origin of min / max values
enum MinMaxOrigin
{
MinMaxUnknown = 0,
MinMaxUser = 1, // entered by user
// method
MinMaxMinMax = 1 << 1,
MinMaxCumulativeCut = 1 << 2,
MinMaxStdDev = 1 << 3,
// Extent
MinMaxFullExtent = 1 << 4,
MinMaxSubExtent = 1 << 5,
// Precision
MinMaxEstimated = 1 << 6,
MinMaxExact = 1 << 7
};
QgsRasterRenderer( QgsRasterInterface* input = 0, const QString& type = "" );
virtual ~QgsRasterRenderer();
@ -82,6 +99,10 @@ class CORE_EXPORT QgsRasterRenderer : public QgsRasterInterface
/**Returns a list of band numbers used by the renderer*/
virtual QList<int> usesBands() const { return QList<int>(); }
static QString minMaxOriginName( int theOrigin );
static QString minMaxOriginLabel( int theOrigin );
static int minMaxOriginFromName( QString theName );
protected:
/**Write upper class info into rasterrenderer element (called by writeXML method of subclasses)*/

View File

@ -24,7 +24,12 @@
#include <QImage>
QgsSingleBandPseudoColorRenderer::QgsSingleBandPseudoColorRenderer( QgsRasterInterface* input, int band, QgsRasterShader* shader ):
QgsRasterRenderer( input, "singlebandpseudocolor" ), mShader( shader ), mBand( band )
QgsRasterRenderer( input, "singlebandpseudocolor" )
, mShader( shader )
, mBand( band )
, mClassificationMin( std::numeric_limits<double>::quiet_NaN() )
, mClassificationMax( std::numeric_limits<double>::quiet_NaN() )
, mClassificationMinMaxOrigin( QgsRasterRenderer::MinMaxUnknown )
{
}
@ -85,8 +90,16 @@ QgsRasterRenderer* QgsSingleBandPseudoColorRenderer::create( const QDomElement&
shader = new QgsRasterShader();
shader->readXML( rasterShaderElem );
}
QgsRasterRenderer* r = new QgsSingleBandPseudoColorRenderer( input, band, shader );
//QgsRasterRenderer* r = new QgsSingleBandPseudoColorRenderer( input, band, shader );
QgsSingleBandPseudoColorRenderer* r = new QgsSingleBandPseudoColorRenderer( input, band, shader );
r->readXML( elem );
// TODO: add _readXML in superclass?
r->setClassificationMin( elem.attribute( "classificationMin", "NaN" ).toDouble() );
r->setClassificationMax( elem.attribute( "classificationMax", "NaN" ).toDouble() );
r->setClassificationMinMaxOrigin( QgsRasterRenderer::minMaxOriginFromName( elem.attribute( "classificationMinMaxOrigin", "Unknown" ) ) );
return r;
}
@ -210,6 +223,10 @@ void QgsSingleBandPseudoColorRenderer::writeXML( QDomDocument& doc, QDomElement&
{
mShader->writeXML( doc, rasterRendererElem ); //todo: include color ramp items directly in this renderer
}
rasterRendererElem.setAttribute( "classificationMin", QString::number( mClassificationMin ) );
rasterRendererElem.setAttribute( "classificationMax", QString::number( mClassificationMax ) );
rasterRendererElem.setAttribute( "classificationMinMaxOrigin", QgsRasterRenderer::minMaxOriginName( mClassificationMinMaxOrigin ) );
parentElem.appendChild( rasterRendererElem );
}

View File

@ -49,9 +49,23 @@ class CORE_EXPORT QgsSingleBandPseudoColorRenderer: public QgsRasterRenderer
QList<int> usesBands() const;
double classificationMin() const { return mClassificationMin; }
double classificationMax() const { return mClassificationMax; }
void setClassificationMin( double min ) { mClassificationMin = min; }
void setClassificationMax( double max ) { mClassificationMax = max; }
int classificationMinMaxOrigin() const { return mClassificationMinMaxOrigin; }
void setClassificationMinMaxOrigin( int origin ) { mClassificationMinMaxOrigin = origin; }
private:
QgsRasterShader* mShader;
int mBand;
// Minimum and maximum values used for automatic classification, these
// values are not used by renderer in rendering process
double mClassificationMin;
double mClassificationMax;
int mClassificationMinMaxOrigin;
};
#endif // QGSSINGLEBANDPSEUDOCOLORRENDERER_H

View File

@ -44,6 +44,7 @@ void QgsRasterMinMaxWidget::on_mLoadPushButton_clicked()
foreach ( int myBand, mBands )
{
int origin = QgsRasterRenderer::MinMaxUnknown;
QgsDebugMsg( QString( "myBand = %1" ).arg( myBand ) );
if ( myBand < 1 || myBand > mLayer->dataProvider()->bandCount() )
{
@ -56,6 +57,11 @@ void QgsRasterMinMaxWidget::on_mLoadPushButton_clicked()
if ( mCurrentExtentRadioButton->isChecked() )
{
myExtent = mExtent; // current
origin |= QgsRasterRenderer::MinMaxSubExtent;
}
else
{
origin |= QgsRasterRenderer::MinMaxFullExtent;
}
QgsDebugMsg( QString( "myExtent.isEmpty() = %1" ).arg( myExtent.isEmpty() ) );
@ -63,6 +69,11 @@ void QgsRasterMinMaxWidget::on_mLoadPushButton_clicked()
if ( mEstimateRadioButton->isChecked() )
{
mySampleSize = 250000;
origin |= QgsRasterRenderer::MinMaxEstimated;
}
else
{
origin |= QgsRasterRenderer::MinMaxExact;
}
if ( mCumulativeCutRadioButton->isChecked() )
@ -70,6 +81,7 @@ void QgsRasterMinMaxWidget::on_mLoadPushButton_clicked()
double myLower = mCumulativeCutLowerDoubleSpinBox->value() / 100.0;
double myUpper = mCumulativeCutUpperDoubleSpinBox->value() / 100.0;
mLayer->dataProvider()->cumulativeCut( myBand, myLower, myUpper, myMin, myMax, myExtent, mySampleSize );
origin |= QgsRasterRenderer::MinMaxCumulativeCut;
}
else if ( mMinMaxRadioButton->isChecked() )
{
@ -77,6 +89,7 @@ void QgsRasterMinMaxWidget::on_mLoadPushButton_clicked()
QgsRasterBandStats myRasterBandStats = mLayer->dataProvider()->bandStatistics( myBand, QgsRasterBandStats::Min | QgsRasterBandStats::Max, myExtent, mySampleSize );
myMin = myRasterBandStats.minimumValue;
myMax = myRasterBandStats.maximumValue;
origin |= QgsRasterRenderer::MinMaxMinMax;
}
else if ( mStdDevRadioButton->isChecked() )
{
@ -84,9 +97,9 @@ void QgsRasterMinMaxWidget::on_mLoadPushButton_clicked()
double myStdDev = mStdDevSpinBox->value();
myMin = myRasterBandStats.mean - ( myStdDev * myRasterBandStats.stdDev );
myMax = myRasterBandStats.mean + ( myStdDev * myRasterBandStats.stdDev );
origin |= QgsRasterRenderer::MinMaxStdDev;
}
emit load( myBand, myMin, myMax );
emit load( myBand, myMin, myMax, origin );
}
}

View File

@ -34,7 +34,7 @@ class GUI_EXPORT QgsRasterMinMaxWidget: public QWidget, private Ui::QgsRasterMin
void setBands( const QList<int> & theBands ) { mBands = theBands; }
signals:
void load( int theBandNo, double theMin, double theMax );
void load( int theBandNo, double theMin, double theMax, int origin );
private slots:
void on_mLoadPushButton_clicked();

View File

@ -87,8 +87,9 @@ QgsRasterRenderer* QgsSingleBandGrayRendererWidget::renderer()
return renderer;
}
void QgsSingleBandGrayRendererWidget::loadMinMax( int theBandNo, double theMin, double theMax )
void QgsSingleBandGrayRendererWidget::loadMinMax( int theBandNo, double theMin, double theMax, int theOrigin )
{
Q_UNUSED( theOrigin );
QgsDebugMsg( QString( "theBandNo = %1 theMin = %2 theMax = %3" ).arg( theBandNo ).arg( theMin ).arg( theMax ) );
if ( qIsNaN( theMin ) )

View File

@ -42,7 +42,7 @@ class GUI_EXPORT QgsSingleBandGrayRendererWidget: public QgsRasterRendererWidget
int selectedBand( int index = 0 ) { Q_UNUSED( index ); return mGrayBandComboBox->currentIndex() + 1; }
public slots:
void loadMinMax( int theBandNo, double theMin, double theMax );
void loadMinMax( int theBandNo, double theMin, double theMax, int theOrigin );
private slots:
void on_mGrayBandComboBox_currentIndexChanged( int index );

View File

@ -34,6 +34,8 @@ QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget(
{
setupUi( this );
mColormapTreeWidget->setColumnWidth( 1, 50 );
mColorRampComboBox->populate( QgsStyleV2::defaultStyle() );
if ( !mRasterLayer )
@ -47,6 +49,20 @@ QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget(
return;
}
// Must be before adding items to mBandComboBox (signal)
mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) );
mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) );
mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this );
mMinMaxWidget->setExtent( extent );
QHBoxLayout *layout = new QHBoxLayout();
layout->setContentsMargins( 0, 0, 0, 0 );
mMinMaxContainerWidget->setLayout( layout );
layout->addWidget( mMinMaxWidget );
connect( mMinMaxWidget, SIGNAL( load( int, double, double, int ) ),
this, SLOT( loadMinMax( int, double, double, int ) ) );
//fill available bands into combo box
int nBands = provider->bandCount();
for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1
@ -61,6 +77,8 @@ QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget(
mClassificationModeComboBox->addItem( tr( "Equal interval" ) );
//quantile would be nice as well
mNumberOfEntriesSpinBox->setValue( 5 ); // some default
setFromRenderer( layer->renderer() );
}
@ -109,7 +127,12 @@ QgsRasterRenderer* QgsSingleBandPseudoColorRendererWidget::renderer()
rasterShader->setRasterShaderFunction( colorRampShader );
int bandNumber = mBandComboBox->itemData( mBandComboBox->currentIndex() ).toInt();
return new QgsSingleBandPseudoColorRenderer( mRasterLayer->dataProvider(), bandNumber, rasterShader );
QgsSingleBandPseudoColorRenderer *renderer = new QgsSingleBandPseudoColorRenderer( mRasterLayer->dataProvider(), bandNumber, rasterShader );
renderer->setClassificationMin( lineEditValue( mMinLineEdit ) );
renderer->setClassificationMax( lineEditValue( mMaxLineEdit ) );
renderer->setClassificationMinMaxOrigin( mMinMaxOrigin );
return renderer;
}
void QgsSingleBandPseudoColorRendererWidget::on_mAddEntryButton_clicked()
@ -190,27 +213,32 @@ void QgsSingleBandPseudoColorRendererWidget::on_mClassifyButton_clicked()
return;
}
int bandNr = mBandComboBox->itemData( bandComboIndex ).toInt();
QgsRasterBandStats myRasterBandStats = mRasterLayer->dataProvider()->bandStatistics( bandNr );
//int bandNr = mBandComboBox->itemData( bandComboIndex ).toInt();
//QgsRasterBandStats myRasterBandStats = mRasterLayer->dataProvider()->bandStatistics( bandNr );
int numberOfEntries = mNumberOfEntriesSpinBox->value();
QList<double> entryValues;
QList<QColor> entryColors;
double min = lineEditValue( mMinLineEdit );
double max = lineEditValue( mMaxLineEdit );
if ( mClassificationModeComboBox->currentText() == tr( "Equal interval" ) )
{
double currentValue = myRasterBandStats.minimumValue;
//double currentValue = myRasterBandStats.minimumValue;
double currentValue = min;
double intervalDiff;
if ( numberOfEntries > 1 )
{
//because the highest value is also an entry, there are (numberOfEntries - 1)
//intervals
intervalDiff = ( myRasterBandStats.maximumValue - myRasterBandStats.minimumValue ) /
( numberOfEntries - 1 );
//intervalDiff = ( myRasterBandStats.maximumValue - myRasterBandStats.minimumValue ) /
intervalDiff = ( max - min ) / ( numberOfEntries - 1 );
}
else
{
intervalDiff = myRasterBandStats.maximumValue - myRasterBandStats.minimumValue;
//intervalDiff = myRasterBandStats.maximumValue - myRasterBandStats.minimumValue;
intervalDiff = max - min;
}
for ( int i = 0; i < numberOfEntries; ++i )
@ -515,5 +543,78 @@ void QgsSingleBandPseudoColorRendererWidget::setFromRenderer( const QgsRasterRen
}
}
}
setLineEditValue( mMinLineEdit, pr->classificationMin() );
setLineEditValue( mMaxLineEdit, pr->classificationMax() );
mMinMaxOrigin = pr->classificationMinMaxOrigin();
showMinMaxOrigin();
}
}
void QgsSingleBandPseudoColorRendererWidget::on_mBandComboBox_currentIndexChanged( int index )
{
QList<int> myBands;
myBands.append( mBandComboBox->itemData( index ).toInt() );
mMinMaxWidget->setBands( myBands );
}
void QgsSingleBandPseudoColorRendererWidget::loadMinMax( int theBandNo, double theMin, double theMax, int theOrigin )
{
QgsDebugMsg( QString( "theBandNo = %1 theMin = %2 theMax = %3" ).arg( theBandNo ).arg( theMin ).arg( theMax ) );
if ( qIsNaN( theMin ) )
{
mMinLineEdit->clear();
}
else
{
mMinLineEdit->setText( QString::number( theMin ) );
}
if ( qIsNaN( theMax ) )
{
mMaxLineEdit->clear();
}
else
{
mMaxLineEdit->setText( QString::number( theMax ) );
}
mMinMaxOrigin = theOrigin;
showMinMaxOrigin();
}
void QgsSingleBandPseudoColorRendererWidget::showMinMaxOrigin()
{
mMinMaxOriginLabel->setText( QgsRasterRenderer::minMaxOriginLabel( mMinMaxOrigin ) );
}
void QgsSingleBandPseudoColorRendererWidget::setLineEditValue( QLineEdit * theLineEdit, double theValue )
{
QString s;
if ( !qIsNaN( theValue ) )
{
s = QString::number( theValue );
}
theLineEdit->setText( s );
}
double QgsSingleBandPseudoColorRendererWidget::lineEditValue( const QLineEdit * theLineEdit ) const
{
if ( theLineEdit->text().isEmpty() )
{
return std::numeric_limits<double>::quiet_NaN();
}
return theLineEdit->text().toDouble();
}
void QgsSingleBandPseudoColorRendererWidget::resetClassifyButton()
{
mClassifyButton->setEnabled( true );
double min = lineEditValue( mMinLineEdit );
double max = lineEditValue( mMaxLineEdit );
if ( qIsNaN( min ) || qIsNaN( max ) || min >= max )
{
mClassifyButton->setEnabled( false );
}
}

View File

@ -18,6 +18,7 @@
#ifndef QGSSINGLEBANDCOLORRENDERERWIDGET_H
#define QGSSINGLEBANDCOLORRENDERERWIDGET_H
#include "qgsrasterminmaxwidget.h"
#include "qgsrasterrendererwidget.h"
#include "qgscolorrampshader.h"
#include "ui_qgssinglebandpseudocolorrendererwidgetbase.h"
@ -38,6 +39,9 @@ class GUI_EXPORT QgsSingleBandPseudoColorRendererWidget: public QgsRasterRendere
private:
void populateColormapTreeWidget( const QList<QgsColorRampShader::ColorRampItem>& colorRampItems );
public slots:
void loadMinMax( int theBandNo, double theMin, double theMax, int theOrigin );
private slots:
void on_mAddEntryButton_clicked();
void on_mDeleteEntryButton_clicked();
@ -47,6 +51,19 @@ class GUI_EXPORT QgsSingleBandPseudoColorRendererWidget: public QgsRasterRendere
void on_mLoadFromFileButton_clicked();
void on_mExportToFileButton_clicked();
void on_mColormapTreeWidget_itemDoubleClicked( QTreeWidgetItem* item, int column );
void on_mBandComboBox_currentIndexChanged( int index );
void on_mMinLineEdit_textChanged( const QString & text ) { Q_UNUSED( text ); resetClassifyButton(); }
void on_mMaxLineEdit_textChanged( const QString & text ) { Q_UNUSED( text ); resetClassifyButton(); }
void on_mMinLineEdit_textEdited( const QString & text ) { Q_UNUSED( text ); mMinMaxOrigin = QgsRasterRenderer::MinMaxUser; showMinMaxOrigin(); }
void on_mMaxLineEdit_textEdited( const QString & text ) { Q_UNUSED( text ); mMinMaxOrigin = QgsRasterRenderer::MinMaxUser; showMinMaxOrigin(); }
private:
void setLineEditValue( QLineEdit *theLineEdit, double theValue );
double lineEditValue( const QLineEdit *theLineEdit ) const;
void resetClassifyButton();
void showMinMaxOrigin();
QgsRasterMinMaxWidget * mMinMaxWidget;
int mMinMaxOrigin;
};
#endif // QGSSINGLEBANDCOLORRENDERERWIDGET_H

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>722</width>
<height>663</height>
<width>652</width>
<height>515</height>
</rect>
</property>
<property name="sizePolicy">
@ -101,7 +101,27 @@
</property>
<property name="sizeHint" stdset="0">
<size>
<width>318</width>
<width>150</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="mInvertColorMapCheckBox">
<property name="text">
<string>Invert color map</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
@ -112,52 +132,71 @@
<item row="4" column="0">
<widget class="QStackedWidget" name="mRendererStackedWidget"/>
</item>
<item row="0" column="0">
<item row="5" column="0">
<widget class="QGroupBox" name="mResamplingGroupBox_2">
<property name="title">
<string>Resampling</string>
</property>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="mZoomedInResamplingLabel">
<property name="text">
<string>Zoomed in</string>
</property>
</widget>
</item>
<item row="0" column="1">
<item>
<widget class="QComboBox" name="mZoomedInResamplingComboBox"/>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="mZoomedOutResamplingLabel">
<property name="text">
<string>Zoomed out</string>
</property>
</widget>
</item>
<item row="0" column="2">
<item>
<widget class="QComboBox" name="mZoomedOutResamplingComboBox"/>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="mMaximumOversamplingLabel">
<property name="text">
<string>Maximum oversampling</string>
<string>Oversampling</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QComboBox" name="mZoomedInResamplingComboBox"/>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mZoomedOutResamplingComboBox"/>
</item>
<item row="1" column="2">
<item>
<widget class="QDoubleSpinBox" name="mMaximumOversamplingSpinBox"/>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="mInvertColorMapCheckBox">
<property name="text">
<string>Invert color map</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabBarPage2">
@ -589,7 +628,7 @@
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Less than:</string>
<string>Less than:</string>
</property>
</widget>
</item>
@ -599,15 +638,15 @@
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>More than or equal to:</string>
<string>More than or equal to:</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QgsScaleComboBox" name="cbMaximumScale"/>
<widget class="QgsScaleComboBox" name="cbMaximumScale" native="true"/>
</item>
<item row="0" column="1">
<widget class="QgsScaleComboBox" name="cbMinimumScale"/>
<widget class="QgsScaleComboBox" name="cbMinimumScale" native="true"/>
</item>
</layout>
</widget>
@ -899,7 +938,7 @@
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Cantarell'; font-size:11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
@ -1046,6 +1085,13 @@ p, li { white-space: pre-wrap; }
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QgsScaleComboBox</class>
<extends>QWidget</extends>
<header>qgsscalecombobox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>tabBar</tabstop>
<tabstop>buttonBox</tabstop>

View File

@ -6,271 +6,282 @@
<rect>
<x>0</x>
<y>0</y>
<width>433</width>
<height>293</height>
<width>371</width>
<height>264</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QGroupBox" name="mLoadMinMaxValuesGroupBox">
<property name="title">
<string>Load min/max values</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="mCumulativeCutRadioButton">
<property name="text">
<string>Cumulative pixel count cut</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="2" colspan="3">
<widget class="QWidget" name="widget_4" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QDoubleSpinBox" name="mCumulativeCutLowerDoubleSpinBox">
<property name="decimals">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="mCumulativeCutUpperDoubleSpinBox">
<property name="decimals">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>%</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>123</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="mMinMaxRadioButton">
<property name="text">
<string>Min / max</string>
</property>
</widget>
</item>
<item row="1" column="1" colspan="4">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>268</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" colspan="3">
<widget class="QRadioButton" name="mStdDevRadioButton">
<property name="text">
<string>Mean +/- standard deviation ×</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QDoubleSpinBox" name="mStdDevSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="4">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>148</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QRadioButton" name="mCumulativeCutRadioButton">
<property name="text">
<string>Cumulative count cut</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="mCumulativeCutLowerDoubleSpinBox">
<property name="decimals">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="mCumulativeCutUpperDoubleSpinBox">
<property name="decimals">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>%</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>123</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QGroupBox" name="mExtentGroupBox">
<property name="title">
<string>Extent</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QRadioButton" name="mFullExtentRadioButton">
<property name="text">
<string>Full</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="mCurrentExtentRadioButton">
<property name="text">
<string>Current</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="mAccuracyGroupBox">
<property name="title">
<string>Accuracy</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>65</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="mActualRadioButton">
<property name="text">
<string>Actual (slower)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>65</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="mEstimateRadioButton">
<property name="text">
<string>Estimate (faster)</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QRadioButton" name="mMinMaxRadioButton">
<property name="text">
<string>Min / max</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>268</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QWidget" name="widget_3" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>313</width>
<height>21</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="mLoadPushButton">
<property name="text">
<string>Load</string>
</property>
</widget>
</item>
</layout>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QRadioButton" name="mStdDevRadioButton">
<property name="text">
<string>Mean +/- standard deviation ×</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="mStdDevSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="value">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>318</width>
<height>17</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QGroupBox" name="mExtentGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Extent</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QRadioButton" name="mFullExtentRadioButton">
<property name="text">
<string>Full</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="mCurrentExtentRadioButton">
<property name="text">
<string>Current</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>60</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="mAccuracyGroupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Accuracy</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>65</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="mActualRadioButton">
<property name="text">
<string>Actual (slower)</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>65</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="mEstimateRadioButton">
<property name="text">
<string>Estimate (faster)</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>313</width>
<height>21</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="mLoadPushButton">
<property name="text">
<string>Load</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>

View File

@ -6,231 +6,360 @@
<rect>
<x>0</x>
<y>0</y>
<width>584</width>
<height>400</height>
<width>637</width>
<height>207</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="mBandLabel">
<property name="text">
<string>Band</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="mBandComboBox"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="mColorInterpolationLabel">
<property name="text">
<string>Color interpolation</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mColorInterpolationComboBox"/>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="mAddEntryButton">
<property name="text">
<string>Add entry</string>
</property>
</widget>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="mBandLabel">
<property name="text">
<string>Band</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="mBandComboBox"/>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mColorInterpolationComboBox"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="mColorInterpolationLabel">
<property name="text">
<string>Color interpolation</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="mDeleteEntryButton">
<property name="text">
<string>Delete entry</string>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QToolButton" name="mAddEntryButton">
<property name="toolTip">
<string>Add values manually</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionNewAttribute.png</normaloff>:/images/themes/default/mActionNewAttribute.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="mDeleteEntryButton">
<property name="toolTip">
<string>Remove selected row</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionDeleteAttribute.png</normaloff>:/images/themes/default/mActionDeleteAttribute.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="mSortButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset>
<normaloff>../../../../../../usr/share/icons/oxygen/16x16/actions/view-sort-ascending.png</normaloff>../../../../../../usr/share/icons/oxygen/16x16/actions/view-sort-ascending.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="mLoadFromBandButton">
<property name="toolTip">
<string>Load color map from band</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionDraw.png</normaloff>:/images/themes/default/mActionDraw.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="mLoadFromFileButton">
<property name="toolTip">
<string>Load color map from file</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionFileOpen.png</normaloff>:/images/themes/default/mActionFileOpen.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="mExportToFileButton">
<property name="toolTip">
<string>Export color map to file</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionFileSaveAs.png</normaloff>:/images/themes/default/mActionFileSaveAs.png</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>48</width>
<height>28</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="mSortButton">
<property name="text">
<string>Sort</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>148</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="mLoadFromBandButton">
<property name="toolTip">
<string>Load color map from band</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionNewAttribute.png</normaloff>:/images/themes/default/mActionNewAttribute.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="mLoadFromFileButton">
<property name="toolTip">
<string>Load color map from file</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionFileOpen.png</normaloff>:/images/themes/default/mActionFileOpen.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="mExportToFileButton">
<property name="toolTip">
<string>Export color map to file</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/mActionFileSaveAs.png</normaloff>:/images/themes/default/mActionFileSaveAs.png</iconset>
<widget class="QTreeWidget" name="mColormapTreeWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="headerDefaultSectionSize">
<number>70</number>
</attribute>
<attribute name="headerMinimumSectionSize">
<number>10</number>
</attribute>
<attribute name="headerStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="headerDefaultSectionSize">
<number>70</number>
</attribute>
<attribute name="headerMinimumSectionSize">
<number>10</number>
</attribute>
<attribute name="headerStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string>Value</string>
</property>
</column>
<column>
<property name="text">
<string>Color</string>
</property>
</column>
<column>
<property name="text">
<string>Label</string>
</property>
</column>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QTreeWidget" name="mColormapTreeWidget">
<column>
<property name="text">
<string>Value</string>
</property>
</column>
<column>
<property name="text">
<string>Color</string>
</property>
</column>
<column>
<property name="text">
<string>Label</string>
</property>
</column>
</widget>
</item>
<item row="3" column="0">
<widget class="QGroupBox" name="grpGenerateColorMap">
<property name="title">
<string>Generate new color map</string>
</property>
<layout class="QGridLayout" name="_2">
<item row="0" column="0">
<widget class="QLabel" name="mNumberOfEntriesLabel">
<property name="text">
<string>Classes</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="mNumberOfEntriesSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>255</number>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="mClassificationModeLabel">
<property name="text">
<string>Mode</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QComboBox" name="mClassificationModeComboBox"/>
</item>
<item row="0" column="9">
<widget class="QPushButton" name="mClassifyButton">
<property name="text">
<string>Classify</string>
</property>
</widget>
</item>
<item row="0" column="5">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="6">
<widget class="QLabel" name="label">
<property name="text">
<string>Color ramp</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="7">
<widget class="QgsColorRampComboBox" name="mColorRampComboBox"/>
</item>
<item row="0" column="8">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QGroupBox" name="grpGenerateColorMap">
<property name="title">
<string>Generate new color map</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="mNumberOfEntriesLabel">
<property name="text">
<string>Classes</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="mNumberOfEntriesSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>255</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Colors</string>
</property>
</widget>
</item>
<item>
<widget class="QgsColorRampComboBox" name="mColorRampComboBox"/>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="mClassifyButton">
<property name="text">
<string>Classify</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="mMinLabel">
<property name="text">
<string>Min</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="mMinLineEdit"/>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="mMaxLabel">
<property name="text">
<string>Max</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="mMaxLineEdit"/>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="mClassificationModeLabel">
<property name="text">
<string>Mode</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="mClassificationModeComboBox"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Min / max origin:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="mMinMaxOriginLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Min / Max origin</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="mMinMaxContainerWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<zorder>grpGenerateColorMap</zorder>
</widget>
</item>
</layout>
</item>
</layout>
</widget>