29#include "moc_qgsrelationreferencewidgetwrapper.cpp"
31using namespace Qt::StringLiterals;
36 , mMessageBar( messageBar )
62 mWidget->setEditorContext( *ctx, mCanvas, mMessageBar );
64 const bool showForm =
config( u
"ShowForm"_s,
false ).toBool();
65 const bool mapIdent =
config( u
"MapIdentification"_s,
false ).toBool();
66 const bool readOnlyWidget =
config( u
"ReadOnly"_s,
false ).toBool();
67 const bool showOpenFormButton =
config( u
"ShowOpenFormButton"_s,
true ).toBool();
69 mWidget->setEmbedForm( showForm );
70 mWidget->setReadOnlySelector( readOnlyWidget );
71 mWidget->setAllowMapIdentification( mapIdent );
72 mWidget->setOpenFormButtonVisible( showOpenFormButton );
75 if ( fetchLimitActive )
80 if (
config( u
"FilterFields"_s, QVariant() ).isValid() )
82 mWidget->setFilterFields(
config( u
"FilterFields"_s ).toStringList() );
83 mWidget->setChainFilters(
config( u
"ChainFilters"_s ).toBool() );
85 if ( !
config( u
"FilterExpression"_s ).toString().isEmpty() )
87 mWidget->setFilterExpression(
config( u
"FilterExpression"_s ).toString() );
91 mWidget->setAllowAddFeatures(
config( u
"AllowAddFeatures"_s,
false ).toBool() );
93 mWidget->setOrderExpression(
config( u
"OrderExpression"_s ).toString() );
94 mWidget->setSortOrder(
config( u
"OrderDescending"_s,
false ).toBool() ? Qt::DescendingOrder : Qt::AscendingOrder );
96 const QVariant relationName =
config( u
"Relation"_s );
99 mWidget->setReferencedLayerDataSource(
config( u
"ReferencedLayerDataSource"_s ).toString() );
100 mWidget->setReferencedLayerProviderKey(
config( u
"ReferencedLayerProviderKey"_s ).toString() );
101 mWidget->setReferencedLayerId(
config( u
"ReferencedLayerId"_s ).toString() );
102 mWidget->setReferencedLayerName(
config( u
"ReferencedLayerName"_s ).toString() );
105 if ( relationName.isValid() )
115 mWidget->setEmbedForm(
false );
116 mWidget->setReadOnlySelector(
true );
117 mWidget->setAllowMapIdentification(
false );
118 mWidget->setOpenFormButtonVisible(
false );
119 mWidget->setAllowAddFeatures(
false );
127 if ( !
config( u
"AllowNULL"_s ).isValid() )
133 mWidget->setRelation( relation,
config( u
"AllowNULL"_s ).toBool() );
139void QgsRelationReferenceWidgetWrapper::aboutToSave()
150 const QVariantList fkeys = mWidget->foreignKeys();
152 if ( fkeys.isEmpty() )
158 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
159 Q_ASSERT( fieldPairs.count() == fkeys.count() );
160 for (
int i = 0; i < fieldPairs.count(); i++ )
162 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
163 return fkeys.at( i );
178 mWidget->showIndeterminateState();
180 mIndeterminateState =
true;
188 if ( !mWidget->relation().isValid() )
191 for (
int i = 0; i < mWidget->relation().fieldPairs().count(); i++ )
193 values << QVariant();
199 QVariantList values = mWidget->foreignKeys();
200 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
201 const int fieldCount = std::min( fieldPairs.count(), values.count() );
202 for (
int i = 0; i < fieldCount; i++ )
204 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
206 values.removeAt( i );
216 if ( !mWidget || !mWidget->relation().isValid() )
217 return QStringList();
220 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
221 for (
int i = 0; i < fieldPairs.count(); i++ )
223 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
226 fields << fieldPairs.at( i ).referencingField();
231void QgsRelationReferenceWidgetWrapper::updateValues(
const QVariant &val,
const QVariantList &additionalValues )
236 mIndeterminateState =
false;
238 QVariantList values = additionalValues;
240 for (
int i = 0; i < fieldPairs.count(); i++ )
242 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
244 values.insert( i, val );
248 Q_ASSERT( values.count() == fieldPairs.count() );
251 mWidget->setForeignKeys( values );
261 mWidget->setRelationEditable( enabled );
264void QgsRelationReferenceWidgetWrapper::foreignKeysChanged(
const QVariantList &values )
266 if ( mBlockChanges != 0 )
280 QVariantList additionalValues = values;
281 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
282 for (
int i = 0; i < fieldPairs.count(); i++ )
284 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
285 mainValue = additionalValues.takeAt( i );
287 Q_ASSERT( additionalValues.count() == values.count() - 1 );
301 widget()->setStyleSheet( QString() );
308 mWidget->setStyleSheet( QString() );
312 mWidget->setStyleSheet( u
".QComboBox { background-color: #dd7777; }"_s );
316 mWidget->setStyleSheet( u
".QComboBox { background-color: #ffd85d; }"_s );
336 mWidget->setParentFormFeature(
context().parentFormFeature() );
342 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.
static const QgsSettingsEntryInteger * settingsMaxEntriesRelationWidget
Settings for maximum number of entries in relation widget.
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.
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