31   connect( mAddFilterButton, &QToolButton::clicked, 
this, &QgsRelationReferenceConfigDlg::mAddFilterButton_clicked );
 
   32   connect( mRemoveFilterButton, &QToolButton::clicked, 
this, &QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked );
 
   34   mExpressionWidget->registerExpressionContextGenerator( vl );
 
   36   connect( mComboRelation, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsRelationReferenceConfigDlg::relationChanged );
 
   39   for ( 
const QgsRelation &relation : constReferencingRelations )
 
   41     if ( relation.name().isEmpty() )
 
   42       mComboRelation->addItem( QStringLiteral( 
"%1 (%2)" ).arg( relation.id(), relation.referencedLayerId() ), relation.id() );
 
   44       mComboRelation->addItem( QStringLiteral( 
"%1 (%2)" ).arg( relation.name(), relation.referencedLayerId() ), relation.id() );
 
   46     QStandardItemModel *model = qobject_cast<QStandardItemModel *>( mComboRelation->model() );
 
   47     QStandardItem *item = model->item( model->rowCount() - 1 );
 
   49                     ? item->flags() & ~Qt::ItemIsEnabled
 
   50                     : item->flags() | Qt::ItemIsEnabled );
 
   52     if ( 
auto *lReferencedLayer = relation.referencedLayer() )
 
   54       mExpressionWidget->setField( lReferencedLayer->displayExpression() );
 
   70   connect( mEditExpression, &QAbstractButton::clicked, 
this, &QgsRelationReferenceConfigDlg::mEditExpression_clicked );
 
   74 void QgsRelationReferenceConfigDlg::mEditExpression_clicked()
 
   84   context.setHighlightedFunctions( QStringList() << QStringLiteral( 
"current_value" ) << QStringLiteral( 
"current_parent_value" ) );
 
   85   context.setHighlightedVariables( QStringList() << QStringLiteral( 
"current_geometry" )
 
   86                                    << QStringLiteral( 
"current_feature" )
 
   87                                    << QStringLiteral( 
"form_mode" )
 
   88                                    << QStringLiteral( 
"current_parent_geometry" )
 
   89                                    << QStringLiteral( 
"current_parent_feature" ) );
 
   92   dlg.setWindowTitle( tr( 
"Edit Filter Expression" ) );
 
   94   if ( dlg.exec() == QDialog::Accepted )
 
   96     mFilterExpression->setPlainText( dlg.expressionBuilder()->expressionText() );
 
  102   mCbxAllowNull->setChecked( 
config.value( QStringLiteral( 
"AllowNULL" ), 
false ).toBool() );
 
  103   mCbxOrderByValue->setChecked( 
config.value( QStringLiteral( 
"OrderByValue" ), 
false ).toBool() );
 
  104   mCbxShowForm->setChecked( 
config.value( QStringLiteral( 
"ShowForm" ), 
false ).toBool() );
 
  105   mCbxShowOpenFormButton->setChecked( 
config.value( QStringLiteral( 
"ShowOpenFormButton" ), 
true ).toBool() );
 
  107   if ( 
config.contains( QStringLiteral( 
"Relation" ) ) )
 
  109     mComboRelation->setCurrentIndex( mComboRelation->findData( 
config.value( QStringLiteral( 
"Relation" ) ).toString() ) );
 
  110     relationChanged( mComboRelation->currentIndex() );
 
  113   mCbxMapIdentification->setChecked( 
config.value( QStringLiteral( 
"MapIdentification" ), 
false ).toBool() );
 
  114   mCbxAllowAddFeatures->setChecked( 
config.value( QStringLiteral( 
"AllowAddFeatures" ), 
false ).toBool() );
 
  115   mCbxReadOnly->setChecked( 
config.value( QStringLiteral( 
"ReadOnly" ), 
false ).toBool() );
 
  116   mFilterExpression->setPlainText( 
config.value( QStringLiteral( 
"FilterExpression" ) ).toString() );
 
  118   if ( 
config.contains( QStringLiteral( 
"FilterFields" ) ) )
 
  120     mFilterGroupBox->setChecked( 
true );
 
  121     const auto constToStringList = 
