27#include "moc_qgsrelationreferencewidgetwrapper.cpp"
29using namespace Qt::StringLiterals;
34 , mMessageBar( messageBar )
60 mWidget->setEditorContext( *ctx, mCanvas, mMessageBar );
62 const bool showForm =
config( u
"ShowForm"_s,
false ).toBool();
63 const bool mapIdent =
config( u
"MapIdentification"_s,
false ).toBool();
64 const bool readOnlyWidget =
config( u
"ReadOnly"_s,
false ).toBool();
65 const bool showOpenFormButton =
config( u
"ShowOpenFormButton"_s,
true ).toBool();
67 mWidget->setEmbedForm( showForm );
68 mWidget->setReadOnlySelector( readOnlyWidget );
69 mWidget->setAllowMapIdentification( mapIdent );
70 mWidget->setOpenFormButtonVisible( showOpenFormButton );
73 if ( fetchLimitActive )
78 if (
config( u
"FilterFields"_s, QVariant() ).isValid() )
80 mWidget->setFilterFields(
config( u
"FilterFields"_s ).toStringList() );
81 mWidget->setChainFilters(
config( u
"ChainFilters"_s ).toBool() );
83 if ( !
config( u
"FilterExpression"_s ).toString().isEmpty() )
85 mWidget->setFilterExpression(
config( u
"FilterExpression"_s ).toString() );
89 mWidget->setAllowAddFeatures(
config( u
"AllowAddFeatures"_s,
false ).toBool() );
91 mWidget->setOrderExpression(
config( u
"OrderExpression"_s ).toString() );
92 mWidget->setSortOrder(
config( u
"OrderDescending"_s,
false ).toBool() ? Qt::DescendingOrder : Qt::AscendingOrder );
94 const QVariant relationName =
config( u
"Relation"_s );
97 mWidget->setReferencedLayerDataSource(
config( u
"ReferencedLayerDataSource"_s ).toString() );
98 mWidget->setReferencedLayerProviderKey(
config( u
"ReferencedLayerProviderKey"_s ).toString() );
99 mWidget->setReferencedLayerId(
config( u
"ReferencedLayerId"_s ).toString() );
100 mWidget->setReferencedLayerName(
config( u
"ReferencedLayerName"_s ).toString() );
103 if ( relationName.isValid() )
113 mWidget->setEmbedForm(
false );
114 mWidget->setReadOnlySelector(
true );
115 mWidget->setAllowMapIdentification(
false );
116 mWidget->setOpenFormButtonVisible(
false );
117 mWidget->setAllowAddFeatures(
false );
125 if ( !
config( u
"AllowNULL"_s ).isValid() )
131 mWidget->setRelation( relation,
config( u
"AllowNULL"_s ).toBool() );
137void QgsRelationReferenceWidgetWrapper::aboutToSave()
148 const QVariantList fkeys = mWidget->foreignKeys();
150 if ( fkeys.isEmpty() )
156 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
157 Q_ASSERT( fieldPairs.count() == fkeys.count() );
158 for (
int i = 0; i < fieldPairs.count(); i++ )
160 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
161 return fkeys.at( i );
176 mWidget->showIndeterminateState();
178 mIndeterminateState =
true;
186 if ( !mWidget->relation().isValid() )
189 for (
int i = 0; i < mWidget->relation().fieldPairs().count(); i++ )
191 values << QVariant();
197 QVariantList values = mWidget->foreignKeys();
198 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
199 const int fieldCount = std::min( fieldPairs.count(), values.count() );
200 for (
int i = 0; i < fieldCount; i++ )
202 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
204 values.removeAt( i );
214 if ( !mWidget || !mWidget->relation().isValid() )
215 return QStringList();
218 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
219 for (
int i = 0; i < fieldPairs.count(); i++ )
221 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
224 fields << fieldPairs.at( i ).referencingField();
229void QgsRelationReferenceWidgetWrapper::updateValues(
const QVariant &val,
const QVariantList &additionalValues )
234 mIndeterminateState =
false;
236 QVariantList values = additionalValues;
238 for (
int i = 0; i < fieldPairs.count(); i++ )
240 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
242 values.insert( i, val );
246 Q_ASSERT( values.count() == fieldPairs.count() );
249 mWidget->setForeignKeys( values );
259 mWidget->setRelationEditable( enabled );
262void QgsRelationReferenceWidgetWrapper::foreignKeysChanged(
const QVariantList &values )
264 if ( mBlockChanges != 0 )
278 QVariantList additionalValues = values;
279 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
280 for (
int i = 0; i < fieldPairs.count(); i++ )
282 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
283 mainValue = additionalValues.takeAt( i );
285 Q_ASSERT( additionalValues.count() == values.count() - 1 );
299 widget()->setStyleSheet( QString() );
306 mWidget->setStyleSheet( QString() );
310 mWidget->setStyleSheet( u
".QComboBox { background-color: #dd7777; }"_s );
314 mWidget->setStyleSheet( u
".QComboBox { background-color: #ffd85d; }"_s );
334 mWidget->setParentFormFeature(
context().parentFormFeature() );
340 if ( attributeChanged )
Contains context information for attribute editor widgets.
QgsFeature parentFormFeature() const
Returns the feature of the currently edited parent form in its actual state.
void setParentFormFeature(const QgsFeature &feature)
Sets the feature of the currently edited parent form.
const QgsAttributeEditorContext * parentContext() const
const QgsRelation & relation() const
Returns the attribute relation.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Q_INVOKABLE bool setAttribute(int field, const QVariant &attr)
Sets an attribute's value by field index.
Map canvas is a class for displaying all GIS data types on a canvas.
A bar for displaying non-blocking messages to the user.
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.
Represents a relationship between two vector layers.
QList< QgsRelation::FieldPair > fieldPairs() const
Returns the field pairs which form this relation The first element of each pair are the field names o...
bool referencingFieldsAllowNull() const
Returns true if none of the referencing fields has a NOT NULL constraint.
Stores settings for use within QGIS.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
static QVariant createNullVariant(QMetaType::Type metaType)
Helper method to properly create a null QVariant from a metaType Returns the created QVariant.
Represents a vector layer which manages a vector based dataset.
QList< QgsRelation > referencingRelations(int idx) const
Returns the layer's relations, where the foreign key is on this layer.
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH