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 );
73 connect( mFetchLimitCheckBox, &QCheckBox::toggled, mFetchLimit, &QSpinBox::setEnabled );
76void QgsRelationReferenceConfigDlg::mEditExpression_clicked()
86 context.setHighlightedFunctions( QStringList() << QStringLiteral(
"current_value" ) << QStringLiteral(
"current_parent_value" ) );
87 context.setHighlightedVariables( QStringList() << QStringLiteral(
"current_geometry" )
88 << QStringLiteral(
"current_feature" )
89 << QStringLiteral(
"form_mode" )
90 << QStringLiteral(
"current_parent_geometry" )
91 << QStringLiteral(
"current_parent_feature" ) );
94 dlg.setWindowTitle( tr(
"Edit Filter Expression" ) );
96 if ( dlg.exec() == QDialog::Accepted )
98 mFilterExpression->setPlainText( dlg.expressionBuilder()->expressionText() );
104 mCbxAllowNull->setChecked(
config.value( QStringLiteral(
"AllowNULL" ),
false ).toBool() );
105 mCbxShowForm->setChecked(
config.value( QStringLiteral(
"ShowForm" ),
false ).toBool() );
106 mCbxShowOpenFormButton->setChecked(
config.value( QStringLiteral(
"ShowOpenFormButton" ),
true ).toBool() );
108 if (
config.contains( QStringLiteral(
"Relation" ) ) )
110 mComboRelation->setCurrentIndex( mComboRelation->findData(
config.value( QStringLiteral(
"Relation" ) ).toString() ) );
111 relationChanged( mComboRelation->currentIndex() );
114 mCbxMapIdentification->setChecked(
config.value( QStringLiteral(
"MapIdentification" ),
false ).toBool() );
115 mCbxAllowAddFeatures->setChecked(
config.value( QStringLiteral(
"AllowAddFeatures" ),
false ).toBool() );
116 mCbxReadOnly->setChecked(
config.value( QStringLiteral(
"ReadOnly" ),
false ).toBool() );
117 mFetchLimitCheckBox->setChecked(
config.value( QStringLiteral(
"FetchLimitActive" ),
QgsSettings().value( QStringLiteral(
"maxEntriesRelationWidget" ), 100,
QgsSettings::Gui ).toInt() > 0 ).toBool() );
118 mFetchLimit->setValue(
config.value( QStringLiteral(
"FetchLimitNumber" ),
QgsSettings().value( QStringLiteral(
"maxEntriesRelationWidget" ), 100,
QgsSettings::Gui ) ).toInt() );
119 mFilterExpression->setPlainText(
config.value( QStringLiteral(
"FilterExpression" ) ).toString() );
121 if (
config.contains( QStringLiteral(
"FilterFields" ) ) )
123 mFilterGroupBox->setChecked(
true );
124 const auto constToStringList =
config.value(
"FilterFields" ).toStringList();
125 for (
const QString &fld : constToStringList )
127 addFilterField( fld );
130 mCbxChainFilters->setChecked(
config.value( QStringLiteral(
"ChainFilters" ) ).toBool() );
134void QgsRelationReferenceConfigDlg::relationChanged(
int idx )
136 const QString relName = mComboRelation->itemData( idx ).toString();
140 mExpressionWidget->setLayer( mReferencedLayer );
141 if ( mReferencedLayer )
144 mCbxMapIdentification->setEnabled( mReferencedLayer->
isSpatial() );
150void QgsRelationReferenceConfigDlg::mAddFilterButton_clicked()
152 const auto constSelectedItems = mAvailableFieldsList->selectedItems();
153 for ( QListWidgetItem *item : constSelectedItems )
155 addFilterField( item );
159void QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked()
161 const auto constSelectedItems = mFilterFieldsList->selectedItems();
162 for ( QListWidgetItem *item : constSelectedItems )
164 mFilterFieldsList->takeItem( indexFromListWidgetItem( item ) );
165 mAvailableFieldsList->addItem( item );
171 QVariantMap myConfig;
172 myConfig.insert( QStringLiteral(
"AllowNULL" ), mCbxAllowNull->isChecked() );
173 myConfig.insert( QStringLiteral(
"ShowForm" ), mCbxShowForm->isChecked() );
174 myConfig.insert( QStringLiteral(
"ShowOpenFormButton" ), mCbxShowOpenFormButton->isChecked() );
175 myConfig.insert( QStringLiteral(
"MapIdentification" ), mCbxMapIdentification->isEnabled() && mCbxMapIdentification->isChecked() );
176 myConfig.insert( QStringLiteral(
"ReadOnly" ), mCbxReadOnly->isChecked() );
177 myConfig.insert( QStringLiteral(
"Relation" ), mComboRelation->currentData() );
178 myConfig.insert( QStringLiteral(
"AllowAddFeatures" ), mCbxAllowAddFeatures->isChecked() );
179 myConfig.insert( QStringLiteral(
"FetchLimitActive" ), mFetchLimitCheckBox->isChecked() );
180 myConfig.insert( QStringLiteral(
"FetchLimitNumber" ), mFetchLimit->value() );
182 if ( mFilterGroupBox->isChecked() )
184 QStringList filterFields;
185 filterFields.reserve( mFilterFieldsList->count() );
186 for (
int i = 0; i < mFilterFieldsList->count(); i++ )
188 filterFields << mFilterFieldsList->item( i )->data( Qt::UserRole ).toString();
190 myConfig.insert( QStringLiteral(
"FilterFields" ), filterFields );
192 myConfig.insert( QStringLiteral(
"ChainFilters" ), mCbxChainFilters->isChecked() );
193 myConfig.insert( QStringLiteral(
"FilterExpression" ), mFilterExpression->toPlainText() );
196 if ( mReferencedLayer )
199 myConfig.insert( QStringLiteral(
"ReferencedLayerDataSource" ), mReferencedLayer->
publicSource() );
200 myConfig.insert( QStringLiteral(
"ReferencedLayerProviderKey" ), mReferencedLayer->
providerType() );
201 myConfig.insert( QStringLiteral(
"ReferencedLayerId" ), mReferencedLayer->
id() );
202 myConfig.insert( QStringLiteral(
"ReferencedLayerName" ), mReferencedLayer->
name() );
209void QgsRelationReferenceConfigDlg::loadFields()
211 mAvailableFieldsList->clear();
212 mFilterFieldsList->clear();
214 if ( mReferencedLayer )
218 for (
int i = 0; i < flds.
count(); i++ )
221 mAvailableFieldsList->item( mAvailableFieldsList->count() - 1 )->setData( Qt::UserRole, flds.
at( i ).
name() );
226void QgsRelationReferenceConfigDlg::addFilterField(
const QString &field )
228 for (
int i = 0; i < mAvailableFieldsList->count(); i++ )
230 if ( mAvailableFieldsList->item( i )->data( Qt::UserRole ).toString() ==
field )
232 addFilterField( mAvailableFieldsList->item( i ) );
238void QgsRelationReferenceConfigDlg::addFilterField( QListWidgetItem *item )
240 mAvailableFieldsList->takeItem( indexFromListWidgetItem( item ) );
241 mFilterFieldsList->addItem( item );
244int QgsRelationReferenceConfigDlg::indexFromListWidgetItem( QListWidgetItem *item )
246 QListWidget *lw = item->listWidget();
248 for (
int i = 0; i < lw->count(); i++ )
250 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