27 #include "qgssettings.h" 
   40 #include <QPushButton> 
   41 #include <QInputDialog> 
   42 #include <QFileDialog> 
   44 #include <QMessageBox> 
   45 #include <QTextStream> 
   55   mLoadFromBandButton->setVisible( 
false ); 
 
   57   connect( mAddEntryButton, &QPushButton::clicked, 
this, &QgsColorRampShaderWidget::mAddEntryButton_clicked );
 
   58   connect( mDeleteEntryButton, &QPushButton::clicked, 
this, &QgsColorRampShaderWidget::mDeleteEntryButton_clicked );
 
   59   connect( mLoadFromBandButton, &QPushButton::clicked, 
this, &QgsColorRampShaderWidget::mLoadFromBandButton_clicked );
 
   60   connect( mLoadFromFileButton, &QPushButton::clicked, 
this, &QgsColorRampShaderWidget::mLoadFromFileButton_clicked );
 
   61   connect( mExportToFileButton, &QPushButton::clicked, 
this, &QgsColorRampShaderWidget::mExportToFileButton_clicked );
 
   62   connect( mUnitLineEdit, &QLineEdit::textEdited, 
this, &QgsColorRampShaderWidget::mUnitLineEdit_textEdited );
 
   63   connect( mColormapTreeWidget, &QTreeWidget::itemDoubleClicked, 
this, &QgsColorRampShaderWidget::mColormapTreeWidget_itemDoubleClicked );
 
   64   connect( mColorInterpolationComboBox, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsColorRampShaderWidget::mColorInterpolationComboBox_currentIndexChanged );
 
   65   connect( mClassificationModeComboBox, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsColorRampShaderWidget::mClassificationModeComboBox_currentIndexChanged );
 
   67   connect( mLegendSettingsButton, &QPushButton::clicked, 
this, &QgsColorRampShaderWidget::showLegendSettings );
 
   69   contextMenu = 
