QgsAttributes QgsMergeAttributesDialog::mergedAttributes() const { if ( mFeatureList.size() < 1 ) { return QgsAttributes(); } QgsAttributes results( mTableWidget->columnCount() ); for ( int i = 0; i < mTableWidget->columnCount(); i++ ) { int idx = mTableWidget->horizontalHeaderItem( i )->data( Qt::UserRole ).toInt(); QComboBox* comboBox = qobject_cast<QComboBox *>( mTableWidget->cellWidget( 0, i ) ); if ( comboBox && comboBox->currentText() == tr( "Skip attribute" ) ) continue; QTableWidgetItem* currentItem = mTableWidget->item( mFeatureList.size() + 1, i ); if ( !currentItem ) continue; if ( idx >= results.count() ) results.resize( idx + 1 ); // make sure the results vector is long enough (maybe not necessary) results[idx] = currentItem->text(); } return results; }
QString QgsRelationReferenceFieldFormatter::representValue( QgsVectorLayer* layer, int fieldIndex, const QVariantMap& config, const QVariant& cache, const QVariant& value ) const { Q_UNUSED( cache ); // Some sanity checks if ( !config.contains( QStringLiteral( "Relation" ) ) ) { QgsMessageLog::logMessage( "Missing Relation in configuration" ); return value.toString(); } QgsRelation relation = QgsProject::instance()->relationManager()->relation( config[QStringLiteral( "Relation" )].toString() ); if ( !relation.isValid() ) { QgsMessageLog::logMessage( "Invalid relation" ); return value.toString(); } QgsVectorLayer* referencingLayer = relation.referencingLayer(); if ( layer != referencingLayer ) { QgsMessageLog::logMessage( "representValue() with inconsistent layer parameter w.r.t relation referencingLayer" ); return value.toString(); } int referencingFieldIdx = referencingLayer->fields().lookupField( relation.fieldPairs().at( 0 ).first ); if ( referencingFieldIdx != fieldIndex ) { QgsMessageLog::logMessage( "representValue() with inconsistent fieldIndex parameter w.r.t relation referencingFieldIdx" ); return value.toString(); } QgsVectorLayer* referencedLayer = relation.referencedLayer(); if ( !referencedLayer ) { QgsMessageLog::logMessage( "Cannot find referenced layer" ); return value.toString(); } // Attributes from the referencing layer QgsAttributes attrs = QgsAttributes( layer->fields().count() ); // Set the value on the foreign key field of the referencing record attrs[ referencingFieldIdx ] = value; QgsFeatureRequest request = relation.getReferencedFeatureRequest( attrs ); QgsFeature feature; referencedLayer->getFeatures( request ).nextFeature( feature ); if ( !feature.isValid() ) return value.toString(); QgsExpression expr( referencedLayer->displayExpression() ); QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() << QgsExpressionContextUtils::layerScope( referencedLayer ); context.setFeature( feature ); QString title = expr.evaluate( &context ).toString(); if ( expr.hasEvalError() ) { int referencedFieldIdx = referencedLayer->fields().lookupField( relation.fieldPairs().at( 0 ).second ); title = feature.attribute( referencedFieldIdx ).toString(); } return title; }
void QgsRelationReferenceWidget::setForeignKey( const QVariant& value ) { if ( !value.isValid() || value.isNull() ) { deleteForeignKey(); return; } if ( !mReferencedLayer ) return; QgsAttributes attrs = QgsAttributes( mReferencingLayer->fields().count() ); attrs[mFkeyFieldIdx] = value; QgsFeatureRequest request = mRelation.getReferencedFeatureRequest( attrs ); mReferencedLayer->getFeatures( request ).nextFeature( mFeature ); if ( !mFeature.isValid() ) { deleteForeignKey(); return; } mForeignKey = mFeature.attribute( mFkeyFieldIdx ); if ( mReadOnlySelector ) { QgsExpression expr( mReferencedLayer->displayExpression() ); QgsExpressionContext context; context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope() << QgsExpressionContextUtils::layerScope( mReferencedLayer ); context.setFeature( mFeature ); QString title = expr.evaluate( &context ).toString(); if ( expr.hasEvalError() ) { title = mFeature.attribute( mFkeyFieldIdx ).toString(); } mLineEdit->setText( title ); } else { int i = mComboBox->findData( mFeature.id(), QgsAttributeTableModel::FeatureIdRole ); if ( i == -1 && mAllowNull ) { mComboBox->setCurrentIndex( 0 ); } else { mComboBox->setCurrentIndex( i ); } } mRemoveFKButton->setEnabled( mIsEditable ); highlightFeature( mFeature ); updateAttributeEditorFrame( mFeature ); emit foreignKeyChanged( foreignKey() ); }
QgsAttributes QgsMergeAttributesDialog::mergedAttributes() const { if ( mFeatureList.empty() ) { return QgsAttributes(); } int widgetIndex = 0; QgsAttributes results( mFields.count() ); for ( int fieldIdx = 0; fieldIdx < mFields.count(); ++fieldIdx ) { if ( mHiddenAttributes.contains( fieldIdx ) ) { //hidden attribute, set to default value results[fieldIdx] = QVariant(); continue; } QComboBox *comboBox = qobject_cast<QComboBox *>( mTableWidget->cellWidget( 0, widgetIndex ) ); if ( !comboBox ) continue; QTableWidgetItem *currentItem = mTableWidget->item( mFeatureList.size() + 1, widgetIndex ); if ( !currentItem ) continue; if ( fieldIdx >= results.count() ) results.resize( fieldIdx + 1 ); // make sure the results vector is long enough (maybe not necessary) if ( comboBox->currentData().toString() != QLatin1String( "skip" ) ) { results[fieldIdx] = currentItem->data( Qt::DisplayRole ); } widgetIndex++; } return results; }
QgsAttributes QgsMergeAttributesDialog::mergedAttributes() const { if ( mFeatureList.size() < 1 ) { return QgsAttributes(); } QgsFields fields = mVectorLayer->pendingFields(); QgsAttributes results( mTableWidget->columnCount() ); for ( int i = 0; i < mTableWidget->columnCount(); i++ ) { int idx = mTableWidget->horizontalHeaderItem( i )->data( Qt::UserRole ).toInt(); QComboBox *comboBox = qobject_cast<QComboBox *>( mTableWidget->cellWidget( 0, i ) ); if ( !comboBox ) continue; QTableWidgetItem *currentItem = mTableWidget->item( mFeatureList.size() + 1, i ); if ( !currentItem ) continue; if ( idx >= results.count() ) results.resize( idx + 1 ); // make sure the results vector is long enough (maybe not necessary) if ( comboBox->currentText() != tr( "Skip attribute" ) ) { results[idx] = currentItem->data( Qt::DisplayRole ); } else if ( mVectorLayer->dataProvider() ) { results[idx] = mVectorLayer->dataProvider()->defaultValue( idx ); } } return results; }
void QgsRelationReferenceWidget::setForeignKey( const QVariant &value ) { if ( !value.isValid() ) { return; } if ( value.isNull() ) { deleteForeignKey(); return; } if ( !mReferencedLayer ) return; if ( mReadOnlySelector ) { // Attributes from the referencing layer QgsAttributes attrs = QgsAttributes( mReferencingLayer->fields().count() ); // Set the value on the foreign key field of the referencing record attrs[ mReferencingLayer->fields().lookupField( mRelation.fieldPairs().at( 0 ).first )] = value; QgsFeatureRequest request = mRelation.getReferencedFeatureRequest( attrs ); mReferencedLayer->getFeatures( request ).nextFeature( mFeature ); if ( !mFeature.isValid() ) { return; } mForeignKey = mFeature.attribute( mReferencedFieldIdx ); QgsExpression expr( mReferencedLayer->displayExpression() ); QgsExpressionContext context( QgsExpressionContextUtils::globalProjectLayerScopes( mReferencedLayer ) ); context.setFeature( mFeature ); QString title = expr.evaluate( &context ).toString(); if ( expr.hasEvalError() ) { title = mFeature.attribute( mReferencedFieldIdx ).toString(); } mLineEdit->setText( title ); } else { mComboBox->setIdentifierValue( value ); if ( mChainFilters ) { QVariant nullValue = QgsApplication::nullRepresentation(); QgsFeatureRequest request = mComboBox->currentFeatureRequest(); mReferencedLayer->getFeatures( request ).nextFeature( mFeature ); const int count = std::min( mFilterComboBoxes.size(), mFilterFields.size() ); for ( int i = 0; i < count; i++ ) { QVariant v = mFeature.attribute( mFilterFields[i] ); QString f = v.isNull() ? nullValue.toString() : v.toString(); mFilterComboBoxes.at( i )->setCurrentIndex( mFilterComboBoxes.at( i )->findText( f ) ); } } } mRemoveFKButton->setEnabled( mIsEditable ); highlightFeature( mFeature ); // TODO : make this async updateAttributeEditorFrame( mFeature ); emitForeignKeyChanged( foreignKey() ); }