void QgsRelationReferenceWidget::setRelation( const QgsRelation& relation, bool allowNullValue ) { mAllowNull = allowNullValue; mRemoveFKButton->setVisible( allowNullValue && mReadOnlySelector ); if ( relation.isValid() ) { mInvalidLabel->hide(); mRelation = relation; mReferencingLayer = relation.referencingLayer(); mRelationName = relation.name(); mReferencedLayer = relation.referencedLayer(); mReferencedFieldIdx = mReferencedLayer->fields().lookupField( relation.fieldPairs().at( 0 ).second ); mReferencingFieldIdx = mReferencingLayer->fields().lookupField( relation.fieldPairs().at( 0 ).first ); mAttributeEditorFrame->setObjectName( QStringLiteral( "referencing/" ) + relation.name() ); QgsAttributeEditorContext context( mEditorContext, relation, QgsAttributeEditorContext::Single, QgsAttributeEditorContext::Embed ); if ( mEmbedForm ) { mAttributeEditorFrame->setTitle( mReferencedLayer->name() ); mReferencedAttributeForm = new QgsAttributeForm( relation.referencedLayer(), QgsFeature(), context, this ); mAttributeEditorLayout->addWidget( mReferencedAttributeForm ); } connect( mReferencedLayer, SIGNAL( editingStarted() ), this, SLOT( updateAddEntryButton() ) ); connect( mReferencedLayer, SIGNAL( editingStopped() ), this, SLOT( updateAddEntryButton() ) ); updateAddEntryButton(); } else { mInvalidLabel->show(); } if ( mShown && isVisible() ) { init(); } }
void QgsRelationEditorWidget::setRelations( const QgsRelation& relation, const QgsRelation& nmrelation ) { if ( mRelation.isValid() ) { disconnect( mRelation.referencingLayer(), SIGNAL( editingStarted() ), this, SLOT( updateButtons() ) ); disconnect( mRelation.referencingLayer(), SIGNAL( editingStopped() ), this, SLOT( updateButtons() ) ); } if ( mNmRelation.isValid() ) { disconnect( mNmRelation.referencedLayer(), SIGNAL( editingStarted() ), this, SLOT( updateButtons() ) ); disconnect( mNmRelation.referencedLayer(), SIGNAL( editingStopped() ), this, SLOT( updateButtons() ) ); } mRelation = relation; mNmRelation = nmrelation; if ( !mRelation.isValid() ) return; connect( mRelation.referencingLayer(), SIGNAL( editingStarted() ), this, SLOT( updateButtons() ) ); connect( mRelation.referencingLayer(), SIGNAL( editingStopped() ), this, SLOT( updateButtons() ) ); if ( mNmRelation.isValid() ) { connect( mNmRelation.referencingLayer(), SIGNAL( editingStarted() ), this, SLOT( updateButtons() ) ); connect( mNmRelation.referencingLayer(), SIGNAL( editingStopped() ), this, SLOT( updateButtons() ) ); } setTitle( relation.name() ); QgsVectorLayer* lyr = relation.referencingLayer(); bool canChangeAttributes = lyr->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues; if ( canChangeAttributes && !lyr->isReadOnly() ) { mToggleEditingButton->setEnabled( true ); updateButtons(); } else { mToggleEditingButton->setEnabled( false ); } setObjectName( mRelation.name() ); loadState(); updateUi(); }
void QgsRelationReferenceWidgetWrapper::initWidget( QWidget* editor ) { QgsRelationReferenceWidget* w = dynamic_cast<QgsRelationReferenceWidget*>( editor ); if ( !w ) { w = new QgsRelationReferenceWidget( editor ); } mWidget = w; mWidget->setEditorContext( context(), mCanvas, mMessageBar ); bool showForm = config( "ShowForm", true ).toBool(); bool mapIdent = config( "MapIdentification", false ).toBool(); bool readOnlyWidget = config( "ReadOnly", false ).toBool(); bool orderByValue = config( "OrderByValue", false ).toBool(); mWidget->setEmbedForm( showForm ); mWidget->setReadOnlySelector( readOnlyWidget ); mWidget->setAllowMapIdentification( mapIdent ); mWidget->setOrderByValue( orderByValue ); if ( config( "FilterFields", QVariant() ).isValid() ) { mWidget->setFilterFields( config( "FilterFields" ).toStringList() ); mWidget->setChainFilters( config( "ChainFilters" ).toBool() ); } mWidget->setAllowAddFeatures( config( "AllowAddFeatures", false ).toBool() ); QgsRelation relation = QgsProject::instance()->relationManager()->relation( config( "Relation" ).toString() ); // If this widget is already embedded by the same relation, reduce functionality const QgsAttributeEditorContext* ctx = &context(); do { if ( ctx->relation().name() == relation.name() ) { mWidget->setEmbedForm( false ); mWidget->setReadOnlySelector( false ); mWidget->setAllowMapIdentification( false ); } ctx = ctx->parentContext(); } while ( ctx ); mWidget->setRelation( relation, config( "AllowNULL" ).toBool() ); connect( mWidget, SIGNAL( foreignKeyChanged( QVariant ) ), this, SLOT( foreignKeyChanged( QVariant ) ) ); }
void QgsRelationEditorWidget::setRelationFeature( const QgsRelation& relation, const QgsFeature& feature ) { if ( mRelation.isValid() ) { disconnect( mRelation.referencingLayer(), SIGNAL( editingStarted() ), this, SLOT( updateButtons() ) ); disconnect( mRelation.referencingLayer(), SIGNAL( editingStopped() ), this, SLOT( updateButtons() ) ); } mRelation = relation; mFeature = feature; connect( mRelation.referencingLayer(), SIGNAL( editingStarted() ), this, SLOT( updateButtons() ) ); connect( mRelation.referencingLayer(), SIGNAL( editingStopped() ), this, SLOT( updateButtons() ) ); setTitle( relation.name() ); QgsVectorLayer* lyr = relation.referencingLayer(); bool canChangeAttributes = lyr->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues; if ( canChangeAttributes && !lyr->isReadOnly() ) { mToggleEditingButton->setEnabled( true ); updateButtons(); } else { mToggleEditingButton->setEnabled( false ); } setObjectName( mRelation.name() ); loadState(); // If not yet initialized, it is not (yet) visible, so we don't load it to be faster (lazy loading) // If it is already initialized, it has been set visible before and the currently shown feature is changing // and the widget needs updating if ( mVisible ) { QgsFeatureRequest myRequest = mRelation.getRelatedFeaturesRequest( mFeature ); mDualView->init( mRelation.referencingLayer(), nullptr, myRequest, mEditorContext ); } }
void QgsRelationWidgetWrapper::initWidget( QWidget* editor ) { QgsRelationEditorWidget* w = dynamic_cast<QgsRelationEditorWidget*>( editor ); // if the editor cannot be cast to relation editor, insert a new one if ( !w ) { w = new QgsRelationEditorWidget( editor ); w->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); if ( ! editor->layout() ) { editor->setLayout( new QGridLayout() ); } editor->layout()->addWidget( w ); } QgsAttributeEditorContext myContext( QgsAttributeEditorContext( context(), mRelation, QgsAttributeEditorContext::Multiple, QgsAttributeEditorContext::Embed ) ); w->setEditorContext( myContext ); QgsRelation nmrel = QgsProject::instance()->relationManager()->relation( config( "nm-rel" ).toString() ); // If this widget is already embedded by the same relation, reduce functionality const QgsAttributeEditorContext* ctx = &context(); do { if (( ctx->relation().name() == mRelation.name() && ctx->formMode() == QgsAttributeEditorContext::Embed ) || ctx->relation().name() == nmrel.name() ) { w->setVisible( false ); break; } ctx = ctx->parentContext(); } while ( ctx ); w->setRelations( mRelation, nmrel ); mWidget = w; }
void QgsRelationReferenceWidget::setRelation( const QgsRelation& relation, bool allowNullValue ) { mAllowNull = allowNullValue; mRemoveFKButton->setVisible( allowNullValue && mReadOnlySelector ); if ( relation.isValid() ) { mInvalidLabel->hide(); mRelation = relation; mReferencingLayer = relation.referencingLayer(); mRelationName = relation.name(); mReferencedLayer = relation.referencedLayer(); mReferencedFieldIdx = mReferencedLayer->fieldNameIndex( relation.fieldPairs().at( 0 ).second ); mReferencingFieldIdx = mReferencingLayer->fieldNameIndex( relation.fieldPairs().at( 0 ).first ); QgsAttributeEditorContext context( mEditorContext, relation, QgsAttributeEditorContext::Single, QgsAttributeEditorContext::Embed ); if ( mEmbedForm ) { mAttributeEditorFrame->setTitle( mReferencedLayer->name() ); mReferencedAttributeForm = new QgsAttributeForm( relation.referencedLayer(), QgsFeature(), context, this ); mReferencedAttributeForm->hideButtonBox(); mAttributeEditorLayout->addWidget( mReferencedAttributeForm ); } } else { mInvalidLabel->show(); } if ( mShown && isVisible() ) { init(); } }
void QgsRelationEditorWidget::setRelations( const QgsRelation &relation, const QgsRelation &nmrelation ) { if ( mRelation.isValid() ) { disconnect( mRelation.referencingLayer(), &QgsVectorLayer::editingStarted, this, &QgsRelationEditorWidget::updateButtons ); disconnect( mRelation.referencingLayer(), &QgsVectorLayer::editingStopped, this, &QgsRelationEditorWidget::updateButtons ); } if ( mNmRelation.isValid() ) { disconnect( mNmRelation.referencedLayer(), &QgsVectorLayer::editingStarted, this, &QgsRelationEditorWidget::updateButtons ); disconnect( mNmRelation.referencedLayer(), &QgsVectorLayer::editingStopped, this, &QgsRelationEditorWidget::updateButtons ); } mRelation = relation; mNmRelation = nmrelation; if ( !mRelation.isValid() ) return; mToggleEditingButton->setVisible( true ); const auto transactionGroups = QgsProject::instance()->transactionGroups(); for ( auto it = transactionGroups.constBegin(); it != transactionGroups.constEnd(); ++it ) { if ( it.value()->layers().contains( mRelation.referencingLayer() ) ) { mToggleEditingButton->setVisible( false ); mSaveEditsButton->setVisible( false ); } } connect( mRelation.referencingLayer(), &QgsVectorLayer::editingStarted, this, &QgsRelationEditorWidget::updateButtons ); connect( mRelation.referencingLayer(), &QgsVectorLayer::editingStopped, this, &QgsRelationEditorWidget::updateButtons ); if ( mNmRelation.isValid() ) { connect( mNmRelation.referencedLayer(), &QgsVectorLayer::editingStarted, this, &QgsRelationEditorWidget::updateButtons ); connect( mNmRelation.referencedLayer(), &QgsVectorLayer::editingStopped, this, &QgsRelationEditorWidget::updateButtons ); } setTitle( relation.name() ); QgsVectorLayer *lyr = relation.referencingLayer(); bool canChangeAttributes = lyr->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues; if ( canChangeAttributes && !lyr->readOnly() ) { mToggleEditingButton->setEnabled( true ); updateButtons(); } else { mToggleEditingButton->setEnabled( false ); } if ( mNmRelation.isValid() ) mZoomToFeatureButton->setVisible( mNmRelation.referencedLayer()->isSpatial() ); else mZoomToFeatureButton->setVisible( mRelation.referencingLayer()->isSpatial() ); setObjectName( QStringLiteral( "referenced/" ) + mRelation.name() ); updateUi(); }