22  : QAbstractTableModel( parent )
 
 
   52    const QList<QgsRasterAttributeTable::Field> &ratFields { mRat->
fields() };
 
   55      headers.push_back( f.name );
 
   60      headers.append( ratColorHeaderName() );
 
 
   69  if ( section < 0 || section >= hNames.count( ) )
 
   74  const QString fieldName { hNames.at( section ) };
 
   75  const bool isColor { 
hasColor() && section == hNames.count( ) - 1 };  
 
   79    return tr( 
"Virtual color field generated from the values in RGB(A) data columns" );
 
   90  return QStringLiteral( R
"HTML( 
   92                <dt>Role</dt><dd>%1</dd> 
   93                <dt>Type</dt><dd>%2</dd> 
   94                <dt>Description</dt><dd>%3</dd> 
   97                             QVariant::typeToName( field.type ), 
 
  107      *errorMessage = tr( 
"Raster Attribute Table is not set for this model." );
 
  111  return mRat->
isValid( errorMessage );
 
 
  116  return mRat && mRat->
isDirty( );
 
 
  122  if ( ! editChecks( errorMessage ) )
 
  131      *errorMessage = QObject::tr( 
"Invalid position '%1' for field insertion." ).arg( position );
 
  136  const int newPosition { std::clamp( position, 0, 
static_cast<int>( mRat->
fields().count( ) ) ) };
 
  139  const bool retVal { mRat->
insertField( newPosition, field, errorMessage ) };
 
 
  147  if ( ! editChecks( errorMessage ) )
 
  152  if ( position < 0 || position >= mRat->
fields().count() )
 
  156      *errorMessage = QObject::tr( 
"Invalid position '%1' for field removal." ).arg( position );
 
  162  const bool retVal { mRat->
removeField( mRat->
fields().at( position ).name, errorMessage ) };
 
 
  170  if ( ! editChecks( errorMessage ) )
 
  179      *errorMessage = tr( 
"Raster attribute table does not have color or ramp information." );
 
  186  const QList<QgsRasterAttributeTable::Field> ratFields { mRat->
fields() };
 
  189    if ( f.isColor() || f.isRamp() )
 
 
  204  if ( ! editChecks( errorMessage ) )
 
  209  if ( position < 0 || position > mRat->
data().count( ) )
 
  213      *errorMessage = tr( 
"Position is not valid or the table is empty." );
 
  219  const bool retVal { mRat->
insertRow( position, rowData, errorMessage ) };
 
 
  226  if ( ! editChecks( errorMessage ) )
 
  235      *errorMessage = QObject::tr( 
"Invalid position '%1' for color insertion." ).arg( position );
 
  241  const bool retVal { mRat->
insertColor( position, errorMessage ) };
 
 
  248  if ( ! editChecks( errorMessage ) )
 
  257      *errorMessage = QObject::tr( 
"Invalid position '%1' for color ramp insertion." ).arg( position );
 
  263  const bool retVal { mRat->
insertRamp( position, errorMessage ) };
 
 
  270  if ( ! editChecks( errorMessage ) )
 
  275  if ( position < 0 || position >= mRat->
data().count( ) )
 
  279      *errorMessage = tr( 
"Position is not valid or the table is empty." );
 
  285  const bool retVal { mRat->
removeRow( position, errorMessage ) };
 
 
  290bool QgsRasterAttributeTableModel::editChecks( QString *errorMessage )
 
  296      *errorMessage = QObject::tr( 
"Raster Attribute Table is not set for this model." );
 
  305      *errorMessage = QObject::tr( 
"Raster Attribute Table is not editable." );
 
  313QString QgsRasterAttributeTableModel::ratColorHeaderName()
 const 
  315  return tr( 
"Color" );
 
  320  return ( !parent.isValid() && mRat ) ? mRat->
data().count() : 0;
 
 
  325  return ( ! parent.isValid() && mRat ) ? ( mRat->
fields().count() + ( mRat->
hasColor() || mRat->
hasRamp() ? 1 : 0 ) ) : 0;
 
 
  332    const QString fieldName { 
headerNames().at( index.column() ) };
 
  336    if ( ! isColorOrRamp && ! ok )
 
  344        case Qt::ItemDataRole::ForegroundRole:
 
  347          const QColor tempColor { mRat->
color( index.row() ) };
 
  348          const double darkness { 1 - ( 0.299 * tempColor.red() + 0.587 * tempColor.green() + 0.114 * tempColor.blue() ) / 255};
 
  349          return darkness > 0.5 ? QColor( Qt::GlobalColor::white ) : QColor( Qt::GlobalColor::black );
 
  351        case Qt::ItemDataRole::EditRole:
 
  352        case Qt::ItemDataRole::BackgroundRole:
 
  353          return mRat->
color( index.row() );
 
  354        case Qt::ItemDataRole::DisplayRole:
 
  355          return mRat->
color( index.row() ).name();
 
  360    else if ( isColorOrRamp && 
hasRamp() )
 
  364        case Qt::ItemDataRole::BackgroundRole:
 
  378        case Qt::ItemDataRole::EditRole:
 
  380          return QVariant::fromValue( mRat->
ramp( index.row() ) );
 
  386    else if ( role == Qt::ItemDataRole::TextAlignmentRole && field.type != QVariant::String )
 
  388      return QVariant( Qt::AlignmentFlag::AlignRight | Qt::AlignmentFlag::AlignVCenter );
 
  390    else if ( role == Qt::ItemDataRole::ToolTipRole && ( isColorOrRamp ) )
 
  392      return tr( 
"This data is part of a color definition: click on '%1' column to edit." ).arg( ratColorHeaderName() );
 
  394    else if ( role == Qt::ItemDataRole::DisplayRole || role == Qt::ItemDataRole::EditRole )
 
  396      return mRat->
data().at( index.row() ).at( index.column() );
 
  398    else if ( role == Qt::ItemDataRole::FontRole && ( isColorOrRamp ) )
 
  401      font.setItalic( 
true );
 
 
  410  if ( mRat && index.
isValid() && role == Qt::ItemDataRole::EditRole )
 
  412    const QString fieldName { 
headerNames().at( index.column() ) };
 
  416    if ( ! isColorOrRamp && ! ok )
 
  422      if ( ! value.canConvert( QVariant::Type::Color ) || ! mRat->
setColor( index.row(), value.value<QColor>( ) ) )
 
  426      const QModelIndex colorColIdx { QgsRasterAttributeTableModel::index( index.row(), 
columnCount( QModelIndex() ) - 1, QModelIndex() )};
 
  427      emit dataChanged( colorColIdx, colorColIdx );
 
  429      const QList<QgsRasterAttributeTable::Field> &ratFields { mRat->
fields() };
 
  430      for ( 
int fIdx = 0; fIdx < ratFields.count(); ++fIdx )
 
  432        if ( ratFields[ fIdx ].isColor() )
 
  434          const QModelIndex fieldColIdx { QgsRasterAttributeTableModel::index( index.row(), fIdx, QModelIndex() )};
 
  435          emit dataChanged( fieldColIdx, fieldColIdx );
 
  440    else if ( 
hasRamp() && isColorOrRamp )
 
  443      if ( ! mRat->
setRamp( index.row(), ramp.color1(), ramp.color2() ) )
 
  447      const QModelIndex colorColIdx { QgsRasterAttributeTableModel::index( index.row(), 
columnCount( QModelIndex() ) - 1, QModelIndex() )};
 
  448      emit dataChanged( colorColIdx, colorColIdx );
 
  450      const QList<QgsRasterAttributeTable::Field> &ratFields { mRat->
fields() };
 
  451      for ( 
int fIdx = 0; fIdx < ratFields.count(); ++fIdx )
 
  453        if ( ratFields[ fIdx ].isRamp() )
 
  455          const QModelIndex fieldColIdx { QgsRasterAttributeTableModel::index( index.row(), fIdx, QModelIndex() )};
 
  456          emit dataChanged( fieldColIdx, fieldColIdx );
 
  463      const bool retVal { mRat->
setValue( index.row(), index.column(), value ) };
 
  466        const QModelIndex fieldColIdx { QgsRasterAttributeTableModel::index( index.row(), index.column(), QModelIndex() )};
 
  467        emit dataChanged( fieldColIdx, fieldColIdx );
 
 
  477  if ( orientation == Qt::Orientation::Horizontal )
 
  480    if ( section < hNames.length() )
 
  484        case Qt::ItemDataRole::DisplayRole:
 
  486          return hNames.at( section );
 
  488        case Qt::ItemDataRole::ToolTipRole:
 
  493          return QAbstractTableModel::headerData( section, orientation, role );
 
  497  return QAbstractTableModel::headerData( section, orientation, role );
 
 
  505    if ( index.isValid() )
 
  507      flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
 
  510        if ( index.column() < mRat->
fields().count( ) )
 
  512          const QList<QgsRasterAttributeTable::Field> fields = mRat->
fields();
 
  514          if ( ! field.isColor() && ! field.isRamp() )
 
  516            flags |= Qt::ItemIsEditable;
 
  521          flags |= Qt::ItemIsEditable;
 
  527  return Qt::NoItemFlags;
 
 
RasterAttributeTableFieldUsage
Flags which control behavior of raster renderers.
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
QStringList headerNames() const
Returns all the header names, including the "virtual" color header if the Raster Attribute Table has ...
bool removeColorOrRamp(QString *errorMessage=nullptr)
Removes all color or ramp information, optionally reporting any error in errorMessage,...
bool hasRamp() const
Returns true if the Raster Attribute Table has ramp information.
int rowCount(const QModelIndex &parent) const override
bool isDirty()
Returns true if the Raster Attribute Table was modified since it was last saved or read.
bool hasColor() const
Returns true if the Raster Attribute Table has color information.
bool removeField(const int position, QString *errorMessage=nullptr)
Remove the field at given position, optionally reporting any error in errorMessage,...
bool insertColor(int position, QString *errorMessage=nullptr)
Create RGBA fields and inserts them at position, optionally reporting any error in errorMessage,...
bool insertRow(const int position, const QVariantList &rowData, QString *errorMessage=nullptr)
Inserts a new row before position, optionally reporting any error in errorMessage,...
int columnCount(const QModelIndex &parent) const override
bool editable() const
Returns true if the Raster Attribute Table is editable.
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
QString headerTooltip(const int section) const
Returns the tooltip for the given section.
bool insertField(const int position, const QString &name, const Qgis::RasterAttributeTableFieldUsage usage, const QVariant::Type type, QString *errorMessage=nullptr)
Inserts a field at the given position.
bool setData(const QModelIndex &index, const QVariant &value, int role) override
void setEditable(bool editable)
Sets the Raster Attribute Table editable state to editable.
QgsRasterAttributeTableModel(QgsRasterAttributeTable *rat, QObject *parent=nullptr)
Creates a new QgsRasterAttributeTableModel from raster attribute table rat and optional parent.
bool isValid(QString *errorMessage=nullptr)
Checks if the Raster Attribute Table is valid, optionally returns validation errors in errorMessage.
QVariant data(const QModelIndex &index, int role) const override
bool insertRamp(int position, QString *errorMessage=nullptr)
Create RGBA minimum and maximum fields and inserts them at position, optionally reporting any error i...
Qt::ItemFlags flags(const QModelIndex &index) const override
bool removeRow(const int position, QString *errorMessage=nullptr)
Removes the row at position, optionally reporting any error in errorMessage, returns true on success.
The Field class represents a Raster Attribute Table field, including its name, usage and type.
The QgsRasterAttributeTable class represents a Raster Attribute Table (RAT).
const QgsRasterAttributeTable::Field fieldByName(const QString name, bool *ok=nullptr) const
Returns a field by name or a default constructed field with empty name if the field is not found.
bool isDirty() const
Returns true if the Raster Attribute Table was modified from its last reading from the storage.
bool setColor(const int row, const QColor &color)
Sets the color for the row at rowIndex to color.
QgsGradientColorRamp ramp(int row) const
Returns the gradient color ramp of the rat row or a default constructed gradient if row does not exis...
bool insertField(int position, const QgsRasterAttributeTable::Field &field, QString *errorMessage=nullptr)
Inserts a new field at position, optionally reporting any error in errorMessage, returns true on succ...
bool hasColor() const
Returns true if the Raster Attribute Table has color RGBA information.
bool setValue(const int row, const int column, const QVariant &value)
Sets the value for row and column.
QList< QgsRasterAttributeTable::Field > fields() const
Returns the Raster Attribute Table fields.
bool removeRow(int position=0, QString *errorMessage=nullptr)
Removes the row in the Raster Attribute Table at position, optionally reporting any error in errorMes...
static QHash< Qgis::RasterAttributeTableFieldUsage, QgsRasterAttributeTable::UsageInformation > usageInformation()
Returns information about supported Raster Attribute Table usages.
bool insertRow(int position, const QVariantList &rowData, QString *errorMessage=nullptr)
Inserts a row of rowData in the Raster Attribute Table at position, optionally reporting any error in...
bool insertColor(int position, QString *errorMessage=nullptr)
Create RGBA fields and inserts them at position, optionally reporting any error in errorMessage,...
bool isValid(QString *errorMessage=nullptr) const
Returns true if the Raster Attribute Table is valid, optionally reporting validity checks results in ...
const QList< QList< QVariant > > data() const
Returns the Raster Attribute Table rows.
bool setRamp(const int row, const QColor &colorMin, const QColor &colorMax)
Sets the color ramp for the row at rowIndex to colorMin and colorMax.
PRIVATE QColor color(int row) const
Returns the color of the rat row or an invalid color if row does not exist or if there is no color de...
static QString usageName(const Qgis::RasterAttributeTableFieldUsage fieldusage)
Returns the translated human readable name of fieldUsage.
bool hasRamp() const
Returns true if the Raster Attribute Table has ramp RGBA information.
bool insertRamp(int position, QString *errorMessage=nullptr)
Create RGBA minimum and maximum fields and inserts them at position, optionally reporting any error i...
bool removeField(const QString &name, QString *errorMessage=nullptr)
Removes the field with name, optionally reporting any error in errorMessage, returns true on success.