Don't overwrite existing data defined property expressions when

an interactive map tool is used to move/rotate/edit labels

But instead automatically upgrade this property to use a

    coalesce("aux field", 'existing' || 'property' || 'expression')

type expression, so that the tool will place the interactively
edited position/rotation/etc in the auxiliary field but default
to using the expression for all other features

Fixes #44475
This commit is contained in:
Nyall Dawson 2021-09-28 10:15:57 +10:00
parent 9db24c26bf
commit b30c17f07d
4 changed files with 12 additions and 13 deletions

View File

@ -884,9 +884,9 @@ bool QgsMapToolLabel::createAuxiliaryFields( LabelDetails &details, QgsPalIndexe
{ {
index = vlayer->fields().lookupField( prop.field() ); index = vlayer->fields().lookupField( prop.field() );
} }
else if ( prop.propertyType() != QgsProperty::ExpressionBasedProperty || overwriteExpression ) else
{ {
index = QgsAuxiliaryLayer::createProperty( p, vlayer ); index = QgsAuxiliaryLayer::createProperty( p, vlayer, overwriteExpression );
changed = true; changed = true;
} }
@ -935,9 +935,9 @@ bool QgsMapToolLabel::createAuxiliaryFields( LabelDetails &details, QgsDiagramIn
{ {
index = vlayer->fields().lookupField( prop.field() ); index = vlayer->fields().lookupField( prop.field() );
} }
else if ( prop.propertyType() != QgsProperty::ExpressionBasedProperty || overwriteExpression ) else
{ {
index = QgsAuxiliaryLayer::createProperty( p, vlayer ); index = QgsAuxiliaryLayer::createProperty( p, vlayer, overwriteExpression );
changed = true; changed = true;
} }
@ -985,12 +985,11 @@ bool QgsMapToolLabel::createAuxiliaryFields( QgsCalloutPosition &details, QgsCal
{ {
index = vlayer->fields().lookupField( prop.field() ); index = vlayer->fields().lookupField( prop.field() );
} }
else if ( prop.propertyType() != QgsProperty::ExpressionBasedProperty || overwriteExpression ) else
{ {
index = QgsAuxiliaryLayer::createProperty( p, vlayer ); index = QgsAuxiliaryLayer::createProperty( p, vlayer, overwriteExpression );
changed = true; changed = true;
} }
calloutIndexes[p] = index; calloutIndexes[p] = index;
} }
if ( changed ) if ( changed )

View File

@ -111,7 +111,7 @@ void QgsMapToolMoveLabel::cadCanvasPressEvent( QgsMapMouseEvent *e )
{ {
QgsCalloutIndexes indexes; QgsCalloutIndexes indexes;
if ( createAuxiliaryFields( calloutPosition, indexes ) ) if ( createAuxiliaryFields( calloutPosition, indexes, false ) )
return; return;
if ( !canModifyCallout( calloutPosition, mCurrentCalloutMoveOrigin, xCol, yCol ) ) if ( !canModifyCallout( calloutPosition, mCurrentCalloutMoveOrigin, xCol, yCol ) )
@ -188,7 +188,7 @@ void QgsMapToolMoveLabel::cadCanvasPressEvent( QgsMapMouseEvent *e )
{ {
QgsPalIndexes indexes; QgsPalIndexes indexes;
if ( createAuxiliaryFields( indexes ) ) if ( createAuxiliaryFields( indexes, false ) )
return; return;
if ( !labelMoveable( vlayer, mCurrentLabel.settings, xCol, yCol ) ) if ( !labelMoveable( vlayer, mCurrentLabel.settings, xCol, yCol ) )
@ -211,7 +211,7 @@ void QgsMapToolMoveLabel::cadCanvasPressEvent( QgsMapMouseEvent *e )
{ {
QgsDiagramIndexes indexes; QgsDiagramIndexes indexes;
if ( createAuxiliaryFields( indexes ) ) if ( createAuxiliaryFields( indexes, false ) )
return; return;
if ( !diagramMoveable( vlayer, xCol, yCol ) ) if ( !diagramMoveable( vlayer, xCol, yCol ) )

View File

@ -117,7 +117,7 @@ void QgsMapToolRotateLabel::canvasPressEvent( QgsMapMouseEvent *e )
if ( !labelIsRotatable( mCurrentLabel.layer, mCurrentLabel.settings, rotationCol ) ) if ( !labelIsRotatable( mCurrentLabel.layer, mCurrentLabel.settings, rotationCol ) )
{ {
QgsPalIndexes indexes; QgsPalIndexes indexes;
if ( createAuxiliaryFields( indexes ) ) if ( createAuxiliaryFields( indexes, false ) )
return; return;
if ( !labelIsRotatable( mCurrentLabel.layer, mCurrentLabel.settings, rotationCol ) ) if ( !labelIsRotatable( mCurrentLabel.layer, mCurrentLabel.settings, rotationCol ) )

View File

@ -331,7 +331,7 @@ bool QgsMapToolShowHideLabels::showHide( const QgsLabelPosition &pos, bool show
if ( !diagramCanShowHide( vlayer, showCol ) ) if ( !diagramCanShowHide( vlayer, showCol ) )
{ {
QgsDiagramIndexes indexes; QgsDiagramIndexes indexes;
createAuxiliaryFields( details, indexes ); createAuxiliaryFields( details, indexes, false );
showCol = indexes[ QgsDiagramLayerSettings::Show ]; showCol = indexes[ QgsDiagramLayerSettings::Show ];
} }
@ -341,7 +341,7 @@ bool QgsMapToolShowHideLabels::showHide( const QgsLabelPosition &pos, bool show
if ( !labelCanShowHide( vlayer, showCol ) ) if ( !labelCanShowHide( vlayer, showCol ) )
{ {
QgsPalIndexes indexes; QgsPalIndexes indexes;
createAuxiliaryFields( details, indexes ); createAuxiliaryFields( details, indexes, false );
showCol = indexes[ QgsPalLayerSettings::Show ]; showCol = indexes[ QgsPalLayerSettings::Show ];
} }