From 0a4dacdbd0637cac9bb82c9119cf9a2449652908 Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Sat, 4 Jul 2026 16:37:02 +0700 Subject: [PATCH] Fix handling of current_parent* driven default value expression when editing a child feature --- src/core/attributeformmodelbase.cpp | 6 +++-- src/qml/editorwidgets/RelationEditorBase.qml | 22 +++++++++++++------ .../gallery_relation_editor.qml | 8 +------ .../ordered_relation_editor.qml | 9 +------- .../relationeditors/relation_editor.qml | 8 +------ 5 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/core/attributeformmodelbase.cpp b/src/core/attributeformmodelbase.cpp index 06ae6eca4a..dd491e87e5 100644 --- a/src/core/attributeformmodelbase.cpp +++ b/src/core/attributeformmodelbase.cpp @@ -311,9 +311,11 @@ void AttributeFormModelBase::applyParentDefaultValues() if ( !fields.at( fidx ).defaultValueDefinition().isValid() || ( !fields.at( fidx ).defaultValueDefinition().applyOnUpdate() && !featureIsNew ) ) continue; - if ( fields.at( fidx ).defaultValueDefinition().expression().indexOf( "@current_parent_" ) > -1 ) + QgsExpression exp( fields.at( fidx ).defaultValueDefinition().expression() ); + const QSet referencedFunctions = exp.referencedFunctions(); + const QSet referencedVariables = exp.referencedVariables(); + if ( referencedFunctions.contains( QStringLiteral( "current_parent_value" ) ) || referencedVariables.contains( QStringLiteral( "current_parent_feature" ) ) || referencedVariables.contains( QStringLiteral( "current_parent_geometry" ) ) ) { - QgsExpression exp( fields.at( fidx ).defaultValueDefinition().expression() ); exp.prepare( &mExpressionContext ); const QVariant defaultValue = exp.evaluate( &mExpressionContext ); const bool success = mFeatureModel->setData( mFeatureModel->index( fidx ), defaultValue, FeatureModel::AttributeValue ); diff --git a/src/qml/editorwidgets/RelationEditorBase.qml b/src/qml/editorwidgets/RelationEditorBase.qml index 0b65804f12..9f36999986 100644 --- a/src/qml/editorwidgets/RelationEditorBase.qml +++ b/src/qml/editorwidgets/RelationEditorBase.qml @@ -290,13 +290,7 @@ EditorWidgetBase { text: qsTr("Open Form") onTriggered: { - ensureEmbeddedFormLoaded(); - embeddedPopup.state = isEnabled ? 'Edit' : 'ReadOnly'; - embeddedPopup.currentLayer = nmRelationId ? relationEditorModel.nmRelation.referencedLayer : relationEditorModel.relation.referencingLayer; - embeddedPopup.linkedRelation = relationEditorModel.relation; - embeddedPopup.linkedParentFeature = relationEditorModel.feature; - embeddedPopup.feature = nmRelationId ? childMenu.entryNmReferencedFeature : childMenu.entryReferencingFeature; - embeddedPopup.open(); + showViewFeaturePopup(nmRelationId ? childMenu.entryNmReferencedFeature : childMenu.entryReferencingFeature); } } @@ -459,6 +453,20 @@ EditorWidgetBase { showAddFeaturePopup(geometry); } + function showViewFeaturePopup(feature) { + ensureEmbeddedFormLoaded(); + embeddedPopup.state = isEnabled ? 'Edit' : 'ReadOnly'; + embeddedPopup.currentLayer = nmRelationId ? relationEditorModel.nmRelation.referencedLayer : relationEditorModel.relation.referencingLayer; + embeddedPopup.linkedParentFeature = relationEditorModel.feature; + embeddedPopup.linkedRelation = relationEditorModel.relation; + embeddedPopup.linkedRelationOrderingField = relationEditorModel.orderingField !== undefined ? relationEditorModel.orderingField : ""; + embeddedPopup.feature = feature; + embeddedPopup.open(); + if (isEnabled) { + embeddedPopup.attributeFormModel.applyParentDefaultValues(); + } + } + function showAddFeaturePopup(geometry) { ensureEmbeddedFormLoaded(); embeddedPopup.state = 'Add'; diff --git a/src/qml/editorwidgets/relationeditors/gallery_relation_editor.qml b/src/qml/editorwidgets/relationeditors/gallery_relation_editor.qml index 1d42f5d4df..e3d2db0aed 100644 --- a/src/qml/editorwidgets/relationeditors/gallery_relation_editor.qml +++ b/src/qml/editorwidgets/relationeditors/gallery_relation_editor.qml @@ -489,13 +489,7 @@ RelationEditorBase { function openFeatureForm(feature, nmFeature) { stopAllMedia(); - ensureEmbeddedFormLoaded(); - embeddedPopup.state = isEnabled ? 'Edit' : 'ReadOnly'; - embeddedPopup.currentLayer = nmRelationId ? referencingFeatureListModel.nmRelation.referencedLayer : referencingFeatureListModel.relation.referencingLayer; - embeddedPopup.linkedRelation = referencingFeatureListModel.relation; - embeddedPopup.linkedParentFeature = referencingFeatureListModel.feature; - embeddedPopup.feature = nmRelationId ? nmFeature : feature; - embeddedPopup.open(); + showViewFeaturePopup(nmRelationId ? nmFeature : feature); } function resolveAttachmentPath(path) { diff --git a/src/qml/editorwidgets/relationeditors/ordered_relation_editor.qml b/src/qml/editorwidgets/relationeditors/ordered_relation_editor.qml index 9eba0bacce..decef8d4f8 100644 --- a/src/qml/editorwidgets/relationeditors/ordered_relation_editor.qml +++ b/src/qml/editorwidgets/relationeditors/ordered_relation_editor.qml @@ -165,14 +165,7 @@ RelationEditorBase { bgcolor: 'transparent' onClicked: { - ensureEmbeddedFormLoaded(); - embeddedPopup.state = isEnabled ? 'Edit' : 'ReadOnly'; - embeddedPopup.currentLayer = orderedRelationModel.relation.referencingLayer; - embeddedPopup.linkedRelation = orderedRelationModel.relation; - embeddedPopup.linkedRelationOrderingField = orderedRelationModel.orderingField; - embeddedPopup.linkedParentFeature = orderedRelationModel.feature; - embeddedPopup.feature = model.referencingFeature; - embeddedPopup.open(); + showViewFeaturePopup(model.referencingFeature); } } diff --git a/src/qml/editorwidgets/relationeditors/relation_editor.qml b/src/qml/editorwidgets/relationeditors/relation_editor.qml index 7c080885b1..77ebe138d1 100644 --- a/src/qml/editorwidgets/relationeditors/relation_editor.qml +++ b/src/qml/editorwidgets/relationeditors/relation_editor.qml @@ -112,13 +112,7 @@ RelationEditorBase { bgcolor: 'transparent' onClicked: { - ensureEmbeddedFormLoaded(); - embeddedPopup.state = isEnabled ? 'Edit' : 'ReadOnly'; - embeddedPopup.currentLayer = nmRelationId ? referencingFeatureListModel.nmRelation.referencedLayer : referencingFeatureListModel.relation.referencingLayer; - embeddedPopup.linkedRelation = referencingFeatureListModel.relation; - embeddedPopup.linkedParentFeature = referencingFeatureListModel.feature; - embeddedPopup.feature = nmRelationId ? model.nmReferencedFeature : model.referencingFeature; - embeddedPopup.open(); + showViewFeaturePopup(nmRelationId ? model.nmReferencedFeature : model.referencingFeature); } }