18#include "moc_qgsfieldmappingmodel.cpp" 
   24  : QAbstractTableModel( parent )
 
   25  , mNativeTypes( supportedDataTypes() )
 
   26  , mSourceFields( sourceFields )
 
   27  , mExpressionContextGenerator( new ExpressionContextGenerator( mSourceFields ) )
 
 
   39  if ( role == Qt::DisplayRole )
 
   41    switch ( orientation )
 
   49            return tr( 
"Source Expression" );
 
   61            return tr( 
"Length" );
 
   65            return tr( 
"Precision" );
 
   69            return tr( 
"Constraints" );
 
   77            return tr( 
"Comment" );
 
 
   98  if ( parent.isValid() )
 
  100  return mMapping.count();
 
 
  105  if ( parent.isValid() )
 
 
  112  if ( index.isValid() )
 
  115    const Field &f { mMapping.at( index.row() ) };
 
  121      case Qt::DisplayRole:
 
  132            return f.field.displayNameWithAlias();
 
  136            return f.field.typeName();
 
  140            return f.field.length();
 
  144            return f.field.precision();
 
  148            return constraints != 0 ? tr( 
"Constraints active" ) : QString();
 
  152            return f.field.alias();
 
  156            return f.field.comment();
 
  161      case Qt::ToolTipRole:
 
  165          QStringList constraintDescription;
 
  168            constraintDescription.push_back( tr( 
"Unique" ) );
 
  172            constraintDescription.push_back( tr( 
"Not null" ) );
 
  176            constraintDescription.push_back( tr( 
"Expression" ) );
 
  178          return constraintDescription.join( QLatin1String( 
"<br>" ) );
 
  182      case Qt::BackgroundRole:
 
  184        if ( constraints != 0 )
 
  186          return QBrush( QColor( 255, 224, 178 ) );
 
 
  202    return Qt::ItemFlags( Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled );
 
  204  return Qt::ItemFlags();
 
 
  209  if ( index.isValid() )
 
  211    if ( role == Qt::EditRole )
 
  213      Field &f = mMapping[index.row()];
 
  229          setFieldTypeFromName( f.
field, value.toString() );
 
  235          const int length { value.toInt( &ok ) };
 
  243          const int precision { value.toInt( &ok ) };
 
  264      emit dataChanged( index, index );
 
 
  292bool QgsFieldMappingModel::moveUpOrDown( 
const QModelIndex &index, 
bool up )
 
  294  if ( !index.isValid() && index.model() == 
this )
 
  298  const int row { up ? index.row() - 1 : index.row() };
 
  300  if ( row < 0 || row + 1 >= 
rowCount( QModelIndex() ) )
 
  304  beginMoveRows( QModelIndex(), row, row, QModelIndex(), row + 2 );
 
  305  mMapping.swapItemsAt( row, row + 1 );
 
  310QString QgsFieldMappingModel::findExpressionForDestinationField( 
const QgsFieldMappingModel::Field &f, QStringList &excludedFieldNames )
 
  314  for ( 
const QgsField &sf : std::as_const( mSourceFields ) )
 
  318      excludedFieldNames.push_back( sf.name() );
 
  323  for ( 
const QgsField &sf : std::as_const( mSourceFields ) )
 
  325    if ( excludedFieldNames.contains( sf.name() ) || sf.type() != f.
field.
type() )
 
  327    excludedFieldNames.push_back( sf.name() );
 
  336  if ( mExpressionContextGenerator )
 
  337    mExpressionContextGenerator->setSourceFields( mSourceFields );
 
  338  QStringList usedFields;
 
  340  for ( 
const Field &f : std::as_const( mMapping ) )
 
  347  for ( 
auto it = mMapping.begin(); it != mMapping.end(); ++it )
 
  349    if ( it->expression.isEmpty() )
 
  351      const QString expression { findExpressionForDestinationField( *it, usedFields ) };
 
  352      if ( !expression.isEmpty() )
 
  353        it->expression = expression;
 
 
  361  return mExpressionContextGenerator.get();
 
 
  366  mExpressionContextGenerator->setBaseExpressionContextGenerator( generator );
 
 
  374  QStringList usedFields;
 
  375  for ( 
const QgsField &df : destinationFields )
 
  381    if ( expressions.contains( f.
field.
name() ) )
 
  386      if ( exp.isField() && mSourceFields.
names().contains( qgis::setToList( exp.referencedColumns() ).constFirst() ) )
 
  388        usedFields.push_back( qgis::setToList( exp.referencedColumns() ).constFirst() );
 
  393      const QString expression { findExpressionForDestinationField( f, usedFields ) };
 
  394      if ( !expression.isEmpty() )
 
  397    mMapping.push_back( f );
 
 
  404  return mDestinationEditable;
 
 
  414  static const QMap<QMetaType::Type, QString> sDataTypes {
 
 
  446QString QgsFieldMappingModel::qgsFieldToTypeName( 
const QgsField &field )
 const 
  450    if ( type.mType == field.
type() && type.mSubType == field.
subType() )
 
  452      return type.mTypeName;
 
  459    if ( type.mType == field.
type() && type.mSubType == field.
subType() )
 
  461      return type.mTypeName;
 
  468  if ( field.
type() == QMetaType::Type::Int )
 
  472      if ( type.mType == QMetaType::Type::LongLong )
 
  474        return type.mTypeName;
 
  479  if ( field.
type() == QMetaType::Type::UInt )
 
  483      if ( type.mType == QMetaType::Type::ULongLong || type.mType == QMetaType::Type::LongLong )
 
  485        return type.mTypeName;
 
  490  if ( field.
type() == QMetaType::Type::Float || field.
type() == QMetaType::Type::Int )
 
  494      if ( type.mType == QMetaType::Type::Double )
 
  496        return type.mTypeName;
 
  501  if ( field.
type() == QMetaType::Type::Float
 
  502       || field.
type() == QMetaType::Type::Double
 
  503       || field.
type() == QMetaType::Type::Int
 
  504       || field.
type() == QMetaType::Type::UInt
 
  505       || field.
type() == QMetaType::Type::LongLong
 
  506       || field.
type() == QMetaType::Type::ULongLong
 
  507       || field.
type() == QMetaType::Type::QDate
 
  508       || field.
type() == QMetaType::Type::QTime
 
  509       || field.
type() == QMetaType::Type::QDateTime )
 
  513      if ( type.mType == QMetaType::Type::QString )
 
  515        return type.mTypeName;
 
  523void QgsFieldMappingModel::setFieldTypeFromName( 
QgsField &field, 
const QString &name )
 const 
  527    if ( type.mTypeName == name )
 
  544  QMap<QString, QgsProperty> fieldMap;
 
  548    const bool isField = exp.
isField();
 
 
  557  for ( 
int i = 0; i < mMapping.count(); ++i )
 
  559    Field &f = mMapping[i];
 
 
  592  const int lastRow { 
rowCount( QModelIndex() ) };
 
  593  beginInsertRows( QModelIndex(), lastRow, lastRow );
 
  599  mMapping.push_back( f );
 
 
  605  if ( index.isValid() && index.model() == 
this && index.row() < 
rowCount( QModelIndex() ) )
 
  607    beginRemoveRows( QModelIndex(), index.row(), index.row() );
 
  608    mMapping.removeAt( index.row() );
 
 
  620  return moveUpOrDown( index );
 
 
  625  return moveUpOrDown( index, 
false );
 
 
  628QgsFieldMappingModel::ExpressionContextGenerator::ExpressionContextGenerator( 
const QgsFields &sourceFields )
 
  629  : mSourceFields( sourceFields )
 
  633QgsExpressionContext QgsFieldMappingModel::ExpressionContextGenerator::createExpressionContext()
 const 
  635  if ( mBaseGenerator )
 
  638    auto fieldMappingScope = std::make_unique<QgsExpressionContextScope>( tr( 
"Field Mapping" ) );
 
  639    fieldMappingScope->setFields( mSourceFields );
 
  657  mBaseGenerator = generator;
 
  660void QgsFieldMappingModel::ExpressionContextGenerator::setSourceFields( 
const QgsFields &fields )
 
  662  mSourceFields = fields;
 
@ Invalid
Invalid (not set) property.
 
@ Field
Field based property.
 
@ Expression
Expression based property.
 
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 its value from a feature's field.
 
QString name() const
The name of the column.
 
Handles 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().
 
QFlags< Constraint > Constraints
 
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.
 
@ DestinationAlias
Destination alias.
 
@ SourceExpression
Expression.
 
@ DestinationPrecision
Destination field precision.
 
@ DestinationComment
Destination comment.
 
@ 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
 
QgsFields sourceFields() const
Returns a list of source fields.
 
void setNativeTypes(const QList< QgsVectorDataProvider::NativeType > &nativeTypes)
Sets the list of nativeTypes supported by a data provider.
 
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
 
static Q_DECL_DEPRECATED const QMap< QMetaType::Type, QString > dataTypes()
Returns a static map of supported data types.
 
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 setAlias(const QString &alias)
Sets the alias for the field (the friendly displayed name of the field ).
 
void setPrecision(int precision)
Set the field precision.
 
void setSubType(QMetaType::Type subType)
If the field is a collection, set its element's type.
 
void setName(const QString &name)
Set the field name.
 
void setComment(const QString &comment)
Set the field comment.
 
void setType(QMetaType::Type type)
Set variant type.
 
void setLength(int len)
Set the field length.
 
QMetaType::Type subType() const
If the field is a collection, gets its element's type.
 
QgsFieldConstraints constraints
 
void setTypeName(const QString &typeName)
Set the field type.
 
Container of fields for a vector layer.
 
A store for object properties.
 
QString expressionString() const
Returns the expression used for the property value.
 
Qgis::PropertyType propertyType() const
Returns the property type.
 
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.
 
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
 
static QString typeToDisplayString(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType)
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.