QgsEditorWidgetSetup editorWidgetSetup( const QgsVectorLayer *vl, const QString &fieldName, int &score ) const override { int bestScore = 0; QString bestType; const QMap<QString, QgsEditorWidgetFactory *> factories = QgsGui::editorWidgetRegistry()->factories(); for ( QMap<QString, QgsEditorWidgetFactory *>::const_iterator i = factories.begin(); i != factories.end(); ++i ) { const int index = vl->fields().lookupField( fieldName ); if ( index >= 0 ) { const int score = i.value()->fieldScore( vl, index ); if ( score > bestScore ) { bestType = i.key(); bestScore = score; } } } if ( bestScore > 0 ) { score = 10; return QgsEditorWidgetSetup( bestType, QVariantMap() ); } return QgsEditorWidgetSetup(); }
bool QgsAuxiliaryLayer::addAuxiliaryField( const QgsPropertyDefinition &definition ) { if ( ( definition.name().isEmpty() && definition.comment().isEmpty() ) || exists( definition ) ) return false; const QgsField af = createAuxiliaryField( definition ); const bool rc = addAttribute( af ); updateFields(); mLayer->updateFields(); if ( rc ) { int auxIndex = indexOfPropertyDefinition( definition ); int index = mLayer->fields().indexOf( nameFromProperty( definition, true ) ); if ( index >= 0 && auxIndex >= 0 ) { if ( isHiddenProperty( auxIndex ) ) { // update editor widget QgsEditorWidgetSetup setup = QgsEditorWidgetSetup( QStringLiteral( "Hidden" ), QVariantMap() ); setEditorWidgetSetup( auxIndex, setup ); // column is hidden QgsAttributeTableConfig attrCfg = mLayer->attributeTableConfig(); attrCfg.update( mLayer->fields() ); QVector<QgsAttributeTableConfig::ColumnConfig> columns = attrCfg.columns(); QVector<QgsAttributeTableConfig::ColumnConfig>::iterator it; for ( it = columns.begin(); it != columns.end(); ++it ) { if ( it->name.compare( mLayer->fields().field( index ).name() ) == 0 ) it->hidden = true; } attrCfg.setColumns( columns ); mLayer->setAttributeTableConfig( attrCfg ); } else if ( definition.standardTemplate() == QgsPropertyDefinition::ColorNoAlpha || definition.standardTemplate() == QgsPropertyDefinition::ColorWithAlpha ) { QgsEditorWidgetSetup setup = QgsEditorWidgetSetup( QStringLiteral( "Color" ), QVariantMap() ); setEditorWidgetSetup( auxIndex, setup ); } mLayer->setEditorWidgetSetup( index, editorWidgetSetup( auxIndex ) ); } } return rc; }
QgsEditorWidgetSetup editorWidgetSetup( const QgsVectorLayer *vl, const QString &fieldName, int &score ) const override { QgsField field = vl->fields().field( fieldName ); if ( !field.editorWidgetSetup().isNull() ) { score = 20; return field.editorWidgetSetup(); } else { return QgsEditorWidgetSetup(); } }
void TestQgsAttributeForm::testFieldConstraint() { // make a temporary vector layer QString def = QStringLiteral( "Point?field=col0:integer" ); QgsVectorLayer* layer = new QgsVectorLayer( def, QStringLiteral( "test" ), QStringLiteral( "memory" ) ); layer->setEditorWidgetSetup( 0, QgsEditorWidgetSetup( QStringLiteral( "TextEdit" ), QVariantMap() ) ); // add a feature to the vector layer QgsFeature ft( layer->dataProvider()->fields(), 1 ); ft.setAttribute( QStringLiteral( "col0" ), 0 ); // build a form for this feature QgsAttributeForm form( layer ); form.setFeature( ft ); // testing stuff QString validLabel = QStringLiteral( "col0<font color=\"green\">✔</font>" ); QString invalidLabel = QStringLiteral( "col0<font color=\"red\">✘</font>" ); QString warningLabel = QStringLiteral( "col0<font color=\"orange\">✘</font>" ); // set constraint layer->setConstraintExpression( 0, QString() ); // get wrapper QgsEditorWidgetWrapper *ww; ww = qobject_cast<QgsEditorWidgetWrapper*>( form.mWidgets[0] ); // no constraint so we expect a label with just the field name QLabel *label = form.mBuddyMap.value( ww->widget() ); QCOMPARE( label->text(), QString( "col0" ) ); // set a not null constraint layer->setConstraintExpression( 0, QStringLiteral( "col0 is not null" ) ); // build a form for this feature QgsAttributeForm form2( layer ); form2.setFeature( ft ); QSignalSpy spy( &form2, SIGNAL( attributeChanged( QString, QVariant ) ) ); ww = qobject_cast<QgsEditorWidgetWrapper*>( form2.mWidgets[0] ); label = form2.mBuddyMap.value( ww->widget() ); // set value to 1 ww->setValue( 1 ); QCOMPARE( spy.count(), 2 ); QCOMPARE( label->text(), validLabel ); // set value to null spy.clear(); ww->setValue( QVariant() ); QCOMPARE( spy.count(), 2 ); QCOMPARE( label->text(), invalidLabel ); // set value to 1 spy.clear(); ww->setValue( 1 ); QCOMPARE( spy.count(), 2 ); QCOMPARE( label->text(), validLabel ); // set a soft constraint layer->setConstraintExpression( 0, QStringLiteral( "col0 is not null" ) ); layer->setFieldConstraint( 0, QgsFieldConstraints::ConstraintExpression, QgsFieldConstraints::ConstraintStrengthSoft ); // build a form for this feature QgsAttributeForm form3( layer ); form3.setFeature( ft ); ww = qobject_cast<QgsEditorWidgetWrapper*>( form3.mWidgets[0] ); label = form3.mBuddyMap.value( ww->widget() ); // set value to 1 ww->setValue( 1 ); QCOMPARE( label->text(), validLabel ); // set value to null ww->setValue( QVariant() ); QCOMPARE( label->text(), warningLabel ); // set value to 1 ww->setValue( 1 ); QCOMPARE( label->text(), validLabel ); }