new QMenu( tr( 
"Options" ), 
this );
 
   70   contextMenu->addAction( tr( 
"Change Color…" ), 
this, SLOT( changeColor() ) );
 
   71   contextMenu->addAction( tr( 
"Change Opacity…" ), 
this, SLOT( changeOpacity() ) );
 
   75   mColormapTreeWidget->setItemDelegateForColumn( ValueColumn, mValueDelegate );
 
   77   mColormapTreeWidget->setColumnWidth( ColorColumn, 
Qgis::UI_SCALE_FACTOR * fontMetrics().horizontalAdvance( 
'X' ) * 6.6 );
 
   79   mColormapTreeWidget->setContextMenuPolicy( Qt::CustomContextMenu );
 
   80   mColormapTreeWidget->setSelectionMode( QAbstractItemView::ExtendedSelection );
 
   81   connect( mColormapTreeWidget, &QTreeView::customContextMenuRequested, 
this, [ = ]( QPoint ) { contextMenu->exec( QCursor::pos() ); } );
 
   83   QString defaultPalette = settings.value( QStringLiteral( 
"Raster/defaultPalette" ), 
"" ).toString();
 
   84   btnColorRamp->setColorRampFromName( defaultPalette );
 
   96   mNumberOfEntriesSpinBox->setValue( 5 ); 
 
   98   mClassificationModeComboBox_currentIndexChanged( 0 );
 
  100   resetClassifyButton();
 
  108   connect( mLabelPrecisionSpinBox, qOverload<int>( &QSpinBox::valueChanged ), 
this, [ = ]( 
int )
 
  122   mRasterDataProvider = dp;
 
  123   mLoadFromBandButton->setVisible( 
bool( mRasterDataProvider ) ); 
 
  134   mLabelPrecisionSpinBox->setMaximum( maxDigits );
 
  135   mValueDelegate->setDataType( dataType );
 
  149   colorRampShader.
setClip( mClipCheckBox->isChecked() );
 
  152   QList<QgsColorRampShader::ColorRampItem> colorRampItems;
 
  153   int topLevelItemCount = mColormapTreeWidget->topLevelItemCount();
 
  154   QTreeWidgetItem *currentItem = 
nullptr;
 
  155   for ( 
int i = 0; i < topLevelItemCount; ++i )
 
  157     currentItem = mColormapTreeWidget->topLevelItem( i );
 
  163     newColorRampItem.
value = currentItem->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toDouble();
 
  164     newColorRampItem.
color = currentItem->data( ColorColumn, Qt::ItemDataRole::EditRole ).value<QColor>();
 
  165     newColorRampItem.
label = currentItem->text( LabelColumn );
 
  166     colorRampItems.append( newColorRampItem );
 
  169   std::sort( colorRampItems.begin(), colorRampItems.end() );
 
  172   if ( !btnColorRamp->isNull() )
 
  178   return colorRampShader;
 
  181 void QgsColorRampShaderWidget::autoLabel()
 
  184   mColormapTreeWidget->sortItems( ValueColumn, Qt::AscendingOrder );
 
  190   const QString unit = mUnitLineEdit->text();
 
  191   int topLevelItemCount = mColormapTreeWidget->topLevelItemCount();
 
  193   QTreeWidgetItem *currentItem = 
nullptr;
 
  194   for ( 
int i = 0; i < topLevelItemCount; ++i )
 
  196     currentItem = mColormapTreeWidget->topLevelItem( i );
 
  198     if ( !currentItem || currentItem->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toString().isEmpty() )
 
  203     const QString lbl = createLabel( currentItem, i, unit );
 
  205     if ( currentItem->text( LabelColumn ).isEmpty() || currentItem->text( LabelColumn ) == lbl || currentItem->foreground( LabelColumn ).color() == QColor( Qt::gray ) )
 
  207       currentItem->setText( LabelColumn, lbl );
 
  208       currentItem->setForeground( LabelColumn, QBrush( QColor( Qt::gray ) ) );
 
  214 void QgsColorRampShaderWidget::setUnitFromLabels()
 
  216   QStringList allSuffixes;
 
  218   int topLevelItemCount = mColormapTreeWidget->topLevelItemCount();
 
  219   QTreeWidgetItem *currentItem = 
nullptr;
 
  220   for ( 
int i = 0; i < topLevelItemCount; ++i )
 
  222     currentItem = mColormapTreeWidget->topLevelItem( i );
 
  224     if ( !currentItem || currentItem->text( ValueColumn ).isEmpty() )
 
  229     label = createLabel( currentItem, i, QString() );
 
  231     if ( currentItem->text( LabelColumn ).startsWith( label ) )
 
  233       allSuffixes.append( currentItem->text( LabelColumn ).mid( label.length() ) );
 
  237   QStringList suffixes = QStringList( allSuffixes );
 
  238   suffixes.removeDuplicates();
 
  241   for ( 
int i = 0; i < suffixes.count(); ++i )
 
  243     int n = allSuffixes.count( suffixes[i] );
 
  253     mUnitLineEdit->setText( unit );
 
  258 void QgsColorRampShaderWidget::dumpClasses()
 
  260   for ( 
int row = 0; row < mColormapTreeWidget->model()->rowCount(); ++row )
 
  262     const auto labelData { mColormapTreeWidget->model()->itemData( mColormapTreeWidget->model()->index( row, LabelColumn ) ) };
 
  263     const auto valueData { mColormapTreeWidget->model()->itemData( mColormapTreeWidget->model()->index( row, ValueColumn ) ) };
 
  265                       .arg( labelData[ Qt::ItemDataRole::DisplayRole ].toString(),
 
  266                             valueData[ Qt::ItemDataRole::DisplayRole ].toString() ), 2 );
 
  271 void QgsColorRampShaderWidget::mAddEntryButton_clicked()
 
  274   newItem->
setData( ValueColumn, Qt::ItemDataRole::DisplayRole, 0 );
 
  275   newItem->
