25#include <QItemSelectionModel>
29#include "moc_qgsfieldmappingwidget.cpp"
31#ifdef ENABLE_MODELTEST
36 QWidget *parent,
const QgsFields &sourceFields,
const QgsFields &destinationFields,
const QMap<QString, QString> &expressions,
const QList< QgsVectorDataProvider::NativeType > &nativeTypes
40 QVBoxLayout *verticalLayout =
new QVBoxLayout();
41 verticalLayout->setContentsMargins( 0, 0, 0, 0 );
42 mTableView =
new QTableView();
43 verticalLayout->addWidget( mTableView );
44 setLayout( verticalLayout );
47 mModel->setNativeTypes( nativeTypes );
49#ifdef ENABLE_MODELTEST
50 new ModelTest( mModel,
this );
53 mTableView->setModel( mModel );
55 mTypeDelegate =
new QgsFieldMappingTypeDelegate( nativeTypes, mTableView );
59 connect( mModel, &QgsFieldMappingModel::rowsInserted,
this, [
this] { updateColumns(); } );
60 connect( mModel, &QgsFieldMappingModel::modelReset,
this, [
this] { updateColumns(); } );
69 qobject_cast<QgsFieldMappingModel *>( mModel )->setDestinationEditable( editable );
75 return qobject_cast<QgsFieldMappingModel *>( mModel )->destinationEditable();
80 return qobject_cast<QgsFieldMappingModel *>( mModel );
100 return mTableView->selectionModel();
110 mSourceLayer = layer;
125 mTypeDelegate->setNativeTypes( nativeTypes );
126 mModel->setNativeTypes( nativeTypes );
131 mTableView->scrollTo( index );
146 if ( !mTableView->selectionModel()->hasSelection() )
149 std::list<int> rowsToRemove { selectedRows() };
150 rowsToRemove.reverse();
151 for (
const int row : rowsToRemove )
153 if ( !
model()->removeField(
model()->index( row, 0, QModelIndex() ) ) )
163 for (
int i = 0; i < mTableView->model()->rowCount(); ++i )
165 for (
int j = 0; j < mTableView->model()->columnCount(); j++ )
167 QModelIndex index = mTableView->model()->index( i, j );
168 mTableView->selectionModel()->select( index, QItemSelectionModel::Toggle );
175 if ( !mTableView->selectionModel()->hasSelection() )
178 const std::list<int> rowsToMoveUp { selectedRows() };
179 for (
const int row : rowsToMoveUp )
181 if ( !
model()->moveUp(
model()->index( row, 0, QModelIndex() ) ) )
191 if ( !mTableView->selectionModel()->hasSelection() )
194 std::list<int> rowsToMoveDown { selectedRows() };
195 rowsToMoveDown.reverse();
196 for (
const int row : rowsToMoveDown )
198 if ( !
model()->moveDown(
model()->index( row, 0, QModelIndex() ) ) )
206void QgsFieldMappingWidget::updateColumns()
208 for (
int i = 0; i < mModel->
rowCount(); ++i )
214 for (
int i = 0; i < mModel->columnCount(); ++i )
216 mTableView->resizeColumnToContents( i );
220std::list<int> QgsFieldMappingWidget::selectedRows()
223 if ( mTableView->selectionModel()->hasSelection() )
225 const QModelIndexList constSelection { mTableView->selectionModel()->selectedIndexes() };
226 for (
const QModelIndex &index : constSelection )
228 rows.push_back( index.row() );
242QgsFieldMappingExpressionDelegate::QgsFieldMappingExpressionDelegate( QObject *parent )
243 : QStyledItemDelegate( parent )
246void QgsFieldMappingExpressionDelegate::setModelData( QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index )
const
254 const QString currentValue { editorWidget->
currentField( &isExpression, &isValid ) };
257 model->setData( index, currentValue, Qt::EditRole );
265void QgsFieldMappingExpressionDelegate::setEditorData( QWidget *editor,
const QModelIndex &index )
const
271 const QVariant value = index.model()->data( index, Qt::EditRole );
272 editorWidget->
setField( value.toString() );
275QWidget *QgsFieldMappingExpressionDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
279 editor->setAutoFillBackground(
true );
281 if (
const QgsFieldMappingModel *model = qobject_cast<const QgsFieldMappingModel *>( index.model() ) )
284 editor->
setFields( model->sourceFields() );
289 editor->
setFields( model->sourceFields() );
296 if (
QgsFieldMappingWidget *mappingWidget = qobject_cast<QgsFieldMappingWidget *>( QgsFieldMappingExpressionDelegate::parent() ) )
298 if ( mappingWidget->sourceLayer() )
299 editor->
setLayer( mappingWidget->sourceLayer() );
301 else if (
QgsAggregateMappingWidget *aggregateWidget = qobject_cast<QgsAggregateMappingWidget *>( QgsFieldMappingExpressionDelegate::parent() ) )
303 if ( aggregateWidget->sourceLayer() )
304 editor->
setLayer( aggregateWidget->sourceLayer() );
307 editor->
setField( index.model()->data( index, Qt::DisplayRole ).toString() );
309 Q_UNUSED( fieldName )
310 const_cast<QgsFieldMappingExpressionDelegate *
>( this )->emit commitData( editor );
320QgsFieldMappingTypeDelegate::QgsFieldMappingTypeDelegate(
const QList< QgsVectorDataProvider::NativeType > &nativeTypes, QObject *parent )
321 : QStyledItemDelegate( parent )
322 , mNativeTypes( nativeTypes.isEmpty() ?
QgsFieldMappingModel::supportedDataTypes() : nativeTypes )
325QWidget *QgsFieldMappingTypeDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
328 QComboBox *editor =
new QComboBox( parent );
334 editor->setItemData( i, type.mTypeName, Qt::UserRole );
338 const QgsFieldMappingModel *model { qobject_cast<const QgsFieldMappingModel *>( index.model() ) };
342 editor->setEnabled(
false );
346 connect( editor, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [
this, editor](
int currentIndex ) {
347 Q_UNUSED( currentIndex )
348 const_cast<QgsFieldMappingTypeDelegate *
>( this )->emit commitData( editor );
354void QgsFieldMappingTypeDelegate::setEditorData( QWidget *editor,
const QModelIndex &index )
const
356 QComboBox *editorWidget { qobject_cast<QComboBox *>( editor ) };
360 const QVariant value = index.model()->data( index, Qt::EditRole );
361 editorWidget->setCurrentIndex( editorWidget->findData( value ) );
364void QgsFieldMappingTypeDelegate::setModelData( QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index )
const
366 QComboBox *editorWidget { qobject_cast<QComboBox *>( editor ) };
370 const QVariant currentValue = editorWidget->currentData();
371 model->setData( index, currentValue, Qt::EditRole );
374void QgsFieldMappingTypeDelegate::setNativeTypes(
const QList<QgsVectorDataProvider::NativeType> &nativeTypes )
Holds mapping information for defining sets of aggregates of fields from a QgsFields object.
Abstract interface for generating an expression context.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes).
Holds mapping information for mapping from one set of QgsFields to another.
@ SourceExpression
Expression.
@ DestinationType
Destination field type string.
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.
int rowCount(const QModelIndex &parent=QModelIndex()) 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.
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.
Container of fields for a vector layer.
static QIcon iconForFieldType(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType, const QString &typeString=QString())
Returns an icon corresponding to a field type.
Represents a vector layer which manages a vector based dataset.