27#include "moc_qgsrelationreferencewidgetwrapper.cpp"
29using namespace Qt::StringLiterals;
34 , mMessageBar( messageBar )
61 mWidget->setEditorContext( *ctx, mCanvas, mMessageBar );
63 const bool showForm =
config( u
"ShowForm"_s,
false ).toBool();
64 const bool mapIdent =
config( u
"MapIdentification"_s,
false ).toBool();
65 const bool readOnlyWidget =
config( u
"ReadOnly"_s,
false ).toBool();
66 const bool showOpenFormButton =
config( u
"ShowOpenFormButton"_s,
true ).toBool();
68 mWidget->setEmbedForm( showForm );
69 mWidget->setReadOnlySelector( readOnlyWidget );
70 mWidget->setAllowMapIdentification( mapIdent );
71 mWidget->setOpenFormButtonVisible( showOpenFormButton );
74 if ( fetchLimitActive )
79 if (
config( u
"FilterFields"_s, QVariant() ).isValid() )
81 mWidget->setFilterFields(
config( u
"FilterFields"_s ).toStringList() );
82 mWidget->setChainFilters(
config( u
"ChainFilters"_s ).toBool() );
84 if ( !
config( u
"FilterExpression"_s ).toString().isEmpty() )
86 mWidget->setFilterExpression(
config( u
"FilterExpression"_s ).toString() );
90 mWidget->setAllowAddFeatures(
config( u
"AllowAddFeatures"_s,
false ).toBool() );
92 mWidget->setOrderExpression(
config( u
"OrderExpression"_s ).toString() );
93 mWidget->setSortOrder(
config( u
"OrderDescending"_s,
false ).toBool() ? Qt::DescendingOrder : Qt::AscendingOrder );
95 const QVariant relationName =
config( u
"Relation"_s );
98 mWidget->setReferencedLayerDataSource(
config( u
"ReferencedLayerDataSource"_s ).toString() );
99 mWidget->setReferencedLayerProviderKey(
config( u
"ReferencedLayerProviderKey"_s ).toString() );
100 mWidget->setReferencedLayerId(
config( u
"ReferencedLayerId"_s ).toString() );
101 mWidget->setReferencedLayerName(
config( u
"ReferencedLayerName"_s ).toString() );
104 if ( relationName.isValid() )
114 mWidget->setEmbedForm(
false );
115 mWidget->setReadOnlySelector(
true );
116 mWidget->setAllowMapIdentification(
false );
117 mWidget->setOpenFormButtonVisible(
false );
118 mWidget->setAllowAddFeatures(
false );
126 if ( !
config( u
"AllowNULL"_s ).isValid() )
132 mWidget->setRelation( relation,
config( u
"AllowNULL"_s ).toBool() );
138void QgsRelationReferenceWidgetWrapper::aboutToSave()
149 const QVariantList fkeys = mWidget->foreignKeys();
151 if ( fkeys.isEmpty() )
157 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
158 Q_ASSERT( fieldPairs.count() == fkeys.count() );
159 for (
int i = 0; i < fieldPairs.count(); i++ )
161 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
162 return fkeys.at( i );
177 mWidget->showIndeterminateState();
179 mIndeterminateState =
true;
187 if ( !mWidget->relation().isValid() )
190 for (
int i = 0; i < mWidget->relation().fieldPairs().count(); i++ )
192 values << QVariant();
198 QVariantList values = mWidget->foreignKeys();
199 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
200 const int fieldCount = std::min( fieldPairs.count(), values.count() );
201 for (
int i = 0; i < fieldCount; i++ )
203 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
205 values.removeAt( i );
215 if ( !mWidget || !mWidget->relation().isValid() )
216 return QStringList();
219 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
220 for (
int i = 0; i < fieldPairs.count(); i++ )
222 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
225 fields << fieldPairs.at( i ).referencingField();
230void QgsRelationReferenceWidgetWrapper::updateValues(
const QVariant &val,
const QVariantList &additionalValues )
235 mIndeterminateState =
false;
237 QVariantList values = additionalValues;
239 for (
int i = 0; i < fieldPairs.count(); i++ )
241 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
243 values.insert( i, val );
247 Q_ASSERT( values.count() == fieldPairs.count() );
250 mWidget->setForeignKeys( values );
260 mWidget->setRelationEditable( enabled );
263void QgsRelationReferenceWidgetWrapper::foreignKeysChanged(
const QVariantList &values )
265 if ( mBlockChanges != 0 )
279 QVariantList additionalValues = values;
280 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
281 for (
int i = 0; i < fieldPairs.count(); i++ )
283 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
284 mainValue = additionalValues.takeAt( i );
286 Q_ASSERT( additionalValues.count() == values.count() - 1 );
300 widget()->setStyleSheet( QString() );
307 mWidget->setStyleSheet( QString() );
311 mWidget->setStyleSheet( u
".QComboBox { background-color: #dd7777; }"_s );
315 mWidget->setStyleSheet( u
".QComboBox { background-color: #ffd85d; }"_s );
335 mWidget->setParentFormFeature(
context().parentFormFeature() );
341 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