17#include "moc_qgsrelationreferenceconfigdlg.cpp"
33 mFetchLimit->setMaximum( std::numeric_limits<int>::max() );
35 connect( mAddFilterButton, &QToolButton::clicked,
this, &QgsRelationReferenceConfigDlg::mAddFilterButton_clicked );
36 connect( mRemoveFilterButton, &QToolButton::clicked,
this, &QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked );
38 mExpressionWidget->registerExpressionContextGenerator( vl );
40 connect( mComboRelation,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsRelationReferenceConfigDlg::relationChanged );
43 for (
const QgsRelation &relation : constReferencingRelations )
45 if ( relation.name().isEmpty() )
46 mComboRelation->addItem( QStringLiteral(
"%1 (%2)" ).arg( relation.id(), relation.referencedLayerId() ), relation.id() );
48 mComboRelation->addItem( QStringLiteral(
"%1 (%2)" ).arg( relation.name(), relation.referencedLayerId() ), relation.id() );
50 QStandardItemModel *model = qobject_cast<QStandardItemModel *>( mComboRelation->model() );
51 QStandardItem *item = model->item( model->rowCount() - 1 );
53 ? item->flags() & ~Qt::ItemIsEnabled
54 : item->flags() | Qt::ItemIsEnabled );
56 if (
auto *lReferencedLayer = relation.referencedLayer() )
58 mExpressionWidget->setField( lReferencedLayer->displayExpression() );
73 connect( mEditExpression, &QAbstractButton::clicked,
this, &QgsRelationReferenceConfigDlg::mEditExpression_clicked );
75 connect( mFetchLimitCheckBox, &QCheckBox::toggled, mFetchLimit, &QSpinBox::setEnabled );
78void QgsRelationReferenceConfigDlg::mEditExpression_clicked()
88 context.setHighlightedFunctions( QStringList() << QStringLiteral(
"current_value" ) << QStringLiteral(
"current_parent_value" ) );
89 context.setHighlightedVariables( QStringList() << QStringLiteral(
"current_geometry" )
90 << QStringLiteral(
"current_feature" )
91 << QStringLiteral(
"form_mode" )
92 << QStringLiteral(
"current_parent_geometry" )
93 << QStringLiteral(
"current_parent_feature" ) );
96 dlg.setWindowTitle( tr(
"Edit Filter Expression" ) );
98 if ( dlg.exec() == QDialog::Accepted )
100 mFilterExpression->setPlainText( dlg.expressionBuilder()->expressionText() );
108 mAllowNullWasSetByConfig =
config.contains( QStringLiteral(
"AllowNULL" ) );
109 if ( mAllowNullWasSetByConfig )
111 mCbxAllowNull->setChecked(
config.value( QStringLiteral(
"AllowNULL" ),
false ).toBool() );
113 mCbxShowForm->setChecked(
config.value( QStringLiteral(
"ShowForm" ),
false ).toBool() );
114 mCbxShowOpenFormButton->setChecked(
config.value( QStringLiteral(
"ShowOpenFormButton" ),
true ).toBool() );
116 if (
config.contains( QStringLiteral(
"Relation" ) ) )
118 mComboRelation->setCurrentIndex( mComboRelation->findData(
config.value( QStringLiteral(
"Relation" ) ).toString() ) );
119 relationChanged( mComboRelation->currentIndex() );
122 mCbxMapIdentification->setChecked(
config.value( QStringLiteral(
"MapIdentification" ),
false ).toBool() );
123 mCbxAllowAddFeatures->setChecked(
config.value( QStringLiteral(
"AllowAddFeatures" ),
false ).toBool() );
124 mCbxReadOnly->setChecked(
config.value( QStringLiteral(
"ReadOnly" ),
false ).toBool() );
125 mFetchLimitCheckBox->setChecked(
config.value( QStringLiteral(
"FetchLimitActive" ),
QgsSettings().value( QStringLiteral(
"maxEntriesRelationWidget" ), 100,
QgsSettings::Gui ).toInt() > 0 ).toBool() );
126 mFetchLimit->setValue(
config.value( QStringLiteral(
"FetchLimitNumber" ),
QgsSettings().value( QStringLiteral(
"maxEntriesRelationWidget" ), 100,
QgsSettings::Gui ) ).toInt() );
127 mFilterExpression->setPlainText(
config.value( QStringLiteral(
"FilterExpression" ) ).toString() );
129 if (
config.contains( QStringLiteral(
"FilterFields" ) ) )
131 mFilterGroupBox->setChecked(
true );
132 const auto constToStringList =
config.value(
"FilterFields" ).toStringList();
133 for (
const QString &fld : constToStringList )
135 addFilterField( fld );
138 mCbxChainFilters->setChecked(
config.value( QStringLiteral(
"ChainFilters" ) ).toBool() );
142void QgsRelationReferenceConfigDlg::relationChanged(
int idx )
144 const QString relName = mComboRelation->itemData( idx ).toString();
148 mExpressionWidget->setLayer( mReferencedLayer );
149 if ( mReferencedLayer )
152 mCbxMapIdentification->setEnabled( mReferencedLayer->
isSpatial() );
157 if ( ! mAllowNullWasSetByConfig )
165void QgsRelationReferenceConfigDlg::mAddFilterButton_clicked()
167 const auto constSelectedItems = mAvailableFieldsList->selectedItems();
168 for ( QListWidgetItem *item : constSelectedItems )
170 addFilterField( item );
174void QgsRelationReferenceConfigDlg::mRemoveFilterButton_clicked()
176 const auto constSelectedItems = mFilterFieldsList->selectedItems();
177 for ( QListWidgetItem *item : constSelectedItems )
179 mFilterFieldsList->takeItem( indexFromListWidgetItem( item ) );
180 mAvailableFieldsList->addItem( item );
186 QVariantMap myConfig;
187 myConfig.insert( QStringLiteral(
"AllowNULL" ), mCbxAllowNull->isChecked() );
188 myConfig.insert( QStringLiteral(
"ShowForm" ), mCbxShowForm->isChecked() );
189 myConfig.insert( QStringLiteral(
"ShowOpenFormButton" ), mCbxShowOpenFormButton->isChecked() );
190 myConfig.insert( QStringLiteral(
"MapIdentification" ), mCbxMapIdentification->isEnabled() && mCbxMapIdentification->isChecked() );
191 myConfig.insert( QStringLiteral(
"ReadOnly" ), mCbxReadOnly->isChecked() );
192 myConfig.insert( QStringLiteral(
"Relation" ), mComboRelation->currentData() );
193 myConfig.insert( QStringLiteral(
"AllowAddFeatures" ), mCbxAllowAddFeatures->isChecked() );
194 myConfig.insert( QStringLiteral(
"FetchLimitActive" ), mFetchLimitCheckBox->isChecked() );
195 myConfig.insert( QStringLiteral(
"FetchLimitNumber" ), mFetchLimit->value() );
197 if ( mFilterGroupBox->isChecked() )
199 QStringList filterFields;
200 filterFields.reserve( mFilterFieldsList->count() );
201 for (
int i = 0; i < mFilterFieldsList->count(); i++ )
203 filterFields << mFilterFieldsList->item( i )->data( Qt::UserRole ).toString();
205 myConfig.insert( QStringLiteral(
"FilterFields" ), filterFields );
207 myConfig.insert( QStringLiteral(
"ChainFilters" ), mCbxChainFilters->isChecked() );
208 myConfig.insert( QStringLiteral(
"FilterExpression" ), mFilterExpression->toPlainText() );
211 if ( mReferencedLayer )
214 myConfig.insert( QStringLiteral(
"ReferencedLayerDataSource" ), mReferencedLayer->
publicSource() );
215 myConfig.insert( QStringLiteral(
"ReferencedLayerProviderKey" ), mReferencedLayer->
providerType() );
216 myConfig.insert( QStringLiteral(
"ReferencedLayerId" ), mReferencedLayer->
id() );
217 myConfig.insert( QStringLiteral(
"ReferencedLayerName" ), mReferencedLayer->
name() );
224void QgsRelationReferenceConfigDlg::loadFields()
226 mAvailableFieldsList->clear();
227 mFilterFieldsList->clear();
229 if ( mReferencedLayer )
233 for (
int i = 0; i < flds.
count(); i++ )
236 mAvailableFieldsList->item( mAvailableFieldsList->count() - 1 )->setData( Qt::UserRole, flds.
at( i ).
name() );
241void QgsRelationReferenceConfigDlg::addFilterField(
const QString &field )
243 for (
int i = 0; i < mAvailableFieldsList->count(); i++ )
245 if ( mAvailableFieldsList->item( i )->data( Qt::UserRole ).toString() ==
field )
247 addFilterField( mAvailableFieldsList->item( i ) );
253void QgsRelationReferenceConfigDlg::addFilterField( QListWidgetItem *item )
255 mAvailableFieldsList->takeItem( indexFromListWidgetItem( item ) );
256 mFilterFieldsList->addItem( item );
259int QgsRelationReferenceConfigDlg::indexFromListWidgetItem( QListWidgetItem *item )
261 QListWidget *lw = item->listWidget();
263 for (
int i = 0; i < lw->count(); i++ )
265 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).
QString providerType() const
Returns the provider type (provider key) for this layer.
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.
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.
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...
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