setData( ColorColumn, Qt::ItemDataRole::EditRole, QColor( Qt::magenta ) );
 
  276   newItem->setText( LabelColumn, QString() );
 
  277   newItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable );
 
  279            this, &QgsColorRampShaderWidget::mColormapTreeWidget_itemEdited );
 
  287 void QgsColorRampShaderWidget::mDeleteEntryButton_clicked()
 
  289   QList<QTreeWidgetItem *> itemList;
 
  290   itemList = mColormapTreeWidget->selectedItems();
 
  291   if ( itemList.isEmpty() )
 
  296   const auto constItemList = itemList;
 
  297   for ( QTreeWidgetItem *item : constItemList )
 
  309   std::unique_ptr< QgsColorRamp > ramp( btnColorRamp->colorRamp() );
 
  310   if ( !ramp || std::isnan( mMin ) || std::isnan( mMax ) )
 
  323   colorRampShader->classifyColorRamp( mNumberOfEntriesSpinBox->value(),
 
  326                                       mRasterDataProvider );
 
  327   colorRampShader->setClip( mClipCheckBox->isChecked() );
 
  329   mColormapTreeWidget->clear();
 
  331   const QList<QgsColorRampShader::ColorRampItem> colorRampItemList = colorRampShader->colorRampItemList();
 
  332   QList<QgsColorRampShader::ColorRampItem>::const_iterator it = colorRampItemList.constBegin();
 
  333   for ( ; it != colorRampItemList.end(); ++it )
 
  336     newItem->
setData( ValueColumn, Qt::ItemDataRole::DisplayRole, it->value );
 
  337     newItem->
setData( ColorColumn, Qt::ItemDataRole::EditRole, it->color );
 
  338     newItem->setText( LabelColumn, QString() ); 
 
  339     newItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable );
 
  341              this, &QgsColorRampShaderWidget::mColormapTreeWidget_itemEdited );
 
  344   mClipCheckBox->setChecked( colorRampShader->clip() );
 
  350 void QgsColorRampShaderWidget::mClassificationModeComboBox_currentIndexChanged( 
int index )
 
  357 void QgsColorRampShaderWidget::updateColorRamp()
 
  359   std::unique_ptr< QgsColorRamp > ramp( 
shader().createColorRamp() );
 
  363 void QgsColorRampShaderWidget::applyColorRamp()
 
  365   std::unique_ptr< QgsColorRamp > ramp( btnColorRamp->colorRamp() );
 
  371   if ( !btnColorRamp->colorRampName().isEmpty() )
 
  374     QgsSettings settings;
 
  375     settings.setValue( QStringLiteral( 
"Raster/defaultPalette" ), btnColorRamp->colorRampName() );
 
  378   bool enableContinuous = ( ramp->count() > 0 );
 
  379   mClassificationModeComboBox->setEnabled( enableContinuous );
 
  380   if ( !enableContinuous )
 
  385   int topLevelItemCount = mColormapTreeWidget->topLevelItemCount();
 
  386   if ( topLevelItemCount > 0 )
 
  390     if ( std::isnan( mMin ) || std::isnan( mMax ) )
 
  392       colormapMinMax( min, max );
 
  401     QTreeWidgetItem *currentItem = 
nullptr;
 
  402     for ( 
int i = 0; i < topLevelItemCount; ++i )
 
  404       currentItem = mColormapTreeWidget->topLevelItem( i );
 
  410       double value = currentItem->data( ValueColumn, Qt::ItemDataRole::EditRole ).toDouble( );
 
  411       double position = ( value - min ) / ( max - min );
 
  425   mColormapTreeWidget->clear();
 
  426   QList<QgsColorRampShader::ColorRampItem>::const_iterator it = colorRampItems.constBegin();
 
  428   for ( ; it != colorRampItems.constEnd(); ++it )
 
  431     newItem->
setData( ValueColumn, Qt::ItemDataRole::DisplayRole, it->value );
 
  432     newItem->
