25#include "moc_qgsrelationreferencewidgetwrapper.cpp"
30 , mMessageBar( messageBar )
31 , mIndeterminateState( false )
57 mWidget->setEditorContext( *ctx, mCanvas, mMessageBar );
59 const bool showForm =
config( QStringLiteral(
"ShowForm" ),
false ).toBool();
60 const bool mapIdent =
config( QStringLiteral(
"MapIdentification" ),
false ).toBool();
61 const bool readOnlyWidget =
config( QStringLiteral(
"ReadOnly" ),
false ).toBool();
62 const bool showOpenFormButton =
config( QStringLiteral(
"ShowOpenFormButton" ),
true ).toBool();
64 mWidget->setEmbedForm( showForm );
65 mWidget->setReadOnlySelector( readOnlyWidget );
66 mWidget->setAllowMapIdentification( mapIdent );
67 mWidget->setOpenFormButtonVisible( showOpenFormButton );
69 const bool fetchLimitActive =
config( QStringLiteral(
"FetchLimitActive" ),
QgsSettings().
value( QStringLiteral(
"maxEntriesRelationWidget" ), 100,
QgsSettings::Gui ).toInt() > 0 ).toBool();
70 if ( fetchLimitActive )
75 if (
config( QStringLiteral(
"FilterFields" ), QVariant() ).isValid() )
77 mWidget->setFilterFields(
config( QStringLiteral(
"FilterFields" ) ).toStringList() );
78 mWidget->setChainFilters(
config( QStringLiteral(
"ChainFilters" ) ).toBool() );
80 if ( !
config( QStringLiteral(
"FilterExpression" ) ).toString().isEmpty() )
82 mWidget->setFilterExpression(
config( QStringLiteral(
"FilterExpression" ) ).toString() );
86 mWidget->setAllowAddFeatures(
config( QStringLiteral(
"AllowAddFeatures" ),
false ).toBool() );
88 mWidget->setOrderExpression(
config( QStringLiteral(
"OrderExpression" ) ).toString() );
89 mWidget->setSortOrder(
config( QStringLiteral(
"OrderDescending" ),
false ).toBool() ? Qt::DescendingOrder : Qt::AscendingOrder );
91 const QVariant relationName =
config( QStringLiteral(
"Relation" ) );
94 mWidget->setReferencedLayerDataSource(
config( QStringLiteral(
"ReferencedLayerDataSource" ) ).toString() );
95 mWidget->setReferencedLayerProviderKey(
config( QStringLiteral(
"ReferencedLayerProviderKey" ) ).toString() );
96 mWidget->setReferencedLayerId(
config( QStringLiteral(
"ReferencedLayerId" ) ).toString() );
97 mWidget->setReferencedLayerName(
config( QStringLiteral(
"ReferencedLayerName" ) ).toString() );
100 if ( relationName.isValid() )
110 mWidget->setEmbedForm(
false );
111 mWidget->setReadOnlySelector(
true );
112 mWidget->setAllowMapIdentification(
false );
113 mWidget->setOpenFormButtonVisible(
false );
114 mWidget->setAllowAddFeatures(
false );
122 if ( !
config( QStringLiteral(
"AllowNULL" ) ).isValid() )
128 mWidget->setRelation( relation,
config( QStringLiteral(
"AllowNULL" ) ).toBool() );
134void QgsRelationReferenceWidgetWrapper::aboutToSave()
145 const QVariantList fkeys = mWidget->foreignKeys();
147 if ( fkeys.isEmpty() )
153 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
154 Q_ASSERT( fieldPairs.count() == fkeys.count() );
155 for (
int i = 0; i < fieldPairs.count(); i++ )
157 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
158 return fkeys.at( i );
173 mWidget->showIndeterminateState();
175 mIndeterminateState =
true;
183 if ( !mWidget->relation().isValid() )
186 for (
int i = 0; i < mWidget->relation().fieldPairs().count(); i++ )
188 values << QVariant();
194 QVariantList values = mWidget->foreignKeys();
195 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
196 const int fieldCount = std::min( fieldPairs.count(), values.count() );
197 for (
int i = 0; i < fieldCount; i++ )
199 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
201 values.removeAt( i );
211 if ( !mWidget || !mWidget->relation().isValid() )
212 return QStringList();
215 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
216 for (
int i = 0; i < fieldPairs.count(); i++ )
218 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
221 fields << fieldPairs.at( i ).referencingField();
226void QgsRelationReferenceWidgetWrapper::updateValues(
const QVariant &val,
const QVariantList &additionalValues )
231 mIndeterminateState =
false;
233 QVariantList values = additionalValues;
235 for (
int i = 0; i < fieldPairs.count(); i++ )
237 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
239 values.insert( i, val );
243 Q_ASSERT( values.count() == fieldPairs.count() );
246 mWidget->setForeignKeys( values );
256 mWidget->setRelationEditable( enabled );
259void QgsRelationReferenceWidgetWrapper::foreignKeysChanged(
const QVariantList &values )
261 if ( mBlockChanges != 0 )
275 QVariantList additionalValues = values;
276 const QList<QgsRelation::FieldPair> fieldPairs = mWidget->relation().fieldPairs();
277 for (
int i = 0; i < fieldPairs.count(); i++ )
279 if ( fieldPairs.at( i ).referencingField() ==
field().name() )
280 mainValue = additionalValues.takeAt( i );
282 Q_ASSERT( additionalValues.count() == values.count() - 1 );
296 widget()->setStyleSheet( QString() );
303 mWidget->setStyleSheet( QString() );
307 mWidget->setStyleSheet( QStringLiteral(
".QComboBox { background-color: #dd7777; }" ) );
311 mWidget->setStyleSheet( QStringLiteral(
".QComboBox { background-color: #ffd85d; }" ) );
331 mWidget->setParentFormFeature(
context().parentFormFeature() );
337 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