31 mFetchLimit->setMaximum( std::numeric_limits<int>::max() );
33 connect( mAddFilterButton, &QToolButton::clicked,
this, &QgsRelationReferenceConfigDlg::mAddFilterButton_clicked );
34 connect( mRemoveFilterButton, &QToolButton::clicked,
this, &QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked );
36 mExpressionWidget->registerExpressionContextGenerator( vl );
38 connect( mComboRelation,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRelationReferenceConfigDlg::relationChanged );
41 for (
const QgsRelation &relation : constReferencingRelations )
43 if ( relation.name().isEmpty() )
44 mComboRelation->addItem( QStringLiteral(
"%1 (%2)" ).arg( relation.id(), relation.referencedLayerId() ), relation.id() );
46 mComboRelation->addItem( QStringLiteral(
"%1 (%2)" ).arg( relation.name(), relation.referencedLayerId() ), relation.id() );
48 QStandardItemModel *model = qobject_cast<QStandardItemModel *>( mComboRelation->model() );
49 QStandardItem *item = model->item( model->rowCount() - 1 );
51 ? item->flags() & ~Qt::ItemIsEnabled
52 : item->flags() | Qt::ItemIsEnabled );
54 if (
auto *lReferencedLayer = relation.referencedLayer() )
56 mExpressionWidget->setField( lReferencedLayer->displayExpression() );
71 connect( mEditExpression, &QAbstractButton::clicked,
this, &QgsRelationReferenceConfigDlg::mEditExpression_clicked );
75void QgsRelationReferenceConfigDlg::mEditExpression_clicked()
85 context.setHighlightedFunctions( QStringList() << QStringLiteral(
"current_value" ) << QStringLiteral(
"current_parent_value" ) );
86 context.setHighlightedVariables( QStringList() << QStringLiteral(
"current_geometry" )
87 << QStringLiteral(
"current_feature" )
88 << QStringLiteral(
"form_mode" )
89 << QStringLiteral(
"current_parent_geometry" )
90 << QStringLiteral(
"current_parent_feature" ) );
93 dlg.setWindowTitle( tr(
"Edit Filter Expression" ) );
95 if ( dlg.exec() == QDialog::Accepted )
97 mFilterExpression->setPlainText( dlg.expressionBuilder()->expressionText() );
103 mCbxAllowNull->setChecked(
config.value( QStringLiteral(
"AllowNULL" ),
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 mFetchLimitGroupBox->setChecked(
config.value( QStringLiteral(
"FetchLimitActive" ),
QgsSettings().value( QStringLiteral(
"maxEntriesRelationWidget" ), 100,
QgsSettings::Gui ).toInt() > 0 ).toBool() );
117 mFetchLimit->setValue(
config.value( QStringLiteral(
"FetchLimitNumber" ),
QgsSettings().value( QStringLiteral(
"maxEntriesRelationWidget" ), 100,
QgsSettings::Gui ) ).toInt() );
118 mFilterExpression->setPlainText(
config.value( QStringLiteral(
"FilterExpression" ) ).toString() );
120 if (
config.contains( QStringLiteral(
"FilterFields" ) ) )
122 mFilterGroupBox->setChecked(
true );
123 const auto constToStringList =
config.value(
"FilterFields" ).toStringList();
124 for (
const QString &fld : constToStringList )
126 addFilterField( fld );
129 mCbxChainFilters->setChecked(
config.value( QStringLiteral(
"ChainFilters" ) ).toBool() );
133void QgsRelationReferenceConfigDlg::relationChanged(
int idx )
135 const QString relName = mComboRelation->itemData( idx ).toString();
139 mExpressionWidget->setLayer( mReferencedLayer );
140 if ( mReferencedLayer )
143 mCbxMapIdentification->setEnabled( mReferencedLayer->
isSpatial() );
149void QgsRelationReferenceConfigDlg::mAddFilterButton_clicked()
151 const auto constSelectedItems = mAvailableFieldsList->selectedItems();
152 for ( QListWidgetItem *item : constSelectedItems )
154 addFilterField( item );
158void QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked()
160 const auto constSelectedItems = mFilterFieldsList->selectedItems();
161 for ( QListWidgetItem *item : constSelectedItems )
163 mFilterFieldsList->takeItem( indexFromListWidgetItem( item ) );
164 mAvailableFieldsList->addItem( item );
170 QVariantMap myConfig;
171 myConfig.insert( QStringLiteral(
"AllowNULL" ), mCbxAllowNull->isChecked() );
172 myConfig.insert( QStringLiteral(
"ShowForm" ), mCbxShowForm->isChecked() );
173 myConfig.insert( QStringLiteral(
"ShowOpenFormButton" ), mCbxShowOpenFormButton->isChecked() );
174 myConfig.insert( QStringLiteral(
"MapIdentification" ), mCbxMapIdentification->isEnabled() && mCbxMapIdentification->isChecked() );
175 myConfig.insert( QStringLiteral(
"ReadOnly" ), mCbxReadOnly->isChecked() );
176 myConfig.insert( QStringLiteral(
"Relation" ), mComboRelation->currentData() );
177 myConfig.insert( QStringLiteral(
"AllowAddFeatures" ), mCbxAllowAddFeatures->isChecked() );
178 myConfig.insert( QStringLiteral(
"FetchLimitActive" ), mFetchLimitGroupBox->isChecked() );
179 myConfig.insert( QStringLiteral(
"FetchLimitNumber" ), mFetchLimit->value() );
181 if ( mFilterGroupBox->isChecked() )
183 QStringList filterFields;
184 filterFields.reserve( mFilterFieldsList->count() );
185 for (
int i = 0; i < mFilterFieldsList->count(); i++ )
187 filterFields << mFilterFieldsList->item( i )->data( Qt::UserRole ).toString();
189 myConfig.insert( QStringLiteral(
"FilterFields" ), filterFields );
191 myConfig.insert( QStringLiteral(
"ChainFilters" ), mCbxChainFilters->isChecked() );
192 myConfig.insert( QStringLiteral(
"FilterExpression" ), mFilterExpression->toPlainText() );
195 if ( mReferencedLayer )
198 myConfig.insert( QStringLiteral(
"ReferencedLayerDataSource" ), mReferencedLayer->
publicSource() );
199 myConfig.insert( QStringLiteral(
"ReferencedLayerProviderKey" ), mReferencedLayer->
providerType() );
200 myConfig.insert( QStringLiteral(
"ReferencedLayerId" ), mReferencedLayer->
id() );
201 myConfig.insert( QStringLiteral(
"ReferencedLayerName" ), mReferencedLayer->
name() );
208void QgsRelationReferenceConfigDlg::loadFields()
210 mAvailableFieldsList->clear();
211 mFilterFieldsList->clear();
213 if ( mReferencedLayer )
217 for (
int i = 0; i < flds.
count(); i++ )
220 mAvailableFieldsList->item( mAvailableFieldsList->count() - 1 )->setData( Qt::UserRole, flds.
at( i ).
name() );
225void QgsRelationReferenceConfigDlg::addFilterField(
const QString &field )
227 for (
int i = 0; i < mAvailableFieldsList->count(); i++ )
229 if ( mAvailableFieldsList->item( i )->data( Qt::UserRole ).toString() ==
field )
231 addFilterField( mAvailableFieldsList->item( i ) );
237void QgsRelationReferenceConfigDlg::addFilterField( QListWidgetItem *item )
239 mAvailableFieldsList->takeItem( indexFromListWidgetItem( item ) );
240 mFilterFieldsList->addItem( item );
243int QgsRelationReferenceConfigDlg::indexFromListWidgetItem( QListWidgetItem *item )
245 QListWidget *lw = item->listWidget();
247 for (
int i = 0; i < lw->count(); i++ )
249 if ( lw->item( i ) == item )
@ Generated
A generated relation is a child of a polymorphic relation.
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 id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QString publicSource(bool hidePassword=false) const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
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
This class is a composition of two QSettings instances:
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