Zen minimalism for raster graphing page

git-svn-id: http://svn.osgeo.org/qgis/trunk@14296 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
timlinux 2010-09-27 09:31:45 +00:00
parent c087a660fe
commit 8ecc563b5b
3 changed files with 275 additions and 492 deletions

View File

@ -52,6 +52,7 @@
#include "qgslogger.h"
// QWT Charting widget
#include <qwt_plot_canvas.h>
#include <qwt_array.h>
#include <qwt_legend.h>
#include <qwt_plot.h>
@ -167,97 +168,23 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer* lyr, QgsMapCanv
QgsDebugMsg( "Populating band combo boxes" );
//
// Get a list of band names
//
QStringList myBandNameList;
int myBandCountInt = mRasterLayer->bandCount();
QgsDebugMsg( QString( "Looping though %1 image layers to get their names " ).arg( myBandCountInt ) );
for ( int myIteratorInt = 1;
myIteratorInt <= myBandCountInt;
++myIteratorInt )
{
//find out the name of this band
QString myRasterBandNameQString = mRasterLayer->bandName( myIteratorInt ) ;
//add the band to the histogram tab
//
QPixmap myPixmap( 10, 10 );
if ( myBandCountInt == 1 ) //draw single band images with black
{
myPixmap.fill( Qt::black );
}
else if ( myIteratorInt == 1 )
{
myPixmap.fill( Qt::red );
}
else if ( myIteratorInt == 2 )
{
myPixmap.fill( Qt::green );
}
else if ( myIteratorInt == 3 )
{
myPixmap.fill( Qt::blue );
}
else if ( myIteratorInt == 4 )
{
myPixmap.fill( Qt::magenta );
}
else if ( myIteratorInt == 5 )
{
myPixmap.fill( Qt::darkRed );
}
else if ( myIteratorInt == 6 )
{
myPixmap.fill( Qt::darkGreen );
}
else if ( myIteratorInt == 7 )
{
myPixmap.fill( Qt::darkBlue );
}
else
{
myPixmap.fill( Qt::gray );
}
lstHistogramLabels->addItem( new QListWidgetItem( myPixmap, myRasterBandNameQString ) );
//keep a list of band names for later use
//! @note band names should not be translated!
myBandNameList.append( myRasterBandNameQString );
}
//select all histogram layers list items by default
for ( int myIteratorInt = 1;
myIteratorInt <= myBandCountInt;
++myIteratorInt )
{
QListWidgetItem *myItem = lstHistogramLabels->item( myIteratorInt - 1 );
myItem->setSelected( true );
}
for ( QStringList::Iterator myIterator = myBandNameList.begin();
myIterator != myBandNameList.end();
++myIterator )
{
QString myQString = *myIterator;
QgsDebugMsg( QString( "Inserting : %1" ).arg( myQString ) );
cboGray->addItem( myQString );
cboRed->addItem( myQString );
cboGreen->addItem( myQString );
cboBlue->addItem( myQString );
cboxColorMapBand->addItem( myQString );
QString myRasterBandName = mRasterLayer->bandName( myIteratorInt ) ;
cboGray->addItem( myRasterBandName );
cboRed->addItem( myRasterBandName );
cboGreen->addItem( myRasterBandName );
cboBlue->addItem( myRasterBandName );
cboxColorMapBand->addItem( myRasterBandName );
}
cboRed->addItem( TRSTRING_NOT_SET );
cboGreen->addItem( TRSTRING_NOT_SET );
cboBlue->addItem( TRSTRING_NOT_SET );
cboGray->addItem( TRSTRING_NOT_SET );
cboxTransparencyBand->addItem( TRSTRING_NOT_SET );
QIcon myPyramidPixmap( QgisApp::getThemeIcon( "/mIconPyramid.png" ) );
@ -1911,13 +1838,40 @@ void QgsRasterLayerProperties::on_pbnExportTransparentPixelValues_clicked()
}
}
void QgsRasterLayerProperties::on_pbnHistRefresh_clicked()
void QgsRasterLayerProperties::on_tabBar_currentChanged( int theTab )
{
int myHistogramTab = 6;
if ( theTab == myHistogramTab )
{
refreshHistogram();
}
}
void QgsRasterLayerProperties::refreshHistogram()
{
mHistogramProgress->show();
connect( mRasterLayer, SIGNAL( progressUpdate( int ) ), mHistogramProgress, SLOT( setValue( int ) ) );
QApplication::setOverrideCursor( Qt::WaitCursor );
QgsDebugMsg( "entered." );
int myBandCountInt = mRasterLayer->bandCount();
QwtPlot * mypPlot = new QwtPlot( mChartWidget );
mypPlot->canvas()->setCursor(Qt::ArrowCursor);
//ensure all children get removed
mypPlot->setAutoDelete( true );
QVBoxLayout *mpHistogramLayout = new QVBoxLayout( mChartWidget );
mpHistogramLayout->setContentsMargins( 0, 0, 0, 0 );
mpHistogramLayout->addWidget( mypPlot );
mChartWidget->setLayout( mpHistogramLayout );
mypPlot->setTitle( QObject::tr( "Raster Histogram") );
mypPlot->insertLegend( new QwtLegend(), QwtPlot::BottomLegend );
// Set axis titles
mypPlot->setAxisTitle( QwtPlot::xBottom, QObject::tr("Pixel Value") );
mypPlot->setAxisTitle( QwtPlot::yLeft, QObject::tr("Frequency") );
mypPlot->setAxisAutoScale( QwtPlot::xBottom );
mypPlot->setAxisAutoScale( QwtPlot::yLeft );
// add a grid
QwtPlotGrid * myGrid = new QwtPlotGrid();
myGrid->attach(mypPlot);
// Explanation:
// We use the gdal histogram creation routine is called for each selected
// layer. Currently the hist is hardcoded
@ -1928,125 +1882,48 @@ void QgsRasterLayerProperties::on_pbnHistRefresh_clicked()
// bin in all selected layers, and the min. It then draws a scaled line between min
// and max - scaled to image height. 1 line drawn per selected band
//
const int BINCOUNT = spinHistBinCount->value();
const int BINCOUNT = 255;
enum GRAPH_TYPE { BAR_CHART, LINE_CHART } myGraphType;
if ( radHistTypeBar->isChecked() ) myGraphType = BAR_CHART; else myGraphType = LINE_CHART;
bool myIgnoreOutOfRangeFlag = chkHistIgnoreOutOfRange->isChecked();
bool myThoroughBandScanFlag = chkHistAllowApproximation->isChecked();
#ifdef QGISDEBUG
long myCellCount = mRasterLayer->width() * mRasterLayer->height();
#endif
QgsDebugMsg( "Computing histogram minima and maxima" );
//somtimes there are more bins than needed
//we find out the last on that actually has data in it
//so we can discard the rest adn the x-axis scales correctly
myGraphType = BAR_CHART;
bool myIgnoreOutOfRangeFlag = true;
bool myThoroughBandScanFlag = false;
int myLastBinWithData = 0;
//
// First scan through to get max and min cell counts from among selected layers' histograms
//
double myYAxisMax = 0;
double myYAxisMin = 0;
int myXAxisMin = 0;
int myXAxisMax = 0;
bool myFirstItemFlag = true;
for ( int myIteratorInt = 1;
myIteratorInt <= myBandCountInt;
++myIteratorInt )
{
QgsRasterBandStats myRasterBandStats = mRasterLayer->bandStatistics( myIteratorInt );
//calculate the x axis min max
if ( myRasterBandStats.minimumValue < myXAxisMin || myIteratorInt == 1 )
{
myXAxisMin = static_cast < unsigned int >( myRasterBandStats.minimumValue );
}
if ( myRasterBandStats.maximumValue < myXAxisMax || myIteratorInt == 1 )
{
myXAxisMax = static_cast < unsigned int >( myRasterBandStats.maximumValue );
}
QListWidgetItem *myItem = lstHistogramLabels->item( myIteratorInt - 1 );
if ( myItem->isSelected() )
{
QgsDebugMsg( "Ensuring hist is populated for this layer" );
mRasterLayer->populateHistogram( myIteratorInt, BINCOUNT, myIgnoreOutOfRangeFlag, myThoroughBandScanFlag );
QgsDebugMsg( QString( "...done...%1 bins filled" ).arg( myRasterBandStats.histogramVector->size() ) );
for ( int myBin = 0; myBin < BINCOUNT; myBin++ )
{
int myBinValue = myRasterBandStats.histogramVector->at( myBin );
if ( myBinValue > 0 && myBin > myLastBinWithData )
{
myLastBinWithData = myBin;
}
QgsDebugMsg( QString( "Testing if %1 is less than %2or greater then %3" ).arg( myBinValue ).arg( myYAxisMin ).arg( myYAxisMax ) );
if ( myBin == 0 && myFirstItemFlag )
{
myYAxisMin = myBinValue;
myYAxisMax = myBinValue;
}
if ( myBinValue > myYAxisMax )
{
myYAxisMax = myBinValue;
}
if ( myBinValue < myYAxisMin )
{
myYAxisMin = myBinValue;
}
}
myFirstItemFlag = false;
}
}
disconnect( mRasterLayer, SIGNAL( progressUpdate( int ) ), mHistogramProgress, SLOT( setValue( int ) ) );
QgsDebugMsg( QString( "max %1" ).arg( myYAxisMax ) );
QgsDebugMsg( QString( "min %1" ).arg( myYAxisMin ) );
QwtPlot * mypPlot = new QwtPlot( mChartWidget );
//ensure all children get removed
mypPlot->setAutoDelete( true );
QVBoxLayout *mpHistogramLayout = new QVBoxLayout( mChartWidget );
mpHistogramLayout->setContentsMargins( 0, 0, 0, 0 );
mpHistogramLayout->addWidget( mypPlot );
mChartWidget->setLayout( mpHistogramLayout );
mypPlot->setTitle(QObject::tr("Raster Histogram"));
mypPlot->insertLegend(new QwtLegend(), QwtPlot::BottomLegend);
// Set axis titles
mypPlot->setAxisTitle(QwtPlot::xBottom, QObject::tr("Pixel Value"));
mypPlot->setAxisTitle(QwtPlot::yLeft, QObject::tr("Frequency"));
//
// add a grid
//
QwtPlotGrid * myGrid = new QwtPlotGrid();
myGrid->attach(mypPlot);
int myBandCountInt = mRasterLayer->bandCount();
QList<QColor> myColors;
myColors << Qt::black << Qt::red << Qt::green << Qt::blue << Qt::magenta << Qt::darkRed << Qt::darkGreen << Qt::darkBlue;
//
//now draw actual graphs
//
QList<QColor> myColors;
myColors << Qt::black << Qt::red << Qt::green << Qt::blue << Qt::magenta << Qt::darkRed << Qt::darkGreen << Qt::darkBlue;
//somtimes there are more bins than needed
//we find out the last one that actually has data in it
//so we can discard the rest and set the x-axis scales correctly
//
// scan through to get counts from layers' histograms
//
for ( int myIteratorInt = 1;
myIteratorInt <= myBandCountInt;
++myIteratorInt )
{
QgsRasterBandStats myRasterBandStats = mRasterLayer->bandStatistics( myIteratorInt );
QListWidgetItem *myItem = lstHistogramLabels->item( myIteratorInt - 1 );
if ( myItem->isSelected() )
mRasterLayer->populateHistogram( myIteratorInt, BINCOUNT, myIgnoreOutOfRangeFlag, myThoroughBandScanFlag );
QwtPlotCurve * mypCurve = new QwtPlotCurve( tr( "Band %1" ).arg( myIteratorInt ) );
mypCurve->setRenderHint( QwtPlotItem::RenderAntialiased );
mypCurve->setPen(QPen( myColors.at( myIteratorInt ) ) );
QwtArray<double> myX2Data;//qwtarray is just a wrapped qvector
QwtArray<double> myY2Data;//qwtarray is just a wrapped qvector
for ( int myBin = 0; myBin < BINCOUNT; myBin++ )
{
QwtPlotCurve * mypCurve = new QwtPlotCurve( tr( "Band %i" ).arg( myIteratorInt ) );
mypCurve->setRenderHint( QwtPlotItem::RenderAntialiased );
mypCurve->setPen(QPen( myColors.at( myIteratorInt ) ) );
QwtArray<double> myX2Data;//qwtarray is just a wrapped qvector
QwtArray<double> myY2Data;//qwtarray is just a wrapped qvector
for ( int myBin = 0; myBin < myLastBinWithData; myBin++ )
{
double myBinValue = myRasterBandStats.histogramVector->at( myBin );
myX2Data.append(myBin);
myY2Data.append(myBinValue);
}
mypCurve->setData(myX2Data,myY2Data);
mypCurve->attach(mypPlot);
int myBinValue = myRasterBandStats.histogramVector->at( myBin );
myX2Data.append( double( myBin) );
myY2Data.append( double( myBinValue) );
}
mypCurve->setData(myX2Data,myY2Data);
mypCurve->attach(mypPlot);
}
mypPlot->replot();
disconnect( mRasterLayer, SIGNAL( progressUpdate( int ) ), mHistogramProgress, SLOT( setValue( int ) ) );
mHistogramProgress->hide();
QApplication::restoreOverrideCursor();
}

View File

@ -68,8 +68,10 @@ class QgsRasterLayerProperties : public QDialog, private Ui::QgsRasterLayerPrope
void on_pbnDefaultValues_clicked();
/** \brief slot executed when user wishes to export transparency values */
void on_pbnExportTransparentPixelValues_clicked();
/** \brief auto slot executed when the active page in the main widget stack is changed */
void on_tabBar_currentChanged( int theTab );
/** \brief slot executed when user wishes to refresh raster histogram */
void on_pbnHistRefresh_clicked();
void refreshHistogram();
/** \brief slow executed when user wishes to import transparency values */
void on_pbnImportTransparentPixelValues_clicked();
/** \brief slot executed when user presses "Remove Selected Row" button on the transparency page */

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>757</width>
<height>638</height>
<width>755</width>
<height>618</height>
</rect>
</property>
<property name="windowTitle">
@ -25,175 +25,42 @@
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QListWidget" name="listWidget">
<property name="minimumSize">
<size>
<width>110</width>
<height>0</height>
</size>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="pbnLoadDefaultStyle">
<property name="text">
<string>Restore Default Style</string>
</property>
<property name="maximumSize">
<size>
<width>110</width>
<height>16777215</height>
</size>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pbnSaveDefaultStyle">
<property name="text">
<string>Save As Default</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="pbnLoadStyle">
<property name="text">
<string>Load Style ...</string>
</property>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="pbnSaveStyleAs">
<property name="text">
<string>Save Style ...</string>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</widget>
</item>
<item row="2" column="0" colspan="5">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="iconSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="textElideMode">
<enum>Qt::ElideNone</enum>
</property>
<property name="flow">
<enum>QListView::TopToBottom</enum>
</property>
<property name="isWrapping" stdset="0">
<bool>false</bool>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
<property name="spacing">
<number>9</number>
</property>
<property name="viewMode">
<enum>QListView::IconMode</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<item>
<property name="text">
<string>Symbology</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/symbology.png</normaloff>:/images/themes/default/propertyicons/symbology.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Transparency</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/transparency.png</normaloff>:/images/themes/default/propertyicons/transparency.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Colormap</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/colormap.png</normaloff>:/images/themes/default/propertyicons/colormap.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>General</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/general.png</normaloff>:/images/themes/default/propertyicons/general.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Metadata</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/metadata.png</normaloff>:/images/themes/default/propertyicons/metadata.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Pyramids</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/pyramids.png</normaloff>:/images/themes/default/propertyicons/pyramids.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Histogram</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/histogram.png</normaloff>:/images/themes/default/propertyicons/histogram.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string notr="true"/>
</property>
<property name="flags">
<set>NoItemFlags</set>
</property>
</item>
</widget>
</item>
<item row="0" column="1" colspan="4">
@ -1893,6 +1760,8 @@ p, li { white-space: pre-wrap; }
&lt;td style=&quot;border: none;&quot;&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
@ -1963,159 +1832,201 @@ p, li { white-space: pre-wrap; }
<widget class="QWidget" name="tabPageHistogram">
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0" colspan="3">
<widget class="QWidget" name="mChartWidget" native="true"/>
</item>
<item row="1" column="0" rowspan="3">
<widget class="QListWidget" name="lstHistogramLabels">
<property name="maximumSize">
<size>
<width>99999</width>
<height>32767</height>
</size>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::MultiSelection</enum>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QGroupBox" name="grpHistCharType">
<widget class="QWidget" name="mChartWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Chart Type</string>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<layout class="QGridLayout">
<property name="margin">
<number>11</number>
</property>
<item row="0" column="1">
<widget class="QRadioButton" name="radHistTypeLine">
<property name="text">
<string>Line graph</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="radHistTypeBar">
<property name="text">
<string>Bar chart</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Options</string>
</property>
<layout class="QGridLayout">
<item row="0" column="0">
<widget class="QLabel" name="textLabel1_2">
<property name="text">
<string>Column count</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinHistBinCount">
<property name="minimum">
<number>8</number>
</property>
<property name="maximum">
<number>1024</number>
</property>
<property name="singleStep">
<number>8</number>
</property>
<property name="value">
<number>64</number>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="chkHistIgnoreOutOfRange">
<property name="text">
<string>Out of range OK?</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="chkHistAllowApproximation">
<property name="text">
<string>Allow approximation</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="3" column="1">
<item row="1" column="1">
<widget class="QProgressBar" name="mHistogramProgress">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QPushButton" name="pbnHistRefresh">
<property name="text">
<string>Refresh</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="pbnLoadDefaultStyle">
<property name="text">
<string>Restore Default Style</string>
<item row="0" column="0">
<widget class="QListWidget" name="listWidget">
<property name="minimumSize">
<size>
<width>110</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pbnSaveDefaultStyle">
<property name="text">
<string>Save As Default</string>
<property name="maximumSize">
<size>
<width>110</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="pbnLoadStyle">
<property name="text">
<string>Load Style ...</string>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="pbnSaveStyleAs">
<property name="text">
<string>Save Style ...</string>
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
</widget>
</item>
<item row="2" column="0" colspan="5">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="iconSize">
<size>
<width>64</width>
<height>64</height>
</size>
</property>
<property name="textElideMode">
<enum>Qt::ElideNone</enum>
</property>
<property name="flow">
<enum>QListView::TopToBottom</enum>
</property>
<property name="isWrapping" stdset="0">
<bool>false</bool>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
<property name="spacing">
<number>9</number>
</property>
<property name="viewMode">
<enum>QListView::IconMode</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<item>
<property name="text">
<string>Symbology</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/symbology.png</normaloff>:/images/themes/default/propertyicons/symbology.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Transparency</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/transparency.png</normaloff>:/images/themes/default/propertyicons/transparency.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Colormap</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/colormap.png</normaloff>:/images/themes/default/propertyicons/colormap.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>General</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/general.png</normaloff>:/images/themes/default/propertyicons/general.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Metadata</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/metadata.png</normaloff>:/images/themes/default/propertyicons/metadata.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Pyramids</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/pyramids.png</normaloff>:/images/themes/default/propertyicons/pyramids.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string>Histogram</string>
</property>
<property name="textAlignment">
<set>AlignHCenter|AlignVCenter|AlignCenter</set>
</property>
<property name="icon">
<iconset resource="../../images/images.qrc">
<normaloff>:/images/themes/default/propertyicons/histogram.png</normaloff>:/images/themes/default/propertyicons/histogram.png</iconset>
</property>
<property name="flags">
<set>ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled</set>
</property>
</item>
<item>
<property name="text">
<string notr="true"/>
</property>
<property name="flags">
<set>NoItemFlags</set>
</property>
</item>
</widget>
</item>
</layout>
@ -2145,18 +2056,11 @@ p, li { white-space: pre-wrap; }
<tabstop>tePyramidDescription</tabstop>
<tabstop>cboResamplingMethod</tabstop>
<tabstop>buttonBuildPyramids</tabstop>
<tabstop>radHistTypeBar</tabstop>
<tabstop>radHistTypeLine</tabstop>
<tabstop>spinHistBinCount</tabstop>
<tabstop>chkHistIgnoreOutOfRange</tabstop>
<tabstop>chkHistAllowApproximation</tabstop>
<tabstop>pbnHistRefresh</tabstop>
<tabstop>leGrayMin</tabstop>
<tabstop>cboGray</tabstop>
<tabstop>lbxPyramidResolutions</tabstop>
<tabstop>leGrayMax</tabstop>
<tabstop>cboxColorMap</tabstop>
<tabstop>lstHistogramLabels</tabstop>
<tabstop>sboxSingleBandStdDev</tabstop>
</tabstops>
<resources>
@ -2170,8 +2074,8 @@ p, li { white-space: pre-wrap; }
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>476</x>
<y>620</y>
<x>485</x>
<y>608</y>
</hint>
<hint type="destinationlabel">
<x>3</x>