27 d =
new QgsTextBackgroundSettingsPrivate();
49 if ( !d->enabled == other.
enabled()
50 || d->type != other.
type()
51 || d->svgFile != other.
svgFile()
53 || d->size != other.
size()
58 || d->offset != other.
offset()
61 || d->radii != other.
radii()
67 || d->opacity != other.
opacity()
74 if (
static_cast< bool >( d->paintEffect ) !=
static_cast< bool >( other.
paintEffect() )
78 if (
static_cast< bool >( d->markerSymbol ) !=
static_cast< bool >( other.
markerSymbol() )
87 return !( *
this == other );
122 return d->markerSymbol.get();
127 d->markerSymbol.reset( symbol );
162 return d->sizeMapUnitScale;
167 d->sizeMapUnitScale = scale;
172 return d->rotationType;
177 d->rotationType =
type;
202 return d->offsetUnits;
207 d->offsetUnits = units;
212 return d->offsetMapUnitScale;
217 d->offsetMapUnitScale = scale;
232 return d->radiiUnits;
237 d->radiiUnits = units;
242 return d->radiiMapUnitScale;
247 d->radiiMapUnitScale = scale;
277 d->fillColor = color;
282 return d->strokeColor;
287 d->strokeColor = color;
292 return d->strokeWidth;
297 d->strokeWidth = width;
302 return d->strokeWidthUnits;
307 d->strokeWidthUnits = units;
312 return d->strokeWidthMapUnitScale;
317 d->strokeWidthMapUnitScale = scale;
327 d->joinStyle = style;
332 return d->paintEffect.get();
337 d->paintEffect.reset( effect );
342 d->enabled = layer->
customProperty( QStringLiteral(
"labeling/shapeDraw" ), QVariant(
false ) ).toBool();
344 d->svgFile = layer->
customProperty( QStringLiteral(
"labeling/shapeSVGFile" ), QVariant(
"" ) ).toString();
346 d->size = QSizeF( layer->
customProperty( QStringLiteral(
"labeling/shapeSizeX" ), QVariant( 0.0 ) ).toDouble(),
347 layer->
customProperty( QStringLiteral(
"labeling/shapeSizeY" ), QVariant( 0.0 ) ).toDouble() );
349 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeSizeUnit" ) ).toString().isEmpty() )
358 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeSizeMapUnitScale" ) ).toString().isEmpty() )
361 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/shapeSizeMapUnitMinScale" ), 0.0 ).toDouble();
362 d->sizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
363 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/shapeSizeMapUnitMaxScale" ), 0.0 ).toDouble();
364 d->sizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
371 d->rotation = layer->
customProperty( QStringLiteral(
"labeling/shapeRotation" ), QVariant( 0.0 ) ).toDouble();
372 d->offset = QPointF( layer->
customProperty( QStringLiteral(
"labeling/shapeOffsetX" ), QVariant( 0.0 ) ).toDouble(),
373 layer->
customProperty( QStringLiteral(
"labeling/shapeOffsetY" ), QVariant( 0.0 ) ).toDouble() );
375 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeOffsetUnit" ) ).toString().isEmpty() )
384 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeOffsetMapUnitScale" ) ).toString().isEmpty() )
387 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/shapeOffsetMapUnitMinScale" ), 0.0 ).toDouble();
388 d->offsetMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
389 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/shapeOffsetMapUnitMaxScale" ), 0.0 ).toDouble();
390 d->offsetMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
396 d->radii = QSizeF( layer->
customProperty( QStringLiteral(
"labeling/shapeRadiiX" ), QVariant( 0.0 ) ).toDouble(),
397 layer->
customProperty( QStringLiteral(
"labeling/shapeRadiiY" ), QVariant( 0.0 ) ).toDouble() );
400 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeRadiiUnit" ) ).toString().isEmpty() )
409 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeRadiiMapUnitScale" ) ).toString().isEmpty() )
412 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/shapeRadiiMapUnitMinScale" ), 0.0 ).toDouble();
413 d->radiiMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
414 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/shapeRadiiMapUnitMaxScale" ), 0.0 ).toDouble();
415 d->radiiMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
423 d->strokeWidth = layer->
customProperty( QStringLiteral(
"labeling/shapeBorderWidth" ), QVariant( .0 ) ).toDouble();
424 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeBorderWidthUnit" ) ).toString().isEmpty() )
432 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeBorderWidthMapUnitScale" ) ).toString().isEmpty() )
435 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/shapeBorderWidthMapUnitMinScale" ), 0.0 ).toDouble();
436 d->strokeWidthMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
437 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/shapeBorderWidthMapUnitMaxScale" ), 0.0 ).toDouble();
438 d->strokeWidthMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
444 d->joinStyle =
static_cast< Qt::PenJoinStyle
>( layer->
customProperty( QStringLiteral(
"labeling/shapeJoinStyle" ), QVariant( Qt::BevelJoin ) ).toUInt() );
446 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeOpacity" ) ).toString().isEmpty() )
448 d->opacity = ( 1 - layer->
customProperty( QStringLiteral(
"labeling/shapeTransparency" ) ).toInt() / 100.0 );
452 d->opacity = ( layer->
customProperty( QStringLiteral(
"labeling/shapeOpacity" ) ).toDouble() );
457 if ( layer->
customProperty( QStringLiteral(
"labeling/shapeEffect" ) ).isValid() )
459 QDomDocument doc( QStringLiteral(
"effect" ) );
460 doc.setContent( layer->
customProperty( QStringLiteral(
"labeling/shapeEffect" ) ).toString() );
461 QDomElement effectElem = doc.firstChildElement( QStringLiteral(
"effect" ) ).firstChildElement( QStringLiteral(
"effect" ) );
470 QDomElement backgroundElem = elem.firstChildElement( QStringLiteral(
"background" ) );
471 d->enabled = backgroundElem.attribute( QStringLiteral(
"shapeDraw" ), QStringLiteral(
"0" ) ).toInt();
472 d->type =
static_cast< ShapeType >( backgroundElem.attribute( QStringLiteral(
"shapeType" ), QString::number(
ShapeRectangle ) ).toUInt() );
474 d->sizeType =
static_cast< SizeType >( backgroundElem.attribute( QStringLiteral(
"shapeSizeType" ), QString::number(
SizeBuffer ) ).toUInt() );
475 d->size = QSizeF( backgroundElem.attribute( QStringLiteral(
"shapeSizeX" ), QStringLiteral(
"0" ) ).toDouble(),
476 backgroundElem.attribute( QStringLiteral(
"shapeSizeY" ), QStringLiteral(
"0" ) ).toDouble() );
478 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeSizeUnit" ) ) )
487 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeSizeMapUnitScale" ) ) )
490 double oldMin = backgroundElem.attribute( QStringLiteral(
"shapeSizeMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
491 d->sizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
492 double oldMax = backgroundElem.attribute( QStringLiteral(
"shapeSizeMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
493 d->sizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
499 d->rotationType =
static_cast< RotationType >( backgroundElem.attribute( QStringLiteral(
"shapeRotationType" ), QString::number(
RotationSync ) ).toUInt() );
500 d->rotation = backgroundElem.attribute( QStringLiteral(
"shapeRotation" ), QStringLiteral(
"0" ) ).toDouble();
501 d->offset = QPointF( backgroundElem.attribute( QStringLiteral(
"shapeOffsetX" ), QStringLiteral(
"0" ) ).toDouble(),
502 backgroundElem.attribute( QStringLiteral(
"shapeOffsetY" ), QStringLiteral(
"0" ) ).toDouble() );
504 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeOffsetUnit" ) ) )
513 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeOffsetMapUnitScale" ) ) )
516 double oldMin = backgroundElem.attribute( QStringLiteral(
"shapeOffsetMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
517 d->offsetMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
518 double oldMax = backgroundElem.attribute( QStringLiteral(
"shapeOffsetMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
519 d->offsetMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
525 d->radii = QSizeF( backgroundElem.attribute( QStringLiteral(
"shapeRadiiX" ), QStringLiteral(
"0" ) ).toDouble(),
526 backgroundElem.attribute( QStringLiteral(
"shapeRadiiY" ), QStringLiteral(
"0" ) ).toDouble() );
528 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeRadiiUnit" ) ) )
536 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeRadiiMapUnitScale" ) ) )
539 double oldMin = backgroundElem.attribute( QStringLiteral(
"shapeRadiiMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
540 d->radiiMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
541 double oldMax = backgroundElem.attribute( QStringLiteral(
"shapeRadiiMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
542 d->radiiMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
550 d->strokeWidth = backgroundElem.attribute( QStringLiteral(
"shapeBorderWidth" ), QStringLiteral(
"0" ) ).toDouble();
552 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeBorderWidthUnit" ) ) )
560 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeBorderWidthMapUnitScale" ) ) )
563 double oldMin = backgroundElem.attribute( QStringLiteral(
"shapeBorderWidthMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
564 d->strokeWidthMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
565 double oldMax = backgroundElem.attribute( QStringLiteral(
"shapeBorderWidthMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
566 d->strokeWidthMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
572 d->joinStyle =
static_cast< Qt::PenJoinStyle
>( backgroundElem.attribute( QStringLiteral(
"shapeJoinStyle" ), QString::number( Qt::BevelJoin ) ).toUInt() );
574 if ( !backgroundElem.hasAttribute( QStringLiteral(
"shapeOpacity" ) ) )
576 d->opacity = ( 1 - backgroundElem.attribute( QStringLiteral(
"shapeTransparency" ) ).toInt() / 100.0 );
580 d->opacity = ( backgroundElem.attribute( QStringLiteral(
"shapeOpacity" ) ).toDouble() );
586 QDomElement effectElem = backgroundElem.firstChildElement( QStringLiteral(
"effect" ) );
587 if ( !effectElem.isNull() )
592 const QDomElement symbolElem = backgroundElem.firstChildElement( QStringLiteral(
"symbol" ) );
593 if ( !symbolElem.isNull() )
594 setMarkerSymbol( QgsSymbolLayerUtils::loadSymbol< QgsMarkerSymbol >( symbolElem, context ) );
601 QDomElement backgroundElem = doc.createElement( QStringLiteral(
"background" ) );
602 backgroundElem.setAttribute( QStringLiteral(
"shapeDraw" ), d->enabled );
603 backgroundElem.setAttribute( QStringLiteral(
"shapeType" ),
static_cast< unsigned int >( d->type ) );
605 backgroundElem.setAttribute( QStringLiteral(
"shapeSizeType" ),
static_cast< unsigned int >( d->sizeType ) );
606 backgroundElem.setAttribute( QStringLiteral(
"shapeSizeX" ), d->size.width() );
607 backgroundElem.setAttribute( QStringLiteral(
"shapeSizeY" ), d->size.height() );
610 backgroundElem.setAttribute( QStringLiteral(
"shapeRotationType" ),
static_cast< unsigned int >( d->rotationType ) );
611 backgroundElem.setAttribute( QStringLiteral(
"shapeRotation" ), d->rotation );
612 backgroundElem.setAttribute( QStringLiteral(
"shapeOffsetX" ), d->offset.x() );
613 backgroundElem.setAttribute( QStringLiteral(
"shapeOffsetY" ), d->offset.y() );
616 backgroundElem.setAttribute( QStringLiteral(
"shapeRadiiX" ), d->radii.width() );
617 backgroundElem.setAttribute( QStringLiteral(
"shapeRadiiY" ), d->radii.height() );
622 backgroundElem.setAttribute( QStringLiteral(
"shapeBorderWidth" ), d->strokeWidth );
623 backgroundElem.setAttribute( QStringLiteral(
"shapeBorderWidthUnit" ),
QgsUnitTypes::encodeUnit( d->strokeWidthUnits ) );
625 backgroundElem.setAttribute( QStringLiteral(
"shapeJoinStyle" ),
static_cast< unsigned int >( d->joinStyle ) );
626 backgroundElem.setAttribute( QStringLiteral(
"shapeOpacity" ), d->opacity );
629 d->paintEffect->saveProperties( doc, backgroundElem );
631 if ( d->markerSymbol )
634 return backgroundElem;
657 if ( exprVal.isValid() )
659 QString units = exprVal.toString();
660 if ( !units.isEmpty() )
670 if ( exprVal.isValid() )
672 const QString skind = exprVal.toString().trimmed();
673 if ( !skind.isEmpty() )
680 if ( exprVal.isValid() )
682 QString stype = exprVal.toString().trimmed();
683 if ( !stype.isEmpty() )
692 if ( exprVal.isValid() )
694 QString svgfile = exprVal.toString().trimmed();
704 if ( exprVal.isValid() )
706 QString rotstr = exprVal.toString().trimmed();
707 if ( !rotstr.isEmpty() )
714 if ( exprVal.isValid() )
724 if ( exprVal.isValid() )
726 QString units = exprVal.toString();
727 if ( !units.isEmpty() )
732 d->offsetUnits = res;
737 if ( exprVal.isValid() )
748 if ( exprVal.isValid() )
750 QString units = exprVal.toString();
751 if ( !units.isEmpty() )
783 if ( exprVal.isValid() )
785 QString units = exprVal.toString();
786 if ( !units.isEmpty() )
791 d->strokeWidthUnits = res;
798 QString blendstr = exprVal.toString().trimmed();
799 if ( !blendstr.isEmpty() )
806 QString joinstr = exprVal.toString().trimmed();
807 if ( !joinstr.isEmpty() )
816 QSet< QString > fields;
817 if ( d->markerSymbol )
819 fields.unite( d->markerSymbol->usedAttributes( context ) );