Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgstextbackgroundsettings.cpp
3 : : -----------------
4 : : begin : May 2020
5 : : copyright : (C) Nyall Dawson
6 : : email : nyall dot dawson at gmail dot com
7 : : ***************************************************************************
8 : : * *
9 : : * This program is free software; you can redistribute it and/or modify *
10 : : * it under the terms of the GNU General Public License as published by *
11 : : * the Free Software Foundation; either version 2 of the License, or *
12 : : * (at your option) any later version. *
13 : : * *
14 : : ***************************************************************************/
15 : :
16 : : #include "qgstextbackgroundsettings.h"
17 : : #include "qgstextrenderer_p.h"
18 : : #include "qgsvectorlayer.h"
19 : : #include "qgspallabeling.h"
20 : : #include "qgssymbollayerutils.h"
21 : : #include "qgspainting.h"
22 : : #include "qgstextrendererutils.h"
23 : : #include "qgspainteffectregistry.h"
24 : :
25 : 78 : QgsTextBackgroundSettings::QgsTextBackgroundSettings()
26 : : {
27 : 78 : d = new QgsTextBackgroundSettingsPrivate();
28 : 78 : }
29 : :
30 : 0 : QgsTextBackgroundSettings::QgsTextBackgroundSettings( const QgsTextBackgroundSettings &other ) //NOLINT
31 : 0 : : d( other.d )
32 : : {
33 : :
34 : 0 : }
35 : :
36 : 0 : QgsTextBackgroundSettings &QgsTextBackgroundSettings::operator=( const QgsTextBackgroundSettings &other ) //NOLINT
37 : : {
38 : 0 : d = other.d;
39 : 0 : return *this;
40 : : }
41 : :
42 : 62 : QgsTextBackgroundSettings::~QgsTextBackgroundSettings() //NOLINT
43 : : {
44 : :
45 : 62 : }
46 : :
47 : 0 : bool QgsTextBackgroundSettings::operator==( const QgsTextBackgroundSettings &other ) const
48 : : {
49 : 0 : if ( !d->enabled == other.enabled()
50 : 0 : || d->type != other.type()
51 : 0 : || d->svgFile != other.svgFile()
52 : 0 : || d->sizeType != other.sizeType()
53 : 0 : || d->size != other.size()
54 : 0 : || d->sizeUnits != other.sizeUnit()
55 : 0 : || d->sizeMapUnitScale != other.sizeMapUnitScale()
56 : 0 : || d->rotationType != other.rotationType()
57 : 0 : || d->rotation != other.rotation()
58 : 0 : || d->offset != other.offset()
59 : 0 : || d->offsetUnits != other.offsetUnit()
60 : 0 : || d->offsetMapUnitScale != other.offsetMapUnitScale()
61 : 0 : || d->radii != other.radii()
62 : 0 : || d->radiiUnits != other.radiiUnit()
63 : 0 : || d->radiiMapUnitScale != other.radiiMapUnitScale()
64 : 0 : || d->blendMode != other.blendMode()
65 : 0 : || d->fillColor != other.fillColor()
66 : 0 : || d->strokeColor != other.strokeColor()
67 : 0 : || d->opacity != other.opacity()
68 : 0 : || d->strokeWidth != other.strokeWidth()
69 : 0 : || d->strokeWidthUnits != other.strokeWidthUnit()
70 : 0 : || d->strokeWidthMapUnitScale != other.strokeWidthMapUnitScale()
71 : 0 : || d->joinStyle != other.joinStyle() )
72 : 0 : return false;
73 : :
74 : 0 : if ( static_cast< bool >( d->paintEffect ) != static_cast< bool >( other.paintEffect() )
75 : 0 : || ( d->paintEffect && d->paintEffect->properties() != other.paintEffect()->properties() ) )
76 : 0 : return false;
77 : :
78 : 0 : if ( static_cast< bool >( d->markerSymbol ) != static_cast< bool >( other.markerSymbol() )
79 : 0 : || ( d->markerSymbol && QgsSymbolLayerUtils::symbolProperties( d->markerSymbol.get() ) != QgsSymbolLayerUtils::symbolProperties( other.markerSymbol() ) ) )
80 : 0 : return false;
81 : :
82 : 0 : return true;
83 : 0 : }
84 : :
85 : 0 : bool QgsTextBackgroundSettings::operator!=( const QgsTextBackgroundSettings &other ) const
86 : : {
87 : 0 : return !( *this == other );
88 : : }
89 : :
90 : 0 : bool QgsTextBackgroundSettings::enabled() const
91 : : {
92 : 0 : return d->enabled;
93 : : }
94 : :
95 : 0 : void QgsTextBackgroundSettings::setEnabled( bool enabled )
96 : : {
97 : 0 : d->enabled = enabled;
98 : 0 : }
99 : :
100 : 0 : QgsTextBackgroundSettings::ShapeType QgsTextBackgroundSettings::type() const
101 : : {
102 : 0 : return d->type;
103 : : }
104 : :
105 : 0 : void QgsTextBackgroundSettings::setType( QgsTextBackgroundSettings::ShapeType type )
106 : : {
107 : 0 : d->type = type;
108 : 0 : }
109 : :
110 : 0 : QString QgsTextBackgroundSettings::svgFile() const
111 : : {
112 : 0 : return d->svgFile;
113 : : }
114 : :
115 : 0 : void QgsTextBackgroundSettings::setSvgFile( const QString &file )
116 : : {
117 : 0 : d->svgFile = file;
118 : 0 : }
119 : :
120 : 0 : QgsMarkerSymbol *QgsTextBackgroundSettings::markerSymbol() const
121 : : {
122 : 0 : return d->markerSymbol.get();
123 : : }
124 : :
125 : 0 : void QgsTextBackgroundSettings::setMarkerSymbol( QgsMarkerSymbol *symbol )
126 : : {
127 : 0 : d->markerSymbol.reset( symbol );
128 : 0 : }
129 : :
130 : 0 : QgsTextBackgroundSettings::SizeType QgsTextBackgroundSettings::sizeType() const
131 : : {
132 : 0 : return d->sizeType;
133 : : }
134 : :
135 : 0 : void QgsTextBackgroundSettings::setSizeType( QgsTextBackgroundSettings::SizeType type )
136 : : {
137 : 0 : d->sizeType = type;
138 : 0 : }
139 : :
140 : 0 : QSizeF QgsTextBackgroundSettings::size() const
141 : : {
142 : 0 : return d->size;
143 : : }
144 : :
145 : 0 : void QgsTextBackgroundSettings::setSize( QSizeF size )
146 : : {
147 : 0 : d->size = size;
148 : 0 : }
149 : :
150 : 0 : QgsUnitTypes::RenderUnit QgsTextBackgroundSettings::sizeUnit() const
151 : : {
152 : 0 : return d->sizeUnits;
153 : : }
154 : :
155 : 0 : void QgsTextBackgroundSettings::setSizeUnit( QgsUnitTypes::RenderUnit unit )
156 : : {
157 : 0 : d->sizeUnits = unit;
158 : 0 : }
159 : :
160 : 0 : QgsMapUnitScale QgsTextBackgroundSettings::sizeMapUnitScale() const
161 : : {
162 : 0 : return d->sizeMapUnitScale;
163 : : }
164 : :
165 : 0 : void QgsTextBackgroundSettings::setSizeMapUnitScale( const QgsMapUnitScale &scale )
166 : : {
167 : 0 : d->sizeMapUnitScale = scale;
168 : 0 : }
169 : :
170 : 0 : QgsTextBackgroundSettings::RotationType QgsTextBackgroundSettings::rotationType() const
171 : : {
172 : 0 : return d->rotationType;
173 : : }
174 : :
175 : 0 : void QgsTextBackgroundSettings::setRotationType( QgsTextBackgroundSettings::RotationType type )
176 : : {
177 : 0 : d->rotationType = type;
178 : 0 : }
179 : :
180 : 0 : double QgsTextBackgroundSettings::rotation() const
181 : : {
182 : 0 : return d->rotation;
183 : : }
184 : :
185 : 0 : void QgsTextBackgroundSettings::setRotation( double rotation )
186 : : {
187 : 0 : d->rotation = rotation;
188 : 0 : }
189 : :
190 : 0 : QPointF QgsTextBackgroundSettings::offset() const
191 : : {
192 : 0 : return d->offset;
193 : : }
194 : :
195 : 0 : void QgsTextBackgroundSettings::setOffset( QPointF offset )
196 : : {
197 : 0 : d->offset = offset;
198 : 0 : }
199 : :
200 : 0 : QgsUnitTypes::RenderUnit QgsTextBackgroundSettings::offsetUnit() const
201 : : {
202 : 0 : return d->offsetUnits;
203 : : }
204 : :
205 : 0 : void QgsTextBackgroundSettings::setOffsetUnit( QgsUnitTypes::RenderUnit units )
206 : : {
207 : 0 : d->offsetUnits = units;
208 : 0 : }
209 : :
210 : 0 : QgsMapUnitScale QgsTextBackgroundSettings::offsetMapUnitScale() const
211 : : {
212 : 0 : return d->offsetMapUnitScale;
213 : : }
214 : :
215 : 0 : void QgsTextBackgroundSettings::setOffsetMapUnitScale( const QgsMapUnitScale &scale )
216 : : {
217 : 0 : d->offsetMapUnitScale = scale;
218 : 0 : }
219 : :
220 : 0 : QSizeF QgsTextBackgroundSettings::radii() const
221 : : {
222 : 0 : return d->radii;
223 : : }
224 : :
225 : 0 : void QgsTextBackgroundSettings::setRadii( QSizeF radii )
226 : : {
227 : 0 : d->radii = radii;
228 : 0 : }
229 : :
230 : 0 : QgsUnitTypes::RenderUnit QgsTextBackgroundSettings::radiiUnit() const
231 : : {
232 : 0 : return d->radiiUnits;
233 : : }
234 : :
235 : 0 : void QgsTextBackgroundSettings::setRadiiUnit( QgsUnitTypes::RenderUnit units )
236 : : {
237 : 0 : d->radiiUnits = units;
238 : 0 : }
239 : :
240 : 0 : QgsMapUnitScale QgsTextBackgroundSettings::radiiMapUnitScale() const
241 : : {
242 : 0 : return d->radiiMapUnitScale;
243 : : }
244 : :
245 : 0 : void QgsTextBackgroundSettings::setRadiiMapUnitScale( const QgsMapUnitScale &scale )
246 : : {
247 : 0 : d->radiiMapUnitScale = scale;
248 : 0 : }
249 : :
250 : 0 : double QgsTextBackgroundSettings::opacity() const
251 : : {
252 : 0 : return d->opacity;
253 : : }
254 : :
255 : 0 : void QgsTextBackgroundSettings::setOpacity( double opacity )
256 : : {
257 : 0 : d->opacity = opacity;
258 : 0 : }
259 : :
260 : 0 : QPainter::CompositionMode QgsTextBackgroundSettings::blendMode() const
261 : : {
262 : 0 : return d->blendMode;
263 : : }
264 : :
265 : 0 : void QgsTextBackgroundSettings::setBlendMode( QPainter::CompositionMode mode )
266 : : {
267 : 0 : d->blendMode = mode;
268 : 0 : }
269 : :
270 : 0 : QColor QgsTextBackgroundSettings::fillColor() const
271 : : {
272 : 0 : return d->fillColor;
273 : : }
274 : :
275 : 0 : void QgsTextBackgroundSettings::setFillColor( const QColor &color )
276 : : {
277 : 0 : d->fillColor = color;
278 : 0 : }
279 : :
280 : 0 : QColor QgsTextBackgroundSettings::strokeColor() const
281 : : {
282 : 0 : return d->strokeColor;
283 : : }
284 : :
285 : 0 : void QgsTextBackgroundSettings::setStrokeColor( const QColor &color )
286 : : {
287 : 0 : d->strokeColor = color;
288 : 0 : }
289 : :
290 : 0 : double QgsTextBackgroundSettings::strokeWidth() const
291 : : {
292 : 0 : return d->strokeWidth;
293 : : }
294 : :
295 : 0 : void QgsTextBackgroundSettings::setStrokeWidth( double width )
296 : : {
297 : 0 : d->strokeWidth = width;
298 : 0 : }
299 : :
300 : 0 : QgsUnitTypes::RenderUnit QgsTextBackgroundSettings::strokeWidthUnit() const
301 : : {
302 : 0 : return d->strokeWidthUnits;
303 : : }
304 : :
305 : 0 : void QgsTextBackgroundSettings::setStrokeWidthUnit( QgsUnitTypes::RenderUnit units )
306 : : {
307 : 0 : d->strokeWidthUnits = units;
308 : 0 : }
309 : :
310 : 0 : QgsMapUnitScale QgsTextBackgroundSettings::strokeWidthMapUnitScale() const
311 : : {
312 : 0 : return d->strokeWidthMapUnitScale;
313 : : }
314 : :
315 : 0 : void QgsTextBackgroundSettings::setStrokeWidthMapUnitScale( const QgsMapUnitScale &scale )
316 : : {
317 : 0 : d->strokeWidthMapUnitScale = scale;
318 : 0 : }
319 : :
320 : 0 : Qt::PenJoinStyle QgsTextBackgroundSettings::joinStyle() const
321 : : {
322 : 0 : return d->joinStyle;
323 : : }
324 : :
325 : 0 : void QgsTextBackgroundSettings::setJoinStyle( Qt::PenJoinStyle style )
326 : : {
327 : 0 : d->joinStyle = style;
328 : 0 : }
329 : :
330 : 0 : const QgsPaintEffect *QgsTextBackgroundSettings::paintEffect() const
331 : : {
332 : 0 : return d->paintEffect.get();
333 : : }
334 : :
335 : 0 : void QgsTextBackgroundSettings::setPaintEffect( QgsPaintEffect *effect )
336 : : {
337 : 0 : d->paintEffect.reset( effect );
338 : 0 : }
339 : :
340 : 0 : void QgsTextBackgroundSettings::readFromLayer( QgsVectorLayer *layer )
341 : : {
342 : 0 : d->enabled = layer->customProperty( QStringLiteral( "labeling/shapeDraw" ), QVariant( false ) ).toBool();
343 : 0 : d->type = static_cast< ShapeType >( layer->customProperty( QStringLiteral( "labeling/shapeType" ), QVariant( ShapeRectangle ) ).toUInt() );
344 : 0 : d->svgFile = layer->customProperty( QStringLiteral( "labeling/shapeSVGFile" ), QVariant( "" ) ).toString();
345 : 0 : d->sizeType = static_cast< SizeType >( layer->customProperty( QStringLiteral( "labeling/shapeSizeType" ), QVariant( SizeBuffer ) ).toUInt() );
346 : 0 : d->size = QSizeF( layer->customProperty( QStringLiteral( "labeling/shapeSizeX" ), QVariant( 0.0 ) ).toDouble(),
347 : 0 : layer->customProperty( QStringLiteral( "labeling/shapeSizeY" ), QVariant( 0.0 ) ).toDouble() );
348 : :
349 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeSizeUnit" ) ).toString().isEmpty() )
350 : : {
351 : 0 : d->sizeUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shapeSizeUnits" ), 0 ).toUInt() );
352 : 0 : }
353 : : else
354 : : {
355 : 0 : d->sizeUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shapeSizeUnit" ) ).toString() );
356 : : }
357 : :
358 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeSizeMapUnitScale" ) ).toString().isEmpty() )
359 : : {
360 : : //fallback to older property
361 : 0 : double oldMin = layer->customProperty( QStringLiteral( "labeling/shapeSizeMapUnitMinScale" ), 0.0 ).toDouble();
362 : 0 : d->sizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
363 : 0 : double oldMax = layer->customProperty( QStringLiteral( "labeling/shapeSizeMapUnitMaxScale" ), 0.0 ).toDouble();
364 : 0 : d->sizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
365 : 0 : }
366 : : else
367 : : {
368 : 0 : d->sizeMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shapeSizeMapUnitScale" ) ).toString() );
369 : : }
370 : 0 : d->rotationType = static_cast< RotationType >( layer->customProperty( QStringLiteral( "labeling/shapeRotationType" ), QVariant( RotationSync ) ).toUInt() );
371 : 0 : d->rotation = layer->customProperty( QStringLiteral( "labeling/shapeRotation" ), QVariant( 0.0 ) ).toDouble();
372 : 0 : d->offset = QPointF( layer->customProperty( QStringLiteral( "labeling/shapeOffsetX" ), QVariant( 0.0 ) ).toDouble(),
373 : 0 : layer->customProperty( QStringLiteral( "labeling/shapeOffsetY" ), QVariant( 0.0 ) ).toDouble() );
374 : :
375 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeOffsetUnit" ) ).toString().isEmpty() )
376 : : {
377 : 0 : d->offsetUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shapeOffsetUnits" ), 0 ).toUInt() );
378 : 0 : }
379 : : else
380 : : {
381 : 0 : d->offsetUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shapeOffsetUnit" ) ).toString() );
382 : : }
383 : :
384 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeOffsetMapUnitScale" ) ).toString().isEmpty() )
385 : : {
386 : : //fallback to older property
387 : 0 : double oldMin = layer->customProperty( QStringLiteral( "labeling/shapeOffsetMapUnitMinScale" ), 0.0 ).toDouble();
388 : 0 : d->offsetMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
389 : 0 : double oldMax = layer->customProperty( QStringLiteral( "labeling/shapeOffsetMapUnitMaxScale" ), 0.0 ).toDouble();
390 : 0 : d->offsetMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
391 : 0 : }
392 : : else
393 : : {
394 : 0 : d->offsetMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shapeOffsetMapUnitScale" ) ).toString() );
395 : : }
396 : 0 : d->radii = QSizeF( layer->customProperty( QStringLiteral( "labeling/shapeRadiiX" ), QVariant( 0.0 ) ).toDouble(),
397 : 0 : layer->customProperty( QStringLiteral( "labeling/shapeRadiiY" ), QVariant( 0.0 ) ).toDouble() );
398 : :
399 : :
400 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeRadiiUnit" ) ).toString().isEmpty() )
401 : : {
402 : 0 : d->radiiUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shapeRadiiUnits" ), 0 ).toUInt() );
403 : 0 : }
404 : : else
405 : : {
406 : 0 : d->radiiUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shapeRadiiUnit" ) ).toString() );
407 : : }
408 : :
409 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeRadiiMapUnitScale" ) ).toString().isEmpty() )
410 : : {
411 : : //fallback to older property
412 : 0 : double oldMin = layer->customProperty( QStringLiteral( "labeling/shapeRadiiMapUnitMinScale" ), 0.0 ).toDouble();
413 : 0 : d->radiiMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
414 : 0 : double oldMax = layer->customProperty( QStringLiteral( "labeling/shapeRadiiMapUnitMaxScale" ), 0.0 ).toDouble();
415 : 0 : d->radiiMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
416 : 0 : }
417 : : else
418 : : {
419 : 0 : d->radiiMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shapeRadiiMapUnitScale" ) ).toString() );
420 : : }
421 : 0 : d->fillColor = QgsTextRendererUtils::readColor( layer, QStringLiteral( "labeling/shapeFillColor" ), Qt::white, true );
422 : 0 : d->strokeColor = QgsTextRendererUtils::readColor( layer, QStringLiteral( "labeling/shapeBorderColor" ), Qt::darkGray, true );
423 : 0 : d->strokeWidth = layer->customProperty( QStringLiteral( "labeling/shapeBorderWidth" ), QVariant( .0 ) ).toDouble();
424 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthUnit" ) ).toString().isEmpty() )
425 : : {
426 : 0 : d->strokeWidthUnits = QgsTextRendererUtils::convertFromOldLabelUnit( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthUnits" ), 0 ).toUInt() );
427 : 0 : }
428 : : else
429 : : {
430 : 0 : d->strokeWidthUnits = QgsUnitTypes::decodeRenderUnit( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthUnit" ) ).toString() );
431 : : }
432 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthMapUnitScale" ) ).toString().isEmpty() )
433 : : {
434 : : //fallback to older property
435 : 0 : double oldMin = layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthMapUnitMinScale" ), 0.0 ).toDouble();
436 : 0 : d->strokeWidthMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
437 : 0 : double oldMax = layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthMapUnitMaxScale" ), 0.0 ).toDouble();
438 : 0 : d->strokeWidthMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
439 : 0 : }
440 : : else
441 : : {
442 : 0 : d->strokeWidthMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( layer->customProperty( QStringLiteral( "labeling/shapeBorderWidthMapUnitScale" ) ).toString() );
443 : : }
444 : 0 : d->joinStyle = static_cast< Qt::PenJoinStyle >( layer->customProperty( QStringLiteral( "labeling/shapeJoinStyle" ), QVariant( Qt::BevelJoin ) ).toUInt() );
445 : :
446 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeOpacity" ) ).toString().isEmpty() )
447 : : {
448 : 0 : d->opacity = ( 1 - layer->customProperty( QStringLiteral( "labeling/shapeTransparency" ) ).toInt() / 100.0 ); //0 -100
449 : 0 : }
450 : : else
451 : : {
452 : 0 : d->opacity = ( layer->customProperty( QStringLiteral( "labeling/shapeOpacity" ) ).toDouble() );
453 : : }
454 : 0 : d->blendMode = QgsPainting::getCompositionMode(
455 : 0 : static_cast< QgsPainting::BlendMode >( layer->customProperty( QStringLiteral( "labeling/shapeBlendMode" ), QVariant( QgsPainting::BlendNormal ) ).toUInt() ) );
456 : :
457 : 0 : if ( layer->customProperty( QStringLiteral( "labeling/shapeEffect" ) ).isValid() )
458 : : {
459 : 0 : QDomDocument doc( QStringLiteral( "effect" ) );
460 : 0 : doc.setContent( layer->customProperty( QStringLiteral( "labeling/shapeEffect" ) ).toString() );
461 : 0 : QDomElement effectElem = doc.firstChildElement( QStringLiteral( "effect" ) ).firstChildElement( QStringLiteral( "effect" ) );
462 : 0 : setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
463 : 0 : }
464 : : else
465 : 0 : setPaintEffect( nullptr );
466 : 0 : }
467 : :
468 : 0 : void QgsTextBackgroundSettings::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
469 : : {
470 : 0 : QDomElement backgroundElem = elem.firstChildElement( QStringLiteral( "background" ) );
471 : 0 : d->enabled = backgroundElem.attribute( QStringLiteral( "shapeDraw" ), QStringLiteral( "0" ) ).toInt();
472 : 0 : d->type = static_cast< ShapeType >( backgroundElem.attribute( QStringLiteral( "shapeType" ), QString::number( ShapeRectangle ) ).toUInt() );
473 : 0 : d->svgFile = QgsSymbolLayerUtils::svgSymbolNameToPath( backgroundElem.attribute( QStringLiteral( "shapeSVGFile" ) ), context.pathResolver() );
474 : 0 : d->sizeType = static_cast< SizeType >( backgroundElem.attribute( QStringLiteral( "shapeSizeType" ), QString::number( SizeBuffer ) ).toUInt() );
475 : 0 : d->size = QSizeF( backgroundElem.attribute( QStringLiteral( "shapeSizeX" ), QStringLiteral( "0" ) ).toDouble(),
476 : 0 : backgroundElem.attribute( QStringLiteral( "shapeSizeY" ), QStringLiteral( "0" ) ).toDouble() );
477 : :
478 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeSizeUnit" ) ) )
479 : : {
480 : 0 : d->sizeUnits = QgsTextRendererUtils::convertFromOldLabelUnit( backgroundElem.attribute( QStringLiteral( "shapeSizeUnits" ) ).toUInt() );
481 : 0 : }
482 : : else
483 : : {
484 : 0 : d->sizeUnits = QgsUnitTypes::decodeRenderUnit( backgroundElem.attribute( QStringLiteral( "shapeSizeUnit" ) ) );
485 : : }
486 : :
487 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeSizeMapUnitScale" ) ) )
488 : : {
489 : : //fallback to older property
490 : 0 : double oldMin = backgroundElem.attribute( QStringLiteral( "shapeSizeMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
491 : 0 : d->sizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
492 : 0 : double oldMax = backgroundElem.attribute( QStringLiteral( "shapeSizeMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
493 : 0 : d->sizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
494 : 0 : }
495 : : else
496 : : {
497 : 0 : d->sizeMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( backgroundElem.attribute( QStringLiteral( "shapeSizeMapUnitScale" ) ) );
498 : : }
499 : 0 : d->rotationType = static_cast< RotationType >( backgroundElem.attribute( QStringLiteral( "shapeRotationType" ), QString::number( RotationSync ) ).toUInt() );
500 : 0 : d->rotation = backgroundElem.attribute( QStringLiteral( "shapeRotation" ), QStringLiteral( "0" ) ).toDouble();
501 : 0 : d->offset = QPointF( backgroundElem.attribute( QStringLiteral( "shapeOffsetX" ), QStringLiteral( "0" ) ).toDouble(),
502 : 0 : backgroundElem.attribute( QStringLiteral( "shapeOffsetY" ), QStringLiteral( "0" ) ).toDouble() );
503 : :
504 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeOffsetUnit" ) ) )
505 : : {
506 : 0 : d->offsetUnits = QgsTextRendererUtils::convertFromOldLabelUnit( backgroundElem.attribute( QStringLiteral( "shapeOffsetUnits" ) ).toUInt() );
507 : 0 : }
508 : : else
509 : : {
510 : 0 : d->offsetUnits = QgsUnitTypes::decodeRenderUnit( backgroundElem.attribute( QStringLiteral( "shapeOffsetUnit" ) ) );
511 : : }
512 : :
513 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeOffsetMapUnitScale" ) ) )
514 : : {
515 : : //fallback to older property
516 : 0 : double oldMin = backgroundElem.attribute( QStringLiteral( "shapeOffsetMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
517 : 0 : d->offsetMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
518 : 0 : double oldMax = backgroundElem.attribute( QStringLiteral( "shapeOffsetMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
519 : 0 : d->offsetMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
520 : 0 : }
521 : : else
522 : : {
523 : 0 : d->offsetMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( backgroundElem.attribute( QStringLiteral( "shapeOffsetMapUnitScale" ) ) );
524 : : }
525 : 0 : d->radii = QSizeF( backgroundElem.attribute( QStringLiteral( "shapeRadiiX" ), QStringLiteral( "0" ) ).toDouble(),
526 : 0 : backgroundElem.attribute( QStringLiteral( "shapeRadiiY" ), QStringLiteral( "0" ) ).toDouble() );
527 : :
528 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeRadiiUnit" ) ) )
529 : : {
530 : 0 : d->radiiUnits = QgsTextRendererUtils::convertFromOldLabelUnit( backgroundElem.attribute( QStringLiteral( "shapeRadiiUnits" ) ).toUInt() );
531 : 0 : }
532 : : else
533 : : {
534 : 0 : d->radiiUnits = QgsUnitTypes::decodeRenderUnit( backgroundElem.attribute( QStringLiteral( "shapeRadiiUnit" ) ) );
535 : : }
536 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeRadiiMapUnitScale" ) ) )
537 : : {
538 : : //fallback to older property
539 : 0 : double oldMin = backgroundElem.attribute( QStringLiteral( "shapeRadiiMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
540 : 0 : d->radiiMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
541 : 0 : double oldMax = backgroundElem.attribute( QStringLiteral( "shapeRadiiMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
542 : 0 : d->radiiMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
543 : 0 : }
544 : : else
545 : : {
546 : 0 : d->radiiMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( backgroundElem.attribute( QStringLiteral( "shapeRadiiMapUnitScale" ) ) );
547 : : }
548 : 0 : d->fillColor = QgsSymbolLayerUtils::decodeColor( backgroundElem.attribute( QStringLiteral( "shapeFillColor" ), QgsSymbolLayerUtils::encodeColor( Qt::white ) ) );
549 : 0 : d->strokeColor = QgsSymbolLayerUtils::decodeColor( backgroundElem.attribute( QStringLiteral( "shapeBorderColor" ), QgsSymbolLayerUtils::encodeColor( Qt::darkGray ) ) );
550 : 0 : d->strokeWidth = backgroundElem.attribute( QStringLiteral( "shapeBorderWidth" ), QStringLiteral( "0" ) ).toDouble();
551 : :
552 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeBorderWidthUnit" ) ) )
553 : : {
554 : 0 : d->strokeWidthUnits = QgsTextRendererUtils::convertFromOldLabelUnit( backgroundElem.attribute( QStringLiteral( "shapeBorderWidthUnits" ) ).toUInt() );
555 : 0 : }
556 : : else
557 : : {
558 : 0 : d->strokeWidthUnits = QgsUnitTypes::decodeRenderUnit( backgroundElem.attribute( QStringLiteral( "shapeBorderWidthUnit" ) ) );
559 : : }
560 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeBorderWidthMapUnitScale" ) ) )
561 : : {
562 : : //fallback to older property
563 : 0 : double oldMin = backgroundElem.attribute( QStringLiteral( "shapeBorderWidthMapUnitMinScale" ), QStringLiteral( "0" ) ).toDouble();
564 : 0 : d->strokeWidthMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
565 : 0 : double oldMax = backgroundElem.attribute( QStringLiteral( "shapeBorderWidthMapUnitMaxScale" ), QStringLiteral( "0" ) ).toDouble();
566 : 0 : d->strokeWidthMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
567 : 0 : }
568 : : else
569 : : {
570 : 0 : d->strokeWidthMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( backgroundElem.attribute( QStringLiteral( "shapeBorderWidthMapUnitScale" ) ) );
571 : : }
572 : 0 : d->joinStyle = static_cast< Qt::PenJoinStyle >( backgroundElem.attribute( QStringLiteral( "shapeJoinStyle" ), QString::number( Qt::BevelJoin ) ).toUInt() );
573 : :
574 : 0 : if ( !backgroundElem.hasAttribute( QStringLiteral( "shapeOpacity" ) ) )
575 : : {
576 : 0 : d->opacity = ( 1 - backgroundElem.attribute( QStringLiteral( "shapeTransparency" ) ).toInt() / 100.0 ); //0 -100
577 : 0 : }
578 : : else
579 : : {
580 : 0 : d->opacity = ( backgroundElem.attribute( QStringLiteral( "shapeOpacity" ) ).toDouble() );
581 : : }
582 : :
583 : 0 : d->blendMode = QgsPainting::getCompositionMode(
584 : 0 : static_cast< QgsPainting::BlendMode >( backgroundElem.attribute( QStringLiteral( "shapeBlendMode" ), QString::number( QgsPainting::BlendNormal ) ).toUInt() ) );
585 : :
586 : 0 : QDomElement effectElem = backgroundElem.firstChildElement( QStringLiteral( "effect" ) );
587 : 0 : if ( !effectElem.isNull() )
588 : 0 : setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
589 : : else
590 : 0 : setPaintEffect( nullptr );
591 : :
592 : 0 : const QDomElement symbolElem = backgroundElem.firstChildElement( QStringLiteral( "symbol" ) );
593 : 0 : if ( !symbolElem.isNull() )
594 : 0 : setMarkerSymbol( QgsSymbolLayerUtils::loadSymbol< QgsMarkerSymbol >( symbolElem, context ) );
595 : : else
596 : 0 : setMarkerSymbol( nullptr );
597 : 0 : }
598 : :
599 : 0 : QDomElement QgsTextBackgroundSettings::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
600 : : {
601 : 0 : QDomElement backgroundElem = doc.createElement( QStringLiteral( "background" ) );
602 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeDraw" ), d->enabled );
603 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeType" ), static_cast< unsigned int >( d->type ) );
604 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeSVGFile" ), QgsSymbolLayerUtils::svgSymbolPathToName( d->svgFile, context.pathResolver() ) );
605 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeSizeType" ), static_cast< unsigned int >( d->sizeType ) );
606 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeSizeX" ), d->size.width() );
607 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeSizeY" ), d->size.height() );
608 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeSizeUnit" ), QgsUnitTypes::encodeUnit( d->sizeUnits ) );
609 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeSizeMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->sizeMapUnitScale ) );
610 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeRotationType" ), static_cast< unsigned int >( d->rotationType ) );
611 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeRotation" ), d->rotation );
612 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeOffsetX" ), d->offset.x() );
613 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeOffsetY" ), d->offset.y() );
614 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeOffsetUnit" ), QgsUnitTypes::encodeUnit( d->offsetUnits ) );
615 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeOffsetMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->offsetMapUnitScale ) );
616 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeRadiiX" ), d->radii.width() );
617 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeRadiiY" ), d->radii.height() );
618 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeRadiiUnit" ), QgsUnitTypes::encodeUnit( d->radiiUnits ) );
619 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeRadiiMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->radiiMapUnitScale ) );
620 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeFillColor" ), QgsSymbolLayerUtils::encodeColor( d->fillColor ) );
621 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeBorderColor" ), QgsSymbolLayerUtils::encodeColor( d->strokeColor ) );
622 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeBorderWidth" ), d->strokeWidth );
623 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeBorderWidthUnit" ), QgsUnitTypes::encodeUnit( d->strokeWidthUnits ) );
624 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeBorderWidthMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->strokeWidthMapUnitScale ) );
625 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeJoinStyle" ), static_cast< unsigned int >( d->joinStyle ) );
626 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeOpacity" ), d->opacity );
627 : 0 : backgroundElem.setAttribute( QStringLiteral( "shapeBlendMode" ), QgsPainting::getBlendModeEnum( d->blendMode ) );
628 : 0 : if ( d->paintEffect && !QgsPaintEffectRegistry::isDefaultStack( d->paintEffect.get() ) )
629 : 0 : d->paintEffect->saveProperties( doc, backgroundElem );
630 : :
631 : 0 : if ( d->markerSymbol )
632 : 0 : backgroundElem.appendChild( QgsSymbolLayerUtils::saveSymbol( QStringLiteral( "markerSymbol" ), d->markerSymbol.get(), doc, context ) );
633 : :
634 : 0 : return backgroundElem;
635 : 0 : }
636 : :
637 : 0 : void QgsTextBackgroundSettings::updateDataDefinedProperties( QgsRenderContext &context, const QgsPropertyCollection &properties )
638 : : {
639 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeDraw ) )
640 : : {
641 : 0 : context.expressionContext().setOriginalValueVariable( d->enabled );
642 : 0 : d->enabled = properties.valueAsBool( QgsPalLayerSettings::ShapeDraw, context.expressionContext(), d->enabled );
643 : 0 : }
644 : :
645 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeSizeX ) )
646 : : {
647 : 0 : context.expressionContext().setOriginalValueVariable( d->size.width() );
648 : 0 : d->size.setWidth( properties.valueAsDouble( QgsPalLayerSettings::ShapeSizeX, context.expressionContext(), d->size.width() ) );
649 : 0 : }
650 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeSizeY ) )
651 : : {
652 : 0 : context.expressionContext().setOriginalValueVariable( d->size.height() );
653 : 0 : d->size.setHeight( properties.valueAsDouble( QgsPalLayerSettings::ShapeSizeY, context.expressionContext(), d->size.height() ) );
654 : 0 : }
655 : :
656 : 0 : QVariant exprVal = properties.value( QgsPalLayerSettings::ShapeSizeUnits, context.expressionContext() );
657 : 0 : if ( exprVal.isValid() )
658 : : {
659 : 0 : QString units = exprVal.toString();
660 : 0 : if ( !units.isEmpty() )
661 : : {
662 : : bool ok;
663 : 0 : QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
664 : 0 : if ( ok )
665 : 0 : d->sizeUnits = res;
666 : 0 : }
667 : 0 : }
668 : :
669 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeKind, context.expressionContext() );
670 : 0 : if ( exprVal.isValid() )
671 : : {
672 : 0 : const QString skind = exprVal.toString().trimmed();
673 : 0 : if ( !skind.isEmpty() )
674 : : {
675 : 0 : d->type = QgsTextRendererUtils::decodeShapeType( skind );
676 : 0 : }
677 : 0 : }
678 : :
679 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeSizeType, context.expressionContext() );
680 : 0 : if ( exprVal.isValid() )
681 : : {
682 : 0 : QString stype = exprVal.toString().trimmed();
683 : 0 : if ( !stype.isEmpty() )
684 : : {
685 : 0 : d->sizeType = QgsTextRendererUtils::decodeBackgroundSizeType( stype );
686 : 0 : }
687 : 0 : }
688 : :
689 : : // data defined shape SVG path?
690 : 0 : context.expressionContext().setOriginalValueVariable( d->svgFile );
691 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeSVGFile, context.expressionContext() );
692 : 0 : if ( exprVal.isValid() )
693 : : {
694 : 0 : QString svgfile = exprVal.toString().trimmed();
695 : 0 : d->svgFile = QgsSymbolLayerUtils::svgSymbolNameToPath( svgfile, context.pathResolver() );
696 : 0 : }
697 : :
698 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeRotation ) )
699 : : {
700 : 0 : context.expressionContext().setOriginalValueVariable( d->rotation );
701 : 0 : d->rotation = properties.valueAsDouble( QgsPalLayerSettings::ShapeRotation, context.expressionContext(), d->rotation );
702 : 0 : }
703 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeRotationType, context.expressionContext() );
704 : 0 : if ( exprVal.isValid() )
705 : : {
706 : 0 : QString rotstr = exprVal.toString().trimmed();
707 : 0 : if ( !rotstr.isEmpty() )
708 : : {
709 : 0 : d->rotationType = QgsTextRendererUtils::decodeBackgroundRotationType( rotstr );
710 : 0 : }
711 : 0 : }
712 : :
713 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeOffset, context.expressionContext() );
714 : 0 : if ( exprVal.isValid() )
715 : : {
716 : 0 : bool ok = false;
717 : 0 : const QPointF res = QgsSymbolLayerUtils::toPoint( exprVal, &ok );
718 : 0 : if ( ok )
719 : : {
720 : 0 : d->offset = res;
721 : 0 : }
722 : 0 : }
723 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeOffsetUnits, context.expressionContext() );
724 : 0 : if ( exprVal.isValid() )
725 : : {
726 : 0 : QString units = exprVal.toString();
727 : 0 : if ( !units.isEmpty() )
728 : : {
729 : : bool ok;
730 : 0 : QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
731 : 0 : if ( ok )
732 : 0 : d->offsetUnits = res;
733 : 0 : }
734 : 0 : }
735 : :
736 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeRadii, context.expressionContext() );
737 : 0 : if ( exprVal.isValid() )
738 : : {
739 : 0 : bool ok = false;
740 : 0 : const QSizeF res = QgsSymbolLayerUtils::toSize( exprVal, &ok );
741 : 0 : if ( ok )
742 : : {
743 : 0 : d->radii = res;
744 : 0 : }
745 : 0 : }
746 : :
747 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeRadiiUnits, context.expressionContext() );
748 : 0 : if ( exprVal.isValid() )
749 : : {
750 : 0 : QString units = exprVal.toString();
751 : 0 : if ( !units.isEmpty() )
752 : : {
753 : : bool ok;
754 : 0 : QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
755 : 0 : if ( ok )
756 : 0 : d->radiiUnits = res;
757 : 0 : }
758 : 0 : }
759 : :
760 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeOpacity ) )
761 : : {
762 : 0 : context.expressionContext().setOriginalValueVariable( d->opacity * 100 );
763 : 0 : d->opacity = properties.value( QgsPalLayerSettings::ShapeOpacity, context.expressionContext(), d->opacity * 100 ).toDouble() / 100.0;
764 : 0 : }
765 : :
766 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeFillColor ) )
767 : : {
768 : 0 : context.expressionContext().setOriginalValueVariable( QgsSymbolLayerUtils::encodeColor( d->fillColor ) );
769 : 0 : d->fillColor = properties.valueAsColor( QgsPalLayerSettings::ShapeFillColor, context.expressionContext(), d->fillColor );
770 : 0 : }
771 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeStrokeColor ) )
772 : : {
773 : 0 : context.expressionContext().setOriginalValueVariable( QgsSymbolLayerUtils::encodeColor( d->strokeColor ) );
774 : 0 : d->strokeColor = properties.valueAsColor( QgsPalLayerSettings::ShapeStrokeColor, context.expressionContext(), d->strokeColor );
775 : 0 : }
776 : :
777 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeStrokeWidth ) )
778 : : {
779 : 0 : context.expressionContext().setOriginalValueVariable( d->strokeWidth );
780 : 0 : d->strokeWidth = properties.valueAsDouble( QgsPalLayerSettings::ShapeStrokeWidth, context.expressionContext(), d->strokeWidth );
781 : 0 : }
782 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeStrokeWidthUnits, context.expressionContext() );
783 : 0 : if ( exprVal.isValid() )
784 : : {
785 : 0 : QString units = exprVal.toString();
786 : 0 : if ( !units.isEmpty() )
787 : : {
788 : : bool ok;
789 : 0 : QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok );
790 : 0 : if ( ok )
791 : 0 : d->strokeWidthUnits = res;
792 : 0 : }
793 : 0 : }
794 : :
795 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeBlendMode ) )
796 : : {
797 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeBlendMode, context.expressionContext() );
798 : 0 : QString blendstr = exprVal.toString().trimmed();
799 : 0 : if ( !blendstr.isEmpty() )
800 : 0 : d->blendMode = QgsSymbolLayerUtils::decodeBlendMode( blendstr );
801 : 0 : }
802 : :
803 : 0 : if ( properties.isActive( QgsPalLayerSettings::ShapeJoinStyle ) )
804 : : {
805 : 0 : exprVal = properties.value( QgsPalLayerSettings::ShapeJoinStyle, context.expressionContext() );
806 : 0 : QString joinstr = exprVal.toString().trimmed();
807 : 0 : if ( !joinstr.isEmpty() )
808 : : {
809 : 0 : d->joinStyle = QgsSymbolLayerUtils::decodePenJoinStyle( joinstr );
810 : 0 : }
811 : 0 : }
812 : 0 : }
813 : :
814 : 0 : QSet<QString> QgsTextBackgroundSettings::referencedFields( const QgsRenderContext &context ) const
815 : : {
816 : 0 : QSet< QString > fields;
817 : 0 : if ( d->markerSymbol )
818 : : {
819 : 0 : fields.unite( d->markerSymbol->usedAttributes( context ) );
820 : 0 : }
821 : 0 : return fields;
822 : 0 : }
|