QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgstextmasksettings.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgstextmasksettings.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 "qgstextmasksettings.h"
17 #include "qgstextrenderer_p.h"
18 #include "qgspallabeling.h"
19 #include "qgssymbollayerutils.h"
20 #include "qgspainteffectregistry.h"
21 
23 {
24  d = new QgsTextMaskSettingsPrivate();
25 }
26 
28 
30  : d( other.d )
31 {
32 }
33 
35 {
36  d = other.d;
37  return *this;
38 }
39 
41 {
42  if ( d->enabled != other.enabled()
43  || d->type != other.type()
44  || d->size != other.size()
45  || d->sizeUnit != other.sizeUnit()
46  || d->sizeMapUnitScale != other.sizeMapUnitScale()
47  || d->joinStyle != other.joinStyle()
48  || d->opacity != other.opacity()
49  || d->maskedSymbolLayers != other.maskedSymbolLayers() )
50  return false;
51 
52  if ( static_cast< bool >( d->paintEffect ) != static_cast< bool >( other.paintEffect() )
53  || ( d->paintEffect && d->paintEffect->properties() != other.paintEffect()->properties() ) )
54  return false;
55 
56  return true;
57 }
58 
60 {
61  return !( *this == other );
62 }
63 
65 {
66  return d->enabled;
67 }
68 
69 void QgsTextMaskSettings::setEnabled( bool enabled )
70 {
71  d->enabled = enabled;
72 }
73 
75 {
76  return d->type;
77 }
78 
80 {
81  d->type = type;
82 }
83 
84 
86 {
87  return d->size;
88 }
89 
90 void QgsTextMaskSettings::setSize( double size )
91 {
92  d->size = size;
93 }
94 
96 {
97  return d->sizeUnit;
98 }
99 
101 {
102  d->sizeUnit = unit;
103 }
104 
106 {
107  return d->sizeMapUnitScale;
108 }
109 
111 {
112  d->sizeMapUnitScale = scale;
113 }
114 
115 Qt::PenJoinStyle QgsTextMaskSettings::joinStyle() const
116 {
117  return d->joinStyle;
118 }
119 
120 void QgsTextMaskSettings::setJoinStyle( Qt::PenJoinStyle style )
121 {
122  d->joinStyle = style;
123 }
124 
126 {
127  return d->opacity;
128 }
129 
130 void QgsTextMaskSettings::setOpacity( double opacity )
131 {
132  d->opacity = opacity;
133 }
134 
136 {
137  return d->paintEffect.get();
138 }
139 
141 {
142  d->paintEffect.reset( effect );
143 }
144 
146 {
147  if ( properties.isActive( QgsPalLayerSettings::MaskEnabled ) )
148  {
149  context.expressionContext().setOriginalValueVariable( d->enabled );
150  d->enabled = properties.valueAsBool( QgsPalLayerSettings::MaskEnabled, context.expressionContext(), d->enabled );
151  }
152 
153  if ( properties.isActive( QgsPalLayerSettings::MaskBufferSize ) )
154  {
155  context.expressionContext().setOriginalValueVariable( d->size );
156  d->size = properties.valueAsDouble( QgsPalLayerSettings::MaskBufferSize, context.expressionContext(), d->size );
157  }
158 
159  if ( properties.isActive( QgsPalLayerSettings::MaskBufferUnit ) )
160  {
161  QVariant exprVal = properties.value( QgsPalLayerSettings::MaskBufferUnit, context.expressionContext() );
162  if ( exprVal.isValid() )
163  {
164  QString units = exprVal.toString();
165  if ( !units.isEmpty() )
166  {
167  bool ok;
169  if ( ok )
170  d->sizeUnit = res;
171  }
172  }
173  }
174 
175  if ( properties.isActive( QgsPalLayerSettings::MaskOpacity ) )
176  {
177  context.expressionContext().setOriginalValueVariable( d->opacity * 100 );
178  d->opacity = properties.value( QgsPalLayerSettings::MaskOpacity, context.expressionContext(), d->opacity * 100 ).toDouble() / 100.0;
179  }
180 
181  if ( properties.isActive( QgsPalLayerSettings::MaskJoinStyle ) )
182  {
183  QVariant exprVal = properties.value( QgsPalLayerSettings::MaskJoinStyle, context.expressionContext() );
184  QString joinstr = exprVal.toString().trimmed();
185  if ( !joinstr.isEmpty() )
186  {
187  d->joinStyle = QgsSymbolLayerUtils::decodePenJoinStyle( joinstr );
188  }
189  }
190 }
191 
193 {
194  return QSet< QString >(); // nothing for now
195 }
196 
197 void QgsTextMaskSettings::readXml( const QDomElement &elem )
198 {
199  QDomElement textMaskElem = elem.firstChildElement( QStringLiteral( "text-mask" ) );
200  d->enabled = textMaskElem.attribute( QStringLiteral( "maskEnabled" ), QStringLiteral( "0" ) ).toInt();
201  d->type = static_cast<QgsTextMaskSettings::MaskType>( textMaskElem.attribute( QStringLiteral( "maskType" ), QStringLiteral( "0" ) ).toInt() );
202  d->size = textMaskElem.attribute( QStringLiteral( "maskSize" ), QStringLiteral( "0" ) ).toDouble();
203  d->sizeUnit = QgsUnitTypes::decodeRenderUnit( textMaskElem.attribute( QStringLiteral( "maskSizeUnits" ) ) );
204  d->sizeMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( textMaskElem.attribute( QStringLiteral( "maskSizeMapUnitScale" ) ) );
205  d->joinStyle = static_cast< Qt::PenJoinStyle >( textMaskElem.attribute( QStringLiteral( "maskJoinStyle" ), QString::number( Qt::RoundJoin ) ).toUInt() );
206  d->opacity = textMaskElem.attribute( QStringLiteral( "maskOpacity" ), QStringLiteral( "1.0" ) ).toDouble();
207  QDomElement effectElem = textMaskElem.firstChildElement( QStringLiteral( "effect" ) );
208  if ( !effectElem.isNull() )
210  else
211  setPaintEffect( nullptr );
212  d->maskedSymbolLayers = stringToSymbolLayerReferenceList( textMaskElem.attribute( QStringLiteral( "maskedSymbolLayers" ) ) );
213 }
214 
215 QDomElement QgsTextMaskSettings::writeXml( QDomDocument &doc ) const
216 {
217  QDomElement textMaskElem = doc.createElement( QStringLiteral( "text-mask" ) );
218  textMaskElem.setAttribute( QStringLiteral( "maskEnabled" ), d->enabled );
219  textMaskElem.setAttribute( QStringLiteral( "maskType" ), d->type );
220  textMaskElem.setAttribute( QStringLiteral( "maskSize" ), d->size );
221  textMaskElem.setAttribute( QStringLiteral( "maskSizeUnits" ), QgsUnitTypes::encodeUnit( d->sizeUnit ) );
222  textMaskElem.setAttribute( QStringLiteral( "maskSizeMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->sizeMapUnitScale ) );
223  textMaskElem.setAttribute( QStringLiteral( "maskJoinStyle" ), static_cast< unsigned int >( d->joinStyle ) );
224  textMaskElem.setAttribute( QStringLiteral( "maskOpacity" ), d->opacity );
225  if ( d->paintEffect && !QgsPaintEffectRegistry::isDefaultStack( d->paintEffect.get() ) )
226  d->paintEffect->saveProperties( doc, textMaskElem );
227  textMaskElem.setAttribute( QStringLiteral( "maskedSymbolLayers" ), symbolLayerReferenceListToString( d->maskedSymbolLayers ) );
228  return textMaskElem;
229 }
230 
232 {
233  return d->maskedSymbolLayers;
234 }
235 
237 {
238  d->maskedSymbolLayers = maskedSymbols;
239 }
bool valueAsBool(int key, const QgsExpressionContext &context, bool defaultValue=false, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as an boolean.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
static QgsPaintEffectRegistry * paintEffectRegistry()
Returns the application's paint effect registry, used for managing paint effects.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
Struct for storing maximum and minimum scales for measurements in map units.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
QgsPaintEffect * createEffect(const QString &name, const QVariantMap &properties=QVariantMap()) const
Creates a new paint effect given the effect name and properties map.
Base class for visual effects which can be applied to QPicture drawings.
virtual QVariantMap properties() const =0
Returns the properties describing the paint effect encoded in a string format.
@ MaskEnabled
Whether the mask is enabled.
@ MaskJoinStyle
Mask join style.
@ MaskBufferUnit
Mask buffer size unit.
@ MaskBufferSize
Mask buffer size.
@ MaskOpacity
Mask opacity.
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
QVariant value(int key, const QgsExpressionContext &context, const QVariant &defaultValue=QVariant()) const override
Returns the calculated value of the property with the specified key from within the collection.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
Contains information about the context of a rendering operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
Container for settings relating to a selective masking around a text.
void setEnabled(bool)
Returns whether the mask is enabled.
MaskType
Mask shape types.
void setSize(double size)
Sets the size of the buffer.
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
double size() const
Returns the size of the buffer.
QgsSymbolLayerReferenceList maskedSymbolLayers() const
Returns a list of references to symbol layers that are masked by this buffer.
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the buffer size.
void updateDataDefinedProperties(QgsRenderContext &context, const QgsPropertyCollection &properties)
Updates the format by evaluating current values of data defined properties.
void setMaskedSymbolLayers(QgsSymbolLayerReferenceList maskedLayers)
Sets the symbol layers that will be masked by this buffer.
void readXml(const QDomElement &elem)
Read settings from a DOM element.
void setSizeUnit(QgsUnitTypes::RenderUnit unit)
Sets the units used for the buffer size.
QDomElement writeXml(QDomDocument &doc) const
Write settings into a DOM element.
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the mask.
void setJoinStyle(Qt::PenJoinStyle style)
Sets the join style used for drawing the buffer.
QgsUnitTypes::RenderUnit sizeUnit() const
Returns the units for the buffer size.
double opacity() const
Returns the mask's opacity.
bool enabled() const
Returns whether the mask is enabled.
bool operator==(const QgsTextMaskSettings &other) const
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the mask.
Qt::PenJoinStyle joinStyle() const
Returns the buffer join style.
void setType(MaskType type)
Sets the type of mask shape.
MaskType type() const
Returns the type of mask shape.
bool operator!=(const QgsTextMaskSettings &other) const
QgsTextMaskSettings & operator=(const QgsTextMaskSettings &other)
Copy constructor.
void setOpacity(double opacity)
Sets the mask's opacity.
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
static Q_INVOKABLE QgsUnitTypes::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
RenderUnit
Rendering size units.
Definition: qgsunittypes.h:167
QString symbolLayerReferenceListToString(const QgsSymbolLayerReferenceList &lst)
Utilitary function to turn a QgsSymbolLayerReferenceList into a string.
QgsSymbolLayerReferenceList stringToSymbolLayerReferenceList(const QString &str)
Utilitary function to parse a string originated from symbolLayerReferenceListToString into a QgsSymbo...
QList< QgsSymbolLayerReference > QgsSymbolLayerReferenceList