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.