28#include "moc_qgsrelationreferenceconfigdlg.cpp"
30using namespace Qt::StringLiterals;
38 mFetchLimit->setMaximum( std::numeric_limits<int>::max() );
40 connect( mAddFilterButton, &QToolButton::clicked,
this, &QgsRelationReferenceConfigDlg::mAddFilterButton_clicked );
41 connect( mRemoveFilterButton, &QToolButton::clicked,
this, &QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked );
43 mExpressionWidget->registerExpressionContextGenerator( vl );
45 connect( mComboRelation,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRelationReferenceConfigDlg::relationChanged );
48 for (
const QgsRelation &relation : constReferencingRelations )
50 if ( relation.name().isEmpty() )
51 mComboRelation->addItem( u
"%1 (%2)"_s.arg( relation.id(), relation.referencedLayerId() ), relation.id() );
53 mComboRelation->addItem( u
"%1 (%2)"_s.arg( relation.name(), relation.referencedLayerId() ), relation.id() );
55 QStandardItemModel *model = qobject_cast<QStandardItemModel *>( mComboRelation->model() );
56 QStandardItem *item = model->item( model->rowCount() - 1 );
59 if (
auto *lReferencedLayer = relation.referencedLayer() )
61 mExpressionWidget->setField( lReferencedLayer->displayExpression() );
76 connect( mEditExpression, &QAbstractButton::clicked,
this, &QgsRelationReferenceConfigDlg::mEditExpression_clicked );
78 connect( mFetchLimitCheckBox, &QCheckBox::toggled, mFetchLimit, &QSpinBox::setEnabled );
84void QgsRelationReferenceConfigDlg::mEditExpression_clicked()
94 context.setHighlightedFunctions( QStringList() << u
"current_value"_s << u
"current_parent_value"_s );
95 context.setHighlightedVariables( QStringList() << u
"current_geometry"_s << u
"current_feature"_s << u
"form_mode"_s << u
"current_parent_geometry"_s << u
"current_parent_feature"_s );
98 dlg.setWindowTitle( tr(
"Edit Filter Expression" ) );
100 if ( dlg.exec() == QDialog::Accepted )
102 mFilterExpression->setPlainText( dlg.expressionBuilder()->expressionText() );
110 mAllowNullWasSetByConfig =
config.contains( u
"AllowNULL"_s );
111 if ( mAllowNullWasSetByConfig )
113 mCbxAllowNull->setChecked(
config.value( u
"AllowNULL"_s,
false ).toBool() );
115 mCbxShowForm->setChecked(
config.value( u
"ShowForm"_s,
false ).toBool() );
116 mCbxShowOpenFormButton->setChecked(
config.value( u
"ShowOpenFormButton"_s,
true ).toBool() );
118 if (
config.contains( u
"Relation"_s ) )
120 mComboRelation->setCurrentIndex( mComboRelation->findData(
config.value( u
"Relation"_s ).toString() ) );
121 relationChanged( mComboRelation->currentIndex() );
124 mCbxMapIdentification->setChecked(
config.value( u
"MapIdentification"_s,
false ).toBool() );
125 mCbxAllowAddFeatures->setChecked(
config.value( u
"AllowAddFeatures"_s,
false ).toBool() );
126 mCbxReadOnly->setChecked(
config.value( u
"ReadOnly"_s,
false ).toBool() );
127 mFetchLimitCheckBox->setChecked(
config.value( u
"FetchLimitActive"_s,
QgsSettings().value( u
"maxEntriesRelationWidget"_s, 100,
QgsSettings::Gui ).toInt() > 0 ).toBool() );
130 mOrderByExpressionWidget->setExpression(
config.value( u
"OrderExpression"_s ).toString() );
131 mOrderByDescending->setChecked(
config.value( u
"OrderDescending"_s,
false ).toBool() );
133 mFilterExpression->setPlainText(
config.value( u
"FilterExpression"_s ).toString() );
134 if (
config.contains( u
"FilterFields"_s ) )
136 mFilterGroupBox->setChecked(
true );
137 const auto constToStringList =
config.value(
"FilterFields" ).toStringList();
138 for (
const QString &fld : constToStringList )
140 addFilterField( fld );
143 mCbxChainFilters->setChecked(
config.value( u
"ChainFilters"_s ).toBool() );
147void QgsRelationReferenceConfigDlg::relationChanged(
int idx )
149 const QString relName = mComboRelation->itemData( idx ).toString();
153 mExpressionWidget->setLayer( mReferencedLayer );
154 if ( mReferencedLayer )
157 mCbxMapIdentification->setEnabled( mReferencedLayer->
isSpatial() );
159 mOrderByExpressionWidget->setLayer( mReferencedLayer );
162 if ( !mAllowNullWasSetByConfig )
170void QgsRelationReferenceConfigDlg::mAddFilterButton_clicked()
172 const auto constSelectedItems = mAvailableFieldsList->selectedItems();
173 for ( QListWidgetItem *item : constSelectedItems )
175 addFilterField( item );
179void QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked()
181 const auto constSelectedItems = mFilterFieldsList->selectedItems();
182 for ( QListWidgetItem *item : constSelectedItems )
184 mFilterFieldsList->takeItem( indexFromListWidgetItem( item ) );
185 mAvailableFieldsList->addItem( item );
191 QVariantMap myConfig;
192 myConfig.insert( u
"AllowNULL"_s, mCbxAllowNull->isChecked() );
193 myConfig.insert( u
"ShowForm"_s, mCbxShowForm->isChecked() );
194 myConfig.insert( u
"ShowOpenFormButton"_s, mCbxShowOpenFormButton->isChecked() );
195 myConfig.insert( u
"MapIdentification"_s, mCbxMapIdentification->isEnabled() && mCbxMapIdentification->isChecked() );
196 myConfig.insert( u
"ReadOnly"_s, mCbxReadOnly->isChecked() );
197 myConfig.insert( u
"Relation"_s, mComboRelation->currentData() );
198 myConfig.insert( u
"AllowAddFeatures"_s, mCbxAllowAddFeatures->isChecked() );
199 myConfig.insert( u
"FetchLimitActive"_s, mFetchLimitCheckBox->isChecked() );
200 myConfig.insert( u
"FetchLimitNumber"_s, mFetchLimit->value() );
202 myConfig.insert( u
"OrderExpression"_s, mOrderByExpressionWidget->currentField() );
203 myConfig.insert( u
"OrderDescending"_s, mOrderByDescending->isChecked() );
205 if ( mFilterGroupBox->isChecked() )
207 QStringList filterFields;
208 filterFields.reserve( mFilterFieldsList->count() );
209 for (
int i = 0; i < mFilterFieldsList->count(); i++ )
211 filterFields << mFilterFieldsList->item( i )->data( Qt::UserRole ).toString();
213 myConfig.insert( u
"FilterFields"_s, filterFields );
215 myConfig.insert( u
"ChainFilters"_s, mCbxChainFilters->isChecked() );
216 myConfig.insert( u
"FilterExpression"_s, mFilterExpression->toPlainText() );
219 if ( mReferencedLayer )
222 myConfig.insert( u
"ReferencedLayerDataSource"_s, mReferencedLayer->publicSource() );
223 myConfig.insert( u
"ReferencedLayerProviderKey"_s, mReferencedLayer->providerType() );
224 myConfig.insert( u
"ReferencedLayerId"_s, mReferencedLayer->id() );
225 myConfig.insert( u
"ReferencedLayerName"_s, mReferencedLayer->name() );
226 mReferencedLayer->setDisplayExpression( mExpressionWidget->currentField() );
232void QgsRelationReferenceConfigDlg::loadFields()
234 mAvailableFieldsList->clear();
235 mFilterFieldsList->clear();
237 if ( mReferencedLayer )
241 for (
int i = 0; i < flds.
count(); i++ )
244 mAvailableFieldsList->item( mAvailableFieldsList->count() - 1 )->setData( Qt::UserRole, flds.
at( i ).
name() );
249void QgsRelationReferenceConfigDlg::addFilterField(
const QString &field )
251 for (
int i = 0; i < mAvailableFieldsList->count(); i++ )
253 if ( mAvailableFieldsList->item( i )->data( Qt::UserRole ).toString() ==
field )
255 addFilterField( mAvailableFieldsList->item( i ) );
261void QgsRelationReferenceConfigDlg::addFilterField( QListWidgetItem *item )
263 mAvailableFieldsList->takeItem( indexFromListWidgetItem( item ) );
264 mFilterFieldsList->addItem( item );
267int QgsRelationReferenceConfigDlg::indexFromListWidgetItem( QListWidgetItem *item )
269 QListWidget *lw = item->listWidget();
271 for (
int i = 0; i < lw->count(); i++ )
273 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.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
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.
Represents a relationship between two vector layers.
QgsVectorLayer * referencedLayer
bool referencingFieldsAllowNull() const
Returns true if none of the referencing fields has a NOT NULL constraint.
Stores settings for use within QGIS.
Represents a vector layer which manages a vector based dataset.
bool isSpatial() const final
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QList< QgsRelation > referencingRelations(int idx) const
Returns the layer's relations, where the foreign key is on this layer.
QString displayExpression