setData( ColorColumn, Qt::ItemDataRole::EditRole, it->color );
 
  433     newItem->setText( LabelColumn, it->label );
 
  434     newItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable );
 
  436              this, &QgsColorRampShaderWidget::mColormapTreeWidget_itemEdited );
 
  447   const QString unit = mUnitLineEdit->text();
 
  448   for ( i = 0; i < mColormapTreeWidget->topLevelItemCount(); i++ )
 
  451     QString lbl { createLabel( currentItem, i, unit )};
 
  452     if ( currentItem->text( LabelColumn ).isEmpty() || currentItem->text( LabelColumn ) == lbl || currentItem->foreground( LabelColumn ).color() == QColor( Qt::gray ) )
 
  454       currentItem->setText( LabelColumn, lbl );
 
  455       currentItem->setForeground( LabelColumn, QBrush( QColor( Qt::gray ) ) );
 
  461 void QgsColorRampShaderWidget::mLoadFromBandButton_clicked()
 
  463   if ( !mRasterDataProvider )
 
  466   QList<QgsColorRampShader::ColorRampItem> colorRampList = mRasterDataProvider->
colorTable( mBand );
 
  467   if ( !colorRampList.isEmpty() )
 
  474     QMessageBox::warning( 
this, tr( 
"Load Color Map" ), tr( 
"The color map for band %1 has no entries." ).arg( mBand ) );
 
  480 void QgsColorRampShaderWidget::mLoadFromFileButton_clicked()
 
  482   QgsSettings settings;
 
  483   QString lastDir = settings.value( QStringLiteral( 
"lastColorMapDir" ), QDir::homePath() ).toString();
 
  484   const QString fileName = QFileDialog::getOpenFileName( 
this, tr( 
"Load Color Map from File" ), lastDir, tr( 
"Textfile (*.txt)" ) );
 
  485   if ( fileName.isEmpty() )
 
  488   QList<QgsColorRampShader::ColorRampItem> colorRampItems;
 
  494     mColormapTreeWidget->clear();
 
  496     mColorInterpolationComboBox->setCurrentIndex( mColorInterpolationComboBox->findData( type ) );
 
  500     if ( !errors.empty() )
 
  502       QMessageBox::warning( 
this, tr( 
"Load Color Map from File" ), tr( 
"The following lines contained errors\n\n" ) +  errors.join( 
'\n' ) );
 
  507     const QString error = tr( 
"An error occurred while reading the color map\n\n" ) + errors.join( 
'\n' );
 
  508     QMessageBox::warning( 
this, tr( 
"Load Color Map from File" ), error );
 
  511   QFileInfo fileInfo( fileName );
 
  512   settings.setValue( QStringLiteral( 
"lastColorMapDir" ), fileInfo.absoluteDir().absolutePath() );
 
  519 void QgsColorRampShaderWidget::mExportToFileButton_clicked()
 
  521   QgsSettings settings;
 
  522   QString lastDir = settings.value( QStringLiteral( 
"lastColorMapDir" ), QDir::homePath() ).toString();
 
  523   QString fileName = QFileDialog::getSaveFileName( 
this, tr( 
"Save Color Map as File" ), lastDir, tr( 
"Textfile (*.txt)" ) );
 
  524   if ( fileName.isEmpty() )
 
  529   QList<QgsColorRampShader::ColorRampItem> colorRampItems;
 
  530   int topLevelItemCount = mColormapTreeWidget->topLevelItemCount();
 
  531   for ( 
int i = 0; i < topLevelItemCount; ++i )
 
  533     QTreeWidgetItem *currentItem = mColormapTreeWidget->topLevelItem( i );
 
  540     item.
value = currentItem->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toDouble( );
 
  541     item.
color = currentItem->data( ColorColumn, Qt::ItemDataRole::EditRole ).value<QColor>();
 
  542     item.
label = currentItem->text( LabelColumn );
 
  543     colorRampItems << item;
 
  548     QMessageBox::warning( 
this, tr( 
"Save Color Map as File" ), tr( 
"Write access denied. Adjust the file permissions and try again.\n\n" ) );
 
  551   QFileInfo fileInfo( fileName );
 
  552   settings.setValue( QStringLiteral( 
"lastColorMapDir" ), fileInfo.absoluteDir().absolutePath() );
 
  555 void QgsColorRampShaderWidget::mColormapTreeWidget_itemDoubleClicked( QTreeWidgetItem *item, 
int column )
 
  562   if ( column == LabelColumn )
 
  565     item->setForeground( LabelColumn, QBrush() );
 
  569 void QgsColorRampShaderWidget::mColormapTreeWidget_itemEdited( QTreeWidgetItem *item, 
int column )
 
  607   whileBlocking( mColorInterpolationComboBox )->setCurrentIndex( mColorInterpolationComboBox->findData( colorRampShader.
colorRampType() ) );
 
  608   mColorInterpolationComboBox_currentIndexChanged( mColorInterpolationComboBox->currentIndex() );
 
  610   mClassificationModeComboBox_currentIndexChanged( mClassificationModeComboBox->currentIndex() );
 
  619     QgsSettings settings;
 
  620     QString defaultPalette = settings.value( QStringLiteral( 
"/Raster/defaultPalette" ), 
"Spectral" ).toString();
 
  621     btnColorRamp->setColorRampFromName( defaultPalette );
 
  624   mLabelPrecisionSpinBox->setValue( colorRampShader.
labelPrecision() );
 
  634 void QgsColorRampShaderWidget::mColorInterpolationComboBox_currentIndexChanged( 
int index )
 
  641   QString valueToolTip;
 
  642   switch ( interpolation )
 
  645       valueLabel = tr( 
"Value" );
 
  646       valueToolTip = tr( 
"Value for color stop" );
 
  647       mLegendSettingsButton->setEnabled( 
true );
 
  650       valueLabel = tr( 
"Value <=" );
 
  651       valueToolTip = tr( 
"Maximum value for class" );
 
  652       mLegendSettingsButton->setEnabled( 
false );
 
  655       valueLabel = tr( 
"Value =" );
 
  656       valueToolTip = tr( 
"Value for color" );
 
  657       mLegendSettingsButton->setEnabled( 
false );
 
  661   QTreeWidgetItem *header = mColormapTreeWidget->headerItem();
 
  662   header->setText( ValueColumn, valueLabel );
 
  663   header->setToolTip( ValueColumn, valueToolTip );
 
  682   resetClassifyButton();
 
  695 bool QgsColorRampShaderWidget::colormapMinMax( 
double &min, 
double &max )
 const 
  697   QTreeWidgetItem *item = mColormapTreeWidget->topLevelItem( 0 );
 
  705   if ( ! std::isnan( mMin ) && ! std::isnan( mMax ) && 
static_cast< QgsColorRampShader::Type >( mColorInterpolationComboBox->currentData().toInt() ) == QgsColorRampShader::Type::Discrete )
 
  712     min = item->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toDouble();
 
  713     item = mColormapTreeWidget->topLevelItem( mColormapTreeWidget->topLevelItemCount() - 1 );
 
  714     max = item->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toDouble();
 
  721   double min = 0, max = 0;
 
  722   if ( ! colormapMinMax( min, max ) )
 
  735 void QgsColorRampShaderWidget::resetClassifyButton()
 
  737   mClassifyButton->setEnabled( 
true );
 
  738   if ( std::isnan( mMin ) || std::isnan( mMax ) || mMin >= mMax )
 
  740     mClassifyButton->setEnabled( 
false );
 
  744 QString QgsColorRampShaderWidget::createLabel( QTreeWidgetItem *currentItem, 
int row, 
const QString unit )
 
  746   auto applyPrecision = [ = ]( 
const QString & value )
 
  748     double val { value.toDouble( ) };
 
  762         return QLocale().toString( std::round( val ), 
'f', 0 );
 
  767         if ( mLabelPrecisionSpinBox->value() <  0 )
 
  769           const double factor = std::pow( 10, - mLabelPrecisionSpinBox->value() );
 
  770           val = 
static_cast<qlonglong
>( val / factor ) * factor;
 
  771           return QLocale().toString( val, 
'f', 0 );
 
  773         return QLocale().toString( val, 
'f', mLabelPrecisionSpinBox->value() );
 
  779         if ( mLabelPrecisionSpinBox->value() <  0 )
 
  781           const double factor = std::pow( 10, - mLabelPrecisionSpinBox->value() );
 
  782           val = 
static_cast<qlonglong
>( val / factor ) * factor;
 
  783           return QLocale().toString( val, 
'f', 0 );
 
  785         return QLocale().toString( val, 
'f', mLabelPrecisionSpinBox->value() );
 
  799       lbl = 
"<= " + applyPrecision( currentItem->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toString() ) + unit;
 
  801     else if ( currentItem->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toDouble( ) == std::numeric_limits<double>::infinity() )
 
  803       lbl = 
"> " + applyPrecision( mColormapTreeWidget->topLevelItem( row - 1 )->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toString() ) + unit;
 
  807       lbl = applyPrecision( mColormapTreeWidget->topLevelItem( row - 1 )->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toString() ) + 
" - " + applyPrecision( currentItem->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toString() ) + unit;
 
  812     lbl = applyPrecision( currentItem->data( ValueColumn, Qt::ItemDataRole::DisplayRole ).toString() ) + unit;
 
  819 void QgsColorRampShaderWidget::changeColor()
 
  821   QList<QTreeWidgetItem *> itemList;
 
  822   itemList = mColormapTreeWidget->selectedItems();
 
  823   if ( itemList.isEmpty() )
 
  827   QTreeWidgetItem *firstItem = itemList.first();
 
  829   QColor currentColor = firstItem->data( ColorColumn, Qt::ItemDataRole::EditRole ).value<QColor>();
 
  831   if ( panel && panel->dockMode() )
 
  838       for ( QTreeWidgetItem *item : std::as_const( itemList ) )
 
  840         item->setData( ColorColumn, Qt::ItemDataRole::EditRole, newColor );
 
  846     panel->openPanel( colorWidget );
 
  852     if ( newColor.isValid() )
 
  854       for ( QTreeWidgetItem *item : std::as_const( itemList ) )
 
  856         item->setData( ColorColumn, Qt::ItemDataRole::EditRole, newColor );
 
  865 void QgsColorRampShaderWidget::changeOpacity()
 
  867   QList<QTreeWidgetItem *> itemList;
 
  868   itemList = mColormapTreeWidget->selectedItems();
 
  869   if ( itemList.isEmpty() )
 
  873   QTreeWidgetItem *firstItem = itemList.first();
 
  876   double oldOpacity = firstItem->data( ColorColumn, Qt::ItemDataRole::EditRole ).value<QColor>().alpha() / 255 * 100;
 
  877   double opacity = QInputDialog::getDouble( 
this, tr( 
"Opacity" ), tr( 
"Change color opacity [%]" ), oldOpacity, 0.0, 100.0, 0, &ok );
 
  880     int newOpacity = 
static_cast<int>( opacity / 100 * 255 );
 
  881     const auto constItemList = itemList;
 
  882     for ( QTreeWidgetItem *item : constItemList )
 
  884       QColor newColor = item->data( ColorColumn, Qt::ItemDataRole::EditRole ).value<QColor>();
 
  885       newColor.setAlpha( newOpacity );
 
  886       item->setData( ColorColumn, Qt::ItemDataRole::EditRole, newColor );
 
  894 void QgsColorRampShaderWidget::showLegendSettings()
 
  904       mLegendSettings = legendPanel->
settings();
 
  912     dialog.setWindowTitle( tr( 
"Legend Settings" ) );
 
  915       mLegendSettings = dialog.settings();
 
DataType
Raster data types.
@ Float32
Thirty two bit floating point (float)
@ CFloat64
Complex Float64.
@ Int16
Sixteen bit signed integer (qint16)
@ ARGB32_Premultiplied
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32_Premultiplied.
@ UInt16
Sixteen bit unsigned integer (quint16)
@ Byte
Eight bit unsigned integer (quint8)
@ UnknownDataType
Unknown or unspecified type.
@ ARGB32
Color, alpha, red, green, blue, 4 bytes the same as QImage::Format_ARGB32.
@ Int32
Thirty two bit signed integer (qint32)
@ Float64
Sixty four bit floating point (double)
@ CFloat32
Complex Float32.
@ UInt32
Thirty two bit unsigned integer (quint32)
static const double UI_SCALE_FACTOR
UI scaling factor.
static QColor getColor(const QColor &initialColor, QWidget *parent, const QString &title=QString(), bool allowOpacity=false)
Returns a color selection from a color dialog.
A dialog for configuring a QgsColorRampLegendNode (QgsColorRampLegendNodeSettings).
Settings for a color ramp legend node.
A ramp shader will color a raster pixel based on a list of values ranges in a ramp.
QList< QgsColorRampShader::ColorRampItem > colorRampItemList() const
Returns the custom colormap.
ClassificationMode classificationMode() const
Returns the classification mode.
const QgsColorRampLegendNodeSettings * legendSettings() const
Returns the color ramp shader legend settings.
Type colorRampType() const
Returns the color ramp type.
void setSourceColorRamp(QgsColorRamp *colorramp)
Set the source color ramp.
ClassificationMode
Classification modes used to create the color ramp shader.
@ EqualInterval
Uses equal interval.
@ Quantile
Uses quantile (i.e. equal pixel) count.
@ Continuous
Uses breaks from color palette.
void setClip(bool clip)
Sets whether the shader should not render values out of range.
bool clip() const
Returns whether the shader will clip values which are out of range.
QgsColorRamp * sourceColorRamp() const
Returns the source color ramp.
Type
Supported methods for color interpolation.
@ Interpolated
Interpolates the color between two class breaks linearly.
@ Discrete
Assigns the color of the higher class for every pixel between two class breaks.
@ Exact
Assigns the color of the exact matching value in the color ramp item list.
void setClassificationMode(ClassificationMode classificationMode)
Sets classification mode.
void setColorRampItemList(const QList< QgsColorRampShader::ColorRampItem > &list)
Sets a custom colormap.
void setColorRampType(QgsColorRampShader::Type colorRampType)
Sets the color ramp type.
void setLegendSettings(QgsColorRampLegendNodeSettings *settings)
Sets the color ramp shader legend settings.
A delegate for showing a color swatch in a list.
static QString ensureFileNameHasExtension(const QString &fileName, const QStringList &extensions)
Ensures that a fileName ends with an extension from the provided list of extensions.
Base class for raster data providers.
virtual QList< QgsColorRampShader::ColorRampItem > colorTable(int bandNo) const
Qgis::DataType dataType(int bandNo) const override=0
Returns data type for the band specified by number.
static bool parseColorMapFile(const QString &path, QList< QgsColorRampShader::ColorRampItem > &items, QgsColorRampShader::Type &type, QStringList &errors)
Parses an exported color map file at the specified path and extracts the stored color ramp items and ...
static bool saveColorMapFile(const QString &path, const QList< QgsColorRampShader::ColorRampItem > &items, QgsColorRampShader::Type type)
Exports a list of color ramp items and ramp shader type to a color map file at the specified path.
void setLabelPrecision(int labelPrecision)
Sets label precision to labelPrecision.
int labelPrecision() const
Returns label precision.
A rectangle specified with double values.
int significantDigits(const Qgis::DataType rasterDataType)
Returns the maximum number of significant digits a for the given rasterDataType.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
#define QgsDebugMsgLevel(str, level)