config.value( 
"FilterFields" ).toStringList();
 
  122     for ( 
const QString &fld : constToStringList )
 
  124       addFilterField( fld );
 
  127     mCbxChainFilters->setChecked( 
config.value( QStringLiteral( 
"ChainFilters" ) ).toBool() );
 
  131 void QgsRelationReferenceConfigDlg::relationChanged( 
int idx )
 
  133   QString relName = mComboRelation->itemData( idx ).toString();
 
  137   mExpressionWidget->setLayer( mReferencedLayer ); 
 
  138   if ( mReferencedLayer )
 
  141     mCbxMapIdentification->setEnabled( mReferencedLayer->
isSpatial() );
 
  147 void QgsRelationReferenceConfigDlg::mAddFilterButton_clicked()
 
  149   const auto constSelectedItems = mAvailableFieldsList->selectedItems();
 
  150   for ( QListWidgetItem *item : constSelectedItems )
 
  152     addFilterField( item );
 
  156 void QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked()
 
  158   const auto constSelectedItems = mFilterFieldsList->selectedItems();
 
  159   for ( QListWidgetItem *item : constSelectedItems )
 
  161     mFilterFieldsList->takeItem( indexFromListWidgetItem( item ) );
 
  162     mAvailableFieldsList->addItem( item );
 
  168   QVariantMap myConfig;
 
  169   myConfig.insert( QStringLiteral( 
"AllowNULL" ), mCbxAllowNull->isChecked() );
 
  170   myConfig.insert( QStringLiteral( 
"OrderByValue" ), mCbxOrderByValue->isChecked() );
 
  171   myConfig.insert( QStringLiteral( 
"ShowForm" ), mCbxShowForm->isChecked() );
 
  172   myConfig.insert( QStringLiteral( 
"ShowOpenFormButton" ), mCbxShowOpenFormButton->isChecked() );
 
  173   myConfig.insert( QStringLiteral( 
"MapIdentification" ), mCbxMapIdentification->isEnabled() && mCbxMapIdentification->isChecked() );
 
  174   myConfig.insert( QStringLiteral( 
"ReadOnly" ), mCbxReadOnly->isChecked() );
 
  175   myConfig.insert( QStringLiteral( 
"Relation" ), mComboRelation->currentData() );
 
  176   myConfig.insert( QStringLiteral( 
"AllowAddFeatures" ), mCbxAllowAddFeatures->isChecked() );
 
  178   if ( mFilterGroupBox->isChecked() )
 
  180     QStringList filterFields;
 
  181     filterFields.reserve( mFilterFieldsList->count() );
 
  182     for ( 
int i = 0; i < mFilterFieldsList->count(); i++ )
 
  184       filterFields << mFilterFieldsList->item( i )->data( Qt::UserRole ).toString();
 
  186     myConfig.insert( QStringLiteral( 
"FilterFields" ), filterFields );
 
  188     myConfig.insert( QStringLiteral( 
"ChainFilters" ), mCbxChainFilters->isChecked() );
 
  189     myConfig.insert( QStringLiteral( 
"FilterExpression" ), mFilterExpression->toPlainText() );
 
  192   if ( mReferencedLayer )
 
  195     myConfig.insert( QStringLiteral( 
"ReferencedLayerDataSource" ), mReferencedLayer->
publicSource() );
 
  196     myConfig.insert( QStringLiteral( 
"ReferencedLayerProviderKey" ), mReferencedLayer->
providerType() );
 
  197     myConfig.insert( QStringLiteral( 
"ReferencedLayerId" ), mReferencedLayer->
id() );
 
  198     myConfig.insert( QStringLiteral( 
"ReferencedLayerName" ), mReferencedLayer->
name() );
 
  205 void QgsRelationReferenceConfigDlg::loadFields()
 
  207   mAvailableFieldsList->clear();
 
  208   mFilterFieldsList->clear();
 
  210   if ( mReferencedLayer )
 
  214     for ( 
int i = 0; i < flds.
count(); i++ )
 
  217       mAvailableFieldsList->item( mAvailableFieldsList->count() - 1 )->setData( Qt::UserRole, flds.
at( i ).
name() );
 
  222 void QgsRelationReferenceConfigDlg::addFilterField( 
const QString &
field )
 
  224   for ( 
int i = 0; i < mAvailableFieldsList->count(); i++ )
 
  226     if ( mAvailableFieldsList->item( i )->data( Qt::UserRole ).toString() == 
field )
 
  228       addFilterField( mAvailableFieldsList->item( i ) );
 
  234 void QgsRelationReferenceConfigDlg::addFilterField( QListWidgetItem *item )
 
  236   mAvailableFieldsList->takeItem( indexFromListWidgetItem( item ) );
 
  237   mFilterFieldsList->addItem( item );
 
  240 int QgsRelationReferenceConfigDlg::indexFromListWidgetItem( QListWidgetItem *item )
 
  242   QListWidget *lw = item->listWidget();
 
  244   for ( 
int i = 0; i < lw->count(); i++ )
 
  246     if ( lw->item( i ) == item )
 
A generic dialog for building expression strings.
static QgsExpressionContextScope * parentFormScope(const QgsFeature &formFeature=QgsFeature(), const QString &formMode=QString())
Creates a new scope which contains functions and variables from the current parent attribute form/tab...
static QgsExpressionContextScope * formScope(const QgsFeature &formFeature=QgsFeature(), const QString &formMode=QString())
Creates a new scope which contains functions and variables from the current attribute form/table form...
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QString displayName() const
Returns the name to use when displaying this field.
Container of fields for a vector layer.
int count() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
QString providerType() const
Returns the provider type (provider key) for this layer.
QString publicSource() const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QgsRelationManager * relationManager
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_INVOKABLE QgsRelation relation(const QString &id) const
Gets access to a relation by its id.
QgsRelationReferenceConfigDlg(QgsVectorLayer *vl, int fieldIdx, QWidget *parent)
void setConfig(const QVariantMap &config) override
Update the configuration widget to represent the given configuration.
QVariantMap config() override
Create a configuration from the current GUI state.
QgsVectorLayer * referencedLayer
@ Generated
A generated relation is a child of a polymorphic relation.
Represents a vector layer which manages a vector based data sets.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QList< QgsRelation > referencingRelations(int idx) const
Returns the layer's relations, where the foreign key is on this layer.
void setDisplayExpression(const QString &displayExpression)
Set the preview expression, used to create a human readable preview string.
QString displayExpression