Skip to content

Commit

Permalink
move the cardinality and the forceSuppressFormPopup to the widget con…
Browse files Browse the repository at this point in the history
…figuration - stored in a QgsAttributeEditorElement
  • Loading branch information
signedav committed Aug 10, 2020
1 parent 50a079f commit 1fadb92
Show file tree
Hide file tree
Showing 16 changed files with 355 additions and 23 deletions.
29 changes: 29 additions & 0 deletions python/core/auto_generated/qgsattributeeditorelement.sip.in
Expand Up @@ -425,6 +425,35 @@ Returns the buttons which are shown
.. versionadded:: 3.16
%End

bool forceSuppressFormPopup() const;
%Docstring
Determines the force suppress form popup status.

.. versionadded:: 3.16
%End

void setForceSuppressFormPopup( bool forceSuppressFormPopup );
%Docstring
Sets force suppress form popup status to ``forceSuppressFormPopup``.
This flag will override the layer and general settings regarding the automatic
opening of the attribute form dialog when digitizing is completed.

.. versionadded:: 3.16
%End

void setCardinality( const QVariant &cardinality = QVariant() );
%Docstring
Sets combo cardinality to ``cardinality``

.. versionadded:: 3.16
%End

QVariant cardinality() const;
%Docstring
Determines combo cardinality

.. versionadded:: 3.16
%End

};

Expand Down
Expand Up @@ -110,6 +110,34 @@ Defines the buttons which are shown
%Docstring
Returns the buttons which are shown

.. versionadded:: 3.16
%End

bool forceSuppressFormPopup() const;
%Docstring
Returns the force suppress form popup status.

.. versionadded:: 3.16
%End

void setForceSuppressFormPopup( bool forceSuppressFormPopup );
%Docstring
Defines the force suppress form popup status

.. versionadded:: 3.16
%End

void setCardinality( const QVariant &cardinality = QVariant() );
%Docstring
Defines the cardinality

.. versionadded:: 3.16
%End

QVariant cardinality() const;
%Docstring
Returns the cardinality

.. versionadded:: 3.16
%End

Expand Down
28 changes: 28 additions & 0 deletions python/gui/auto_generated/qgsrelationeditorwidget.sip.in
Expand Up @@ -180,6 +180,34 @@ Defines the buttons which are shown
%Docstring
Returns the buttons which are shown

.. versionadded:: 3.16
%End

bool forceSuppressFormPopup() const;
%Docstring
Returns the force suppress form popup status.

.. versionadded:: 3.16
%End

void setForceSuppressFormPopup( bool forceSuppressFormPopup );
%Docstring
Defines the force suppress form popup status

.. versionadded:: 3.16
%End

void setCardinality( const QVariant &cardinality = QVariant() );
%Docstring
Defines the cardinality

.. versionadded:: 3.16
%End

QVariant cardinality() const;
%Docstring
Returns the cardinality

.. versionadded:: 3.16
%End

Expand Down
24 changes: 24 additions & 0 deletions src/core/qgsattributeeditorelement.cpp
Expand Up @@ -97,6 +97,8 @@ QgsAttributeEditorElement *QgsAttributeEditorRelation::clone( QgsAttributeEditor
QgsAttributeEditorRelation *element = new QgsAttributeEditorRelation( mRelationId, parent );
element->mRelation = mRelation;
element->mButtons = mButtons;
element->mForceSuppressFormPopup = mForceSuppressFormPopup;
element->mCardinality = mCardinality;

return element;
}
Expand Down Expand Up @@ -133,6 +135,8 @@ void QgsAttributeEditorRelation::saveConfiguration( QDomElement &elem ) const
{
elem.setAttribute( QStringLiteral( "relation" ), mRelation.id() );
elem.setAttribute( QStringLiteral( "buttons" ), qgsFlagValueToKeys( mButtons ) );
elem.setAttribute( QStringLiteral( "forceSuppressFormPopup" ), mForceSuppressFormPopup );
elem.setAttribute( QStringLiteral( "cardinality" ), mCardinality.toString() );
}

