24     const QMap<QString, QString> &expressions,
 
   26   : QAbstractTableModel( parent )
 
   27   , mSourceFields( sourceFields )
 
   28   , mExpressionContextGenerator( new ExpressionContextGenerator( mSourceFields ) )
 
   35   if ( role == Qt::DisplayRole )
 
   37     switch ( orientation )
 
   45             return tr( 
"Source Expression" );
 
   57             return tr( 
"Length" );
 
   61             return tr( 
"Precision" );
 
   65             return tr( 
"Constraints" );
 
   86   if ( parent.isValid() )
 
   88   return mMapping.count();
 
   93   if ( parent.isValid() )
 
  100   if ( index.isValid() )
 
  103     const Field &f { mMapping.at( index.row() ) };
 
  105     const QgsFieldConstraints::Constraints constraints { fieldConstraints( f.field ) };
 
  109       case Qt::DisplayRole:
 
  120             return f.field.displayName();
 
  124             return f.field.typeName();
 
  128             return f.field.length();
 
  132             return f.field.precision();
 
  136             return constraints != 0 ? tr( 
"Constraints active" ) : QString();
 
  141       case Qt::ToolTipRole:
 
  146           QStringList constraintDescription;
 
  147           if ( constraints.testFlag( QgsFieldConstraints::Constraint::ConstraintUnique ) )
 
  149             constraintDescription.push_back( tr( 
"Unique" ) );
 
  151           if ( constraints.testFlag( QgsFieldConstraints::Constraint::ConstraintNotNull ) )
 
  153             constraintDescription.push_back( tr( 
"Not null" ) );
 
  155           if ( constraints.testFlag( QgsFieldConstraints::Constraint::ConstraintExpression ) )
 
  157             constraintDescription.push_back( tr( 
"Expression" ) );
 
  159           return constraintDescription.join( QLatin1String( 
"<br>" ) );
 
  163       case Qt::BackgroundRole:
 
  165         if ( constraints != 0 )
 
  167           return QBrush( QColor( 255, 224, 178 ) );
 
  178   if ( index.isValid() &&
 
  182     return Qt::ItemFlags( Qt::ItemIsSelectable |
 
  186   return Qt::ItemFlags();
 
  191   if ( index.isValid() )
 
  193     if ( role == Qt::EditRole )
 
  195       Field &f = mMapping[index.row()];
 
  211           setFieldTypeFromName( f.
field, value.toString() );
 
  217           const int length { value.toInt( &ok ) };
 
  225           const int precision { value.toInt( &ok ) };
 
  235       emit dataChanged( index, index );
 
  245 QgsFieldConstraints::Constraints QgsFieldMappingModel::fieldConstraints( 
const QgsField &
field )
 const 
  247   QgsFieldConstraints::Constraints constraints;
 
  266 bool QgsFieldMappingModel::moveUpOrDown( 
const QModelIndex &index, 
bool up )
 
  268   if ( ! index.isValid() && index.model() == 
this )
 
  272   const int row { up ? index.row() - 1 : index.row() };
 
  274   if ( row < 0 || row + 1 >= 
rowCount( QModelIndex() ) )
 
  278   beginMoveRows( QModelIndex( ), row, row, QModelIndex(), row + 2 );
 
  279 #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0) 
  280   mMapping.swap( row, row + 1 );
 
  282   mMapping.swapItemsAt( row, row + 1 );
 
  288 QString QgsFieldMappingModel::findExpressionForDestinationField( 
const QgsFieldMappingModel::Field &f, QStringList &excludedFieldNames )
 
  292   for ( 
const QgsField &sf : std::as_const( mSourceFields ) )
 
  296       excludedFieldNames.push_back( sf.name() );
 
  301   for ( 
const QgsField &sf : std::as_const( mSourceFields ) )
 
  303     if ( excludedFieldNames.contains( sf.name() ) || sf.type() != f.
field.
type() )
 
  305     excludedFieldNames.push_back( sf.name() );
 
  314   if ( mExpressionContextGenerator )
 
  315     mExpressionContextGenerator->setSourceFields( mSourceFields );
 
  316   QStringList usedFields;
 
  318   for ( 
const Field &f : std::as_const( mMapping ) )
 
  325   for ( 
auto it = mMapping.begin(); it != mMapping.end(); ++it )
 
  327     if ( it->expression.isEmpty() )
 
  329       const QString expression { findExpressionForDestinationField( *it, usedFields ) };
 
  330       if ( ! expression.isEmpty() )
 
  331         it->expression = expression;
 
  339   return mExpressionContextGenerator.get();
 
  344   mExpressionContextGenerator->setBaseExpressionContextGenerator( generator );
 
  348     const QMap<QString, QString> &expressions )
 
  353   QStringList usedFields;
 
  354   for ( 
const QgsField &df : destinationFields )
 
  360     if ( expressions.contains( f.
field.
name() ) )
 
  365       if ( exp.isField() &&
 
  366            mSourceFields.
names().contains( qgis::setToList( exp.referencedColumns() ).first() ) )
 
  368         usedFields.push_back( qgis::setToList( exp.referencedColumns() ).first() );
 
  373       const QString expression { findExpressionForDestinationField( f, usedFields ) };
 
  374       if ( ! expression.isEmpty() )
 
  377     mMapping.push_back( f );
 
  384   return mDestinationEditable;
 
  394   static const QMap<QVariant::Type, QString> sDataTypes
 
  411   static const QList<QgsVectorDataProvider::NativeType> sDataTypes =
 
  428 const QString QgsFieldMappingModel::qgsFieldToTypeName( 
const QgsField &
field )
 
  431   for ( 
const auto &type : types )
 
  435       return type.mTypeName;
 
  441 void QgsFieldMappingModel::setFieldTypeFromName( 
QgsField &
field, 
const QString &name )
 
  444   for ( 
const auto &type : types )
 
  446     if ( type.mTypeName == name )
 
  463   QMap< QString, QgsProperty > fieldMap;
 
  467     const bool isField = exp.
isField();
 
  468     fieldMap.insert( 
field.originalName, isField
 
  478   for ( 
int i = 0; i < mMapping.count(); ++i )
 
  480     Field &f = mMapping[i];
 
  513   const int lastRow { 
rowCount( QModelIndex( ) ) };
 
  514   beginInsertRows( QModelIndex(), lastRow, lastRow );
 
  520   mMapping.push_back( f );
 
  526   if ( index.isValid() && index.model() == 
this && index.row() < 
rowCount( QModelIndex() ) )
 
  528     beginRemoveRows( QModelIndex(), index.row(), index.row() );
 
  529     mMapping.removeAt( index.row() );
 
  541   return moveUpOrDown( index );
 
  546   return moveUpOrDown( index, 
false );
 
  549 QgsFieldMappingModel::ExpressionContextGenerator::ExpressionContextGenerator( 
const QgsFields &sourceFields )
 
  550   : mSourceFields( sourceFields )
 
  554 QgsExpressionContext QgsFieldMappingModel::ExpressionContextGenerator::createExpressionContext()
 const 
  556   if ( mBaseGenerator )
 
  559     std::unique_ptr< QgsExpressionContextScope > fieldMappingScope = std::make_unique< QgsExpressionContextScope >( tr( 
"Field Mapping" ) );
 
  560     fieldMappingScope->setFields( mSourceFields );
 
  578   mBaseGenerator = generator;
 
  581 void QgsFieldMappingModel::ExpressionContextGenerator::setSourceFields( 
const QgsFields &fields )
 
  583   mSourceFields = fields;
 
Abstract interface for generating an expression context.
 
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
 
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the context.
 
An expression node which takes it value from a feature's field.
 
QString name() const
The name of the column.
 
Class for parsing and evaluation of expressions (formerly called "search strings").
 
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required.
 
bool isField() const
Checks whether an expression consists only of a single field reference.
 
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
 
const QgsExpressionNode * rootNode() const
Returns the root node of the expression.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
void setValid(bool validity)
Sets the validity of the feature.
 
Stores information about constraints which may be present on a field.
 
@ ConstraintStrengthHard
Constraint must be honored before feature can be accepted.
 
@ ConstraintNotNull
Field may not be null.
 
@ ConstraintUnique
Field must have a unique value.
 
@ ConstraintExpression
Field has an expression constraint set. See constraintExpression().
 
void setDestinationEditable(bool editable)
Sets the destination fields editable state to editable.
 
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
 
ColumnDataIndex
The ColumnDataIndex enum represents the column index for the view.
 
@ SourceExpression
Expression.
 
@ DestinationPrecision
Destination field precision.
 
@ DestinationConstraints
Destination field constraints.
 
@ DestinationName
Destination field name.
 
@ DestinationType
Destination field type string.
 
@ DestinationLength
Destination field length.
 
Qt::ItemFlags flags(const QModelIndex &index) const override
 
static Q_DECL_DEPRECATED const QMap< QVariant::Type, QString > dataTypes()
Returns a static map of supported data types.
 
QgsFields sourceFields() const
Returns a list of source fields.
 
int columnCount(const QModelIndex &parent=QModelIndex()) const override
 
bool removeField(const QModelIndex &index)
Removes the field at index from the model, returns true on success.
 
void appendField(const QgsField &field, const QString &expression=QString())
Appends a new field to the model, with an optional expression.
 
QMap< QString, QgsProperty > fieldPropertyMap() const
Returns a map of destination field name to QgsProperty definition for field value,...
 
QList< QgsFieldMappingModel::Field > mapping() const
Returns a list of Field objects representing the current status of the model.
 
QgsFieldMappingModel(const QgsFields &sourceFields=QgsFields(), const QgsFields &destinationFields=QgsFields(), const QMap< QString, QString > &expressions=QMap< QString, QString >(), QObject *parent=nullptr)
Constructs a QgsFieldMappingModel from a set of sourceFields and destinationFields,...
 
bool moveDown(const QModelIndex &index)
Moves up the field at index.
 
bool moveUp(const QModelIndex &index)
Moves down the field at index.
 
int rowCount(const QModelIndex &parent=QModelIndex()) const override
 
QVariant data(const QModelIndex &index, int role) const override
 
void setBaseExpressionContextGenerator(const QgsExpressionContextGenerator *generator)
Sets the base expression context generator, which will generate the expression contexts for expressio...
 
static const QList< QgsVectorDataProvider::NativeType > supportedDataTypes()
Returns a static list of supported data types.
 
QgsExpressionContextGenerator * contextGenerator() const
Returns the context generator with the source fields.
 
void setDestinationFields(const QgsFields &destinationFields, const QMap< QString, QString > &expressions=QMap< QString, QString >())
Set destination fields to destinationFields, initial values for the expressions can be optionally spe...
 
void setSourceFields(const QgsFields &sourceFields)
Set source fields to sourceFields.
 
bool setData(const QModelIndex &index, const QVariant &value, int role) override
 
bool destinationEditable() const
Returns true if the destination fields are editable.
 
void setFieldPropertyMap(const QMap< QString, QgsProperty > &map)
Sets a map of destination field name to QgsProperty definition for field value.
 
Encapsulate a field in an attribute table or data source.
 
void setPrecision(int precision)
Set the field precision.
 
void setName(const QString &name)
Set the field name.
 
void setLength(int len)
Set the field length.
 
QVariant::Type subType() const
If the field is a collection, gets its element's type.
 
void setSubType(QVariant::Type subType)
If the field is a collection, set its element's type.
 
void setType(QVariant::Type type)
Set variant type.
 
QgsFieldConstraints constraints
 
void setTypeName(const QString &typeName)
Set the field type.
 
Container of fields for a vector layer.
 
QStringList names() const
Returns a list with field names.
 
A store for object properties.
 
@ ExpressionBasedProperty
Expression based property (QgsExpressionBasedProperty)
 
@ StaticProperty
Static property (QgsStaticProperty)
 
@ FieldBasedProperty
Field based property (QgsFieldBasedProperty)
 
@ InvalidProperty
Invalid (not set) property.
 
QString expressionString() const
Returns the expression used for the property value.
 
QString field() const
Returns the current field name the property references.
 
QVariant value(const QgsExpressionContext &context, const QVariant &defaultValue=QVariant(), bool *ok=nullptr) const
Calculates the current value of the property, including any transforms which are set for the property...
 
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
 
QVariant staticValue() const
Returns the current static value for the property.
 
Type propertyType() const
Returns the property type.
 
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
 
static QString typeToDisplayString(QVariant::Type type, QVariant::Type subType=QVariant::Type::Invalid)
Returns a user-friendly translated string representing a QVariant type.
 
The Field struct holds information about a mapped field.
 
QgsField field
The field in its current status (it might have been renamed)
 
QString expression
The expression for the mapped field from the source fields.
 
QString originalName
The original name of the field.