23#include "QItemSelectionModel"
28#ifdef ENABLE_MODELTEST
35 const QMap<QString, QString> &expressions )
38 QVBoxLayout *verticalLayout =
new QVBoxLayout();
39 verticalLayout->setContentsMargins( 0, 0, 0, 0 );
40 mTableView =
new QTableView();
41 verticalLayout->addWidget( mTableView );
42 setLayout( verticalLayout );
46#ifdef ENABLE_MODELTEST
47 new ModelTest( mModel,
this );
50 mTableView->setModel( mModel );
55 connect( mModel, &QgsFieldMappingModel::rowsInserted,
this, [ = ] { updateColumns(); } );
56 connect( mModel, &QgsFieldMappingModel::modelReset,
this, [ = ] { updateColumns(); } );
65 qobject_cast<QgsFieldMappingModel *>( mModel )->setDestinationEditable( editable );
71 return qobject_cast<QgsFieldMappingModel *>( mModel )->destinationEditable();
76 return qobject_cast<QgsFieldMappingModel *>( mModel );
96 return mTableView->selectionModel();
106 mSourceLayer = layer;
121 mTableView->scrollTo( index );
136 if ( ! mTableView->selectionModel()->hasSelection() )
139 std::list<int> rowsToRemove { selectedRows() };
140 rowsToRemove.reverse();
141 for (
const int row : rowsToRemove )
153 for (
int i = 0; i < mTableView->model()->rowCount(); ++i )
155 for (
int j = 0; j < mTableView->model()->columnCount(); j++ )
157 QModelIndex index = mTableView->model()->index( i, j );
158 mTableView->selectionModel()->select( index, QItemSelectionModel::Toggle );
165 if ( ! mTableView->selectionModel()->hasSelection() )
168 const std::list<int> rowsToMoveUp { selectedRows() };
169 for (
const int row : rowsToMoveUp )
181 if ( ! mTableView->selectionModel()->hasSelection() )
184 std::list<int> rowsToMoveDown { selectedRows() };
185 rowsToMoveDown.reverse();
186 for (
const int row : rowsToMoveDown )
196void QgsFieldMappingWidget::updateColumns()
198 for (
int i = 0; i < mModel->rowCount(); ++i )
204 for (
int i = 0; i < mModel->columnCount(); ++i )
206 mTableView->resizeColumnToContents( i );
210std::list<int> QgsFieldMappingWidget::selectedRows()
213 if ( mTableView->selectionModel()->hasSelection() )
215 const QModelIndexList constSelection { mTableView->selectionModel()->selectedIndexes() };
216 for (
const QModelIndex &index : constSelection )
218 rows.push_back( index.row() );
232QgsFieldMappingExpressionDelegate::QgsFieldMappingExpressionDelegate( QObject *parent )
233 : QStyledItemDelegate( parent )
237void QgsFieldMappingExpressionDelegate::setModelData( QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index )
const
240 if ( ! editorWidget )
245 const QString currentValue { editorWidget->
currentField( &isExpression, &isValid ) };
248 model->setData( index, currentValue, Qt::EditRole );
256void QgsFieldMappingExpressionDelegate::setEditorData( QWidget *editor,
const QModelIndex &index )
const
259 if ( ! editorWidget )
262 const QVariant value = index.model()->data( index, Qt::EditRole );
263 editorWidget->
setField( value.toString() );
266QWidget *QgsFieldMappingExpressionDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
270 editor->setAutoFillBackground(
true );
272 if (
const QgsFieldMappingModel *model = qobject_cast<const QgsFieldMappingModel *>( index.model() ) )
275 editor->
setFields( model->sourceFields() );
280 editor->
setFields( model->sourceFields() );
287 if (
QgsFieldMappingWidget *mappingWidget = qobject_cast< QgsFieldMappingWidget *>( QgsFieldMappingExpressionDelegate::parent() ) )
289 if ( mappingWidget->sourceLayer() )
290 editor->
setLayer( mappingWidget->sourceLayer() );
292 else if (
QgsAggregateMappingWidget *aggregateWidget = qobject_cast< QgsAggregateMappingWidget *>( QgsFieldMappingExpressionDelegate::parent() ) )
294 if ( aggregateWidget->sourceLayer() )
295 editor->
setLayer( aggregateWidget->sourceLayer() );
298 editor->
setField( index.model()->data( index, Qt::DisplayRole ).toString() );
302 [ = ](
const QString & fieldName )
304 Q_UNUSED( fieldName )
305 const_cast< QgsFieldMappingExpressionDelegate *
>( this )->emit commitData( editor );
315QgsFieldMappingTypeDelegate::QgsFieldMappingTypeDelegate( QObject *parent )
316 : QStyledItemDelegate( parent )
320QWidget *QgsFieldMappingTypeDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
323 QComboBox *editor =
new QComboBox( parent );
326 for (
int i = 0; i < typeList.size(); i++ )
328 editor->addItem(
QgsFields::iconForFieldType( typeList[i].mType, typeList[i].mSubType, typeList[i].mTypeName ), typeList[i].mTypeDesc );
329 editor->setItemData( i, typeList[i].mTypeName, Qt::UserRole );
332 const QgsFieldMappingModel *model { qobject_cast<const QgsFieldMappingModel *>( index.model() ) };
334 if ( model && !model->destinationEditable() )
336 editor->setEnabled(
false );
341 qOverload<int >( &QComboBox::currentIndexChanged ),
343 [ = ](
int currentIndex )
345 Q_UNUSED( currentIndex )
346 const_cast< QgsFieldMappingTypeDelegate *
>( this )->emit commitData( editor );
352void QgsFieldMappingTypeDelegate::setEditorData( QWidget *editor,
const QModelIndex &index )
const
354 QComboBox *editorWidget { qobject_cast<QComboBox *>( editor ) };
355 if ( ! editorWidget )
358 const QVariant value = index.model()->
data( index, Qt::EditRole );
359 editorWidget->setCurrentIndex( editorWidget->findData( value ) );
362void QgsFieldMappingTypeDelegate::setModelData( QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index )
const
364 QComboBox *editorWidget { qobject_cast<QComboBox *>( editor ) };
365 if ( ! editorWidget )
368 const QVariant currentValue = editorWidget->currentData( );
369 model->setData( index, currentValue, Qt::EditRole );
The QgsAggregateMappingModel holds mapping information for defining sets of aggregates of fields from...
Abstract interface for generating an expression context.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
The QgsFieldMappingModel holds mapping information for mapping from one set of QgsFields to another,...
@ SourceExpression
Expression.
@ DestinationType
Destination field type string.
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.
bool moveDown(const QModelIndex &index)
Moves up the field at index.
bool moveUp(const QModelIndex &index)
Moves down the field at index.
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.
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.
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.
Container of fields for a vector layer.
static QIcon iconForFieldType(QVariant::Type type, QVariant::Type subType=QVariant::Type::Invalid, const QString &typeString=QString())
Returns an icon corresponding to a field type.
Represents a vector layer which manages a vector based data sets.