QString QgsAttributeEditorRelation::typeIdentifier() const
Expand Down Expand Up @@ -175,6 +179,26 @@ void QgsAttributeEditorRelation::setVisibleButtons( const QgsAttributeEditorRela
mButtons = buttons;
}

void QgsAttributeEditorRelation::setForceSuppressFormPopup( bool forceSuppressFormPopup )
{
mForceSuppressFormPopup = mForceSuppressFormPopup;
}

bool QgsAttributeEditorRelation::forceSuppressFormPopup() const
{
return mForceSuppressFormPopup;
}

void QgsAttributeEditorRelation::setCardinality( const QVariant &cardinality )
{
mCardinality = cardinality;
}

QVariant QgsAttributeEditorRelation::cardinality() const
{
return mCardinality;
}

QgsAttributeEditorElement *QgsAttributeEditorQmlElement::clone( QgsAttributeEditorElement *parent ) const
{
QgsAttributeEditorQmlElement *element = new QgsAttributeEditorQmlElement( name(), parent );
Expand Down
27 changes: 27 additions & 0 deletions src/core/qgsattributeeditorelement.h
Expand Up @@ -467,13 +467,40 @@ class CORE_EXPORT QgsAttributeEditorRelation : public QgsAttributeEditorElement
*/
QgsAttributeEditorRelation::Buttons visibleButtons() const {return mButtons;}

/**
* Determines the force suppress form popup status.
* \since QGIS 3.16
*/
bool forceSuppressFormPopup() const;

/**
* Sets force suppress form popup status to \a forceSuppressFormPopup.
* This flag will override the layer and general settings regarding the automatic
* opening of the attribute form dialog when digitizing is completed.
* \since QGIS 3.16
*/
void setForceSuppressFormPopup( bool forceSuppressFormPopup );

/**
* Sets combo cardinality to \a cardinality
* \since QGIS 3.16
*/
void setCardinality( const QVariant &cardinality = QVariant() );

/**
* Determines combo cardinality
* \since QGIS 3.16
*/
QVariant cardinality() const;

private:
void saveConfiguration( QDomElement &elem ) const override;
QString typeIdentifier() const override;
QString mRelationId;
QgsRelation mRelation;
Buttons mButtons = Buttons( Button::AllButtons );
bool mForceSuppressFormPopup;
QVariant mCardinality;
};

Q_DECLARE_OPERATORS_FOR_FLAGS( QgsAttributeEditorRelation::Buttons )
Expand Down
17 changes: 17 additions & 0 deletions src/core/qgseditformconfig.cpp
Expand Up @@ -629,6 +629,23 @@ QgsAttributeEditorElement *QgsEditFormConfig::attributeEditorElementFromDomEleme
buttons.setFlag( QgsAttributeEditorRelation::Button::SaveChildEdits, elem.attribute( QStringLiteral( "showSaveChildEditsButton" ), QStringLiteral( "1" ) ).toInt() );
relElement->setVisibleButtons( buttons );
}
if ( elem.hasAttribute( QStringLiteral( "forceSuppressFormPopup" ) ) )
{
relElement->setForceSuppressFormPopup( elem.attribute( QStringLiteral( "forceSuppressFormPopup" ) ).toInt() );
}
else
{
// pre QGIS 3.16 compatibility todo
}

if ( elem.hasAttribute( QStringLiteral( "cardinality" ) ) )
{
relElement->setCardinality( elem.attribute( QStringLiteral( "cardinality" ) ) );
}
else
{
// pre QGIS 3.16 compatibility todo
}
newElement = relElement;
}
else if ( elem.tagName() == QLatin1String( "attributeEditorQmlElement" ) )
Expand Down
33 changes: 31 additions & 2 deletions src/gui/attributeformconfig/qgsattributewidgetedit.cpp
Expand Up @@ -67,7 +67,7 @@ void QgsAttributeWidgetEdit::updateItemData()
{
case QgsAttributesFormProperties::DnDTreeItemData::Relation:
{
QgsAttributeWidgetRelationEditWidget *editWidget = qobject_cast<QgsAttributeWidgetRelationEditWidget *>( mWidgetSpecificConfigGroupBox );
QgsAttributeWidgetRelationEditWidget *editWidget = qobject_cast<QgsAttributeWidgetRelationEditWidget *>( mSpecificEditWidget );
if ( editWidget )
{
itemData.setRelationEditorConfiguration( editWidget->relationEditorConfiguration() );
Expand All @@ -86,7 +86,6 @@ void QgsAttributeWidgetEdit::updateItemData()
mTreeItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData );
}


// Relation Widget Specific Edit

QgsAttributeWidgetRelationEditWidget::QgsAttributeWidgetRelationEditWidget( QWidget *parent )
Expand All @@ -104,6 +103,21 @@ void QgsAttributeWidgetRelationEditWidget::setRelationEditorConfiguration( const
mRelationShowZoomToFeatureCheckBox->setChecked( config.buttons.testFlag( QgsAttributeEditorRelation::Button::ZoomToChildFeature ) );
mRelationDeleteChildFeatureCheckBox->setChecked( config.buttons.testFlag( QgsAttributeEditorRelation::Button::DeleteChildFeature ) );
mRelationShowSaveChildEditsCheckBox->setChecked( config.buttons.testFlag( QgsAttributeEditorRelation::Button::SaveChildEdits ) );

//load the combo mRelationCardinalityCombo
setCardinalityCombo( tr( "Many to one relation" ) );

QgsRelation relation = QgsProject::instance()->relationManager()->relation( config.relationId );
const QList<QgsRelation> relations = QgsProject::instance()->relationManager()->referencingRelations( relation.referencingLayer() );
for ( const QgsRelation &nmrel : relations )
{
if ( nmrel.fieldPairs().at( 0 ).referencingField() != relation.fieldPairs().at( 0 ).referencingField() )
setCardinalityCombo( QStringLiteral( "%1 (%2)" ).arg( nmrel.referencedLayer()->name(), nmrel.fieldPairs().at( 0 ).referencedField() ), nmrel.id() );
}

mRelationCardinalityCombo->setToolTip( tr( "For a many to many (N:M) relation, the direct link has to be selected. The in-between table will be hidden." ) );
setCardinality( config.cardinality );
mRelationForceSuppressFormPopupCheckBox->setChecked( config.forceSuppressFormPopup );
}

QgsAttributesFormProperties::RelationEditorConfiguration QgsAttributeWidgetRelationEditWidget::relationEditorConfiguration() const
Expand All @@ -118,5 +132,20 @@ QgsAttributesFormProperties::RelationEditorConfiguration QgsAttributeWidgetRelat
buttons.setFlag( QgsAttributeEditorRelation::Button::DeleteChildFeature, mRelationDeleteChildFeatureCheckBox->isChecked() );
buttons.setFlag( QgsAttributeEditorRelation::Button::SaveChildEdits, mRelationShowSaveChildEditsCheckBox->isChecked() );
relEdCfg.buttons = buttons;
relEdCfg.cardinality = mRelationCardinalityCombo->currentData();
relEdCfg.forceSuppressFormPopup = mRelationForceSuppressFormPopupCheckBox->isChecked();
return relEdCfg;
}

void QgsAttributeWidgetRelationEditWidget::setCardinalityCombo( const QString &cardinalityComboItem, const QVariant &auserData )
{
mRelationCardinalityCombo->addItem( cardinalityComboItem, auserData );
}

void QgsAttributeWidgetRelationEditWidget::setCardinality( const QVariant &auserData )
{
int idx = mRelationCardinalityCombo->findData( auserData );

if ( idx != -1 )
mRelationCardinalityCombo->setCurrentIndex( idx );
}
4 changes: 4 additions & 0 deletions src/gui/attributeformconfig/qgsattributewidgetedit.h
Expand Up @@ -69,6 +69,10 @@ class GUI_EXPORT QgsAttributeWidgetRelationEditWidget : public QWidget, private

static QString title() { return tr( "Relation" ); }

private:
void setCardinalityCombo( const QString &cardinalityComboItem, const QVariant &auserData = QVariant() );
void setCardinality( const QVariant &auserData = QVariant() );

};

#endif // QGSATTRIBUTEWIDGETEDIT_H
32 changes: 30 additions & 2 deletions src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp
Expand Up @@ -154,7 +154,7 @@ void QgsRelationWidgetWrapper::initWidget( QWidget *editor )

QgsAttributeEditorContext myContext( QgsAttributeEditorContext( context(), mRelation, QgsAttributeEditorContext::Multiple, QgsAttributeEditorContext::Embed ) );

if ( config( QStringLiteral( "force-suppress-popup" ), false ).toBool() )
if ( forceSuppressFormPopup() )
{
const_cast<QgsVectorLayerTools *>( myContext.vectorLayerTools() )->setForceSuppressFormPopup( true );
}
Expand All @@ -168,7 +168,7 @@ void QgsRelationWidgetWrapper::initWidget( QWidget *editor )

w->setEditorContext( myContext );

mNmRelation = QgsProject::instance()->relationManager()->relation( config( QStringLiteral( "nm-rel" ) ).toString() );
mNmRelation = QgsProject::instance()->relationManager()->relation( cardinality().toString() );

// If this widget is already embedded by the same relation, reduce functionality
const QgsAttributeEditorContext *ctx = &context();
Expand Down Expand Up @@ -222,3 +222,31 @@ QgsAttributeEditorRelation::Buttons QgsRelationWidgetWrapper::visibleButtons() c
{
return mWidget->visibleButtons();
}

void QgsRelationWidgetWrapper::setForceSuppressFormPopup( bool forceSuppressFormPopup )
{
if ( mWidget )
mWidget->setForceSuppressFormPopup( forceSuppressFormPopup );
}

bool QgsRelationWidgetWrapper::forceSuppressFormPopup() const
{
if ( mWidget )
return mWidget->forceSuppressFormPopup();
else
return false;
}

void QgsRelationWidgetWrapper::setCardinality( const QVariant &cardinality )
{
if ( mWidget )
mWidget->setCardinality( cardinality );
}

QVariant QgsRelationWidgetWrapper::cardinality() const
{
if ( mWidget )
return mWidget->cardinality();
else
return QVariant();
}
24 changes: 24 additions & 0 deletions src/gui/editorwidgets/qgsrelationwidgetwrapper.h
Expand Up @@ -106,6 +106,30 @@ class GUI_EXPORT QgsRelationWidgetWrapper : public QgsWidgetWrapper
*/
QgsAttributeEditorRelation::Buttons visibleButtons() const;

/**
* Returns the force suppress form popup status.
* \since QGIS 3.16
*/
bool forceSuppressFormPopup() const;

/**
* Defines the force suppress form popup status
* \since QGIS 3.16
*/
void setForceSuppressFormPopup( bool forceSuppressFormPopup );

/**
* Defines the cardinality
* \since QGIS 3.16
*/
void setCardinality( const QVariant &cardinality = QVariant() );

/**
* Returns the cardinality
* \since QGIS 3.16
*/
QVariant cardinality() const;

/**
* The relation for which this wrapper is created.
*
Expand Down
2 changes: 2 additions & 0 deletions src/gui/qgsattributeform.cpp
Expand Up @@ -1955,6 +1955,8 @@ QgsAttributeForm::WidgetInfo QgsAttributeForm::createWidgetFromDef( const QgsAtt
// below directly alter the widget and check for it.
rww->setVisibleButtons( relDef->visibleButtons() );
rww->setShowLabel( relDef->showLabel() );
rww->setCardinality( relDef->cardinality() );
rww->setForceSuppressFormPopup( relDef->forceSuppressFormPopup() );

mWidgets.append( rww );
mFormWidgets.append( formWidget );
Expand Down

0 comments on commit 1fadb92

Please sign in to comment.