Branch data Line data Source code
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 : : 22 : 78 : QgsTextMaskSettings::QgsTextMaskSettings() 23 : : { 24 : 78 : d = new QgsTextMaskSettingsPrivate(); 25 : 78 : } 26 : : 27 : 62 : QgsTextMaskSettings::~QgsTextMaskSettings() = default; 28 : : 29 : 0 : QgsTextMaskSettings::QgsTextMaskSettings( const QgsTextMaskSettings &other ) //NOLINT 30 : 0 : : d( other.d ) 31 : : { 32 : 0 : } 33 : : 34 : 0 : QgsTextMaskSettings &QgsTextMaskSettings::operator=( const QgsTextMaskSettings &other ) //NOLINT 35 : : { 36 : 0 : d = other.d; 37 : 0 : return *this; 38 : : } 39 : : 40 : 0 : bool QgsTextMaskSettings::operator==( const QgsTextMaskSettings &other ) const 41 : : { 42 : 0 : if ( d->enabled != other.enabled() 43 : 0 : || d->type != other.type() 44 : 0 : || d->size != other.size() 45 : 0 : || d->sizeUnit != other.sizeUnit() 46 : 0 : || d->sizeMapUnitScale != other.sizeMapUnitScale() 47 : 0 : || d->joinStyle != other.joinStyle() 48 : 0 : || d->opacity != other.opacity() 49 : 0 : || d->maskedSymbolLayers != other.maskedSymbolLayers() ) 50 : 0 : return false; 51 : : 52 : 0 : if ( static_cast< bool >( d->paintEffect ) != static_cast< bool >( other.paintEffect() ) 53 : 0 : || ( d->paintEffect && d->paintEffect->properties() != other.paintEffect()->properties() ) ) 54 : 0 : return false; 55 : : 56 : 0 : return true; 57 : 0 : } 58 : : 59 : 0 : bool QgsTextMaskSettings::operator!=( const QgsTextMaskSettings &other ) const 60 : : { 61 : 0 : return !( *this == other ); 62 : : } 63 : : 64 : 0 : bool QgsTextMaskSettings::enabled() const 65 : : { 66 : 0 : return d->enabled; 67 : : } 68 : : 69 : 0 : void QgsTextMaskSettings::setEnabled( bool enabled ) 70 : : { 71 : 0 : d->enabled = enabled; 72 : 0 : } 73 : : 74 : 0 : QgsTextMaskSettings::MaskType QgsTextMaskSettings::type() const 75 : : { 76 : 0 : return d->type; 77 : : } 78 : : 79 : 0 : void QgsTextMaskSettings::setType( QgsTextMaskSettings::MaskType type ) 80 : : { 81 : 0 : d->type = type; 82 : 0 : } 83 : : 84 : : 85 : 0 : double QgsTextMaskSettings::size() const 86 : : { 87 : 0 : return d->size; 88 : : } 89 : : 90 : 0 : void QgsTextMaskSettings::setSize( double size ) 91 : : { 92 : 0 : d->size = size; 93 : 0 : } 94 : : 95 : 0 : QgsUnitTypes::RenderUnit QgsTextMaskSettings::sizeUnit() const 96 : : { 97 : 0 : return d->sizeUnit; 98 : : } 99 : : 100 : 0 : void QgsTextMaskSettings::setSizeUnit( QgsUnitTypes::RenderUnit unit ) 101 : : { 102 : 0 : d->sizeUnit = unit; 103 : 0 : } 104 : : 105 : 0 : QgsMapUnitScale QgsTextMaskSettings::sizeMapUnitScale() const 106 : : { 107 : 0 : return d->sizeMapUnitScale; 108 : : } 109 : : 110 : 0 : void QgsTextMaskSettings::setSizeMapUnitScale( const QgsMapUnitScale &scale ) 111 : : { 112 : 0 : d->sizeMapUnitScale = scale; 113 : 0 : } 114 : : 115 : 0 : Qt::PenJoinStyle QgsTextMaskSettings::joinStyle() const 116 : : { 117 : 0 : return d->joinStyle; 118 : : } 119 : : 120 : 0 : void QgsTextMaskSettings::setJoinStyle( Qt::PenJoinStyle style ) 121 : : { 122 : 0 : d->joinStyle = style; 123 : 0 : } 124 : : 125 : 0 : double QgsTextMaskSettings::opacity() const 126 : : { 127 : 0 : return d->opacity; 128 : : } 129 : : 130 : 0 : void QgsTextMaskSettings::setOpacity( double opacity ) 131 : : { 132 : 0 : d->opacity = opacity; 133 : 0 : } 134 : : 135 : 0 : QgsPaintEffect *QgsTextMaskSettings::paintEffect() const 136 : : { 137 : 0 : return d->paintEffect.get(); 138 : : } 139 : : 140 : 0 : void QgsTextMaskSettings::setPaintEffect( QgsPaintEffect *effect ) 141 : : { 142 : 0 : d->paintEffect.reset( effect ); 143 : 0 : } 144 : : 145 : 0 : void QgsTextMaskSettings::updateDataDefinedProperties( QgsRenderContext &context, const QgsPropertyCollection &properties ) 146 : : { 147 : 0 : if ( properties.isActive( QgsPalLayerSettings::MaskEnabled ) ) 148 : : { 149 : 0 : context.expressionContext().setOriginalValueVariable( d->enabled ); 150 : 0 : d->enabled = properties.valueAsBool( QgsPalLayerSettings::MaskEnabled, context.expressionContext(), d->enabled ); 151 : 0 : } 152 : : 153 : 0 : if ( properties.isActive( QgsPalLayerSettings::MaskBufferSize ) ) 154 : : { 155 : 0 : context.expressionContext().setOriginalValueVariable( d->size ); 156 : 0 : d->size = properties.valueAsDouble( QgsPalLayerSettings::MaskBufferSize, context.expressionContext(), d->size ); 157 : 0 : } 158 : : 159 : 0 : if ( properties.isActive( QgsPalLayerSettings::MaskBufferUnit ) ) 160 : : { 161 : 0 : QVariant exprVal = properties.value( QgsPalLayerSettings::MaskBufferUnit, context.expressionContext() ); 162 : 0 : if ( exprVal.isValid() ) 163 : : { 164 : 0 : QString units = exprVal.toString(); 165 : 0 : if ( !units.isEmpty() ) 166 : : { 167 : : bool ok; 168 : 0 : QgsUnitTypes::RenderUnit res = QgsUnitTypes::decodeRenderUnit( units, &ok ); 169 : 0 : if ( ok ) 170 : 0 : d->sizeUnit = res; 171 : 0 : } 172 : 0 : } 173 : 0 : } 174 : : 175 : 0 : if ( properties.isActive( QgsPalLayerSettings::MaskOpacity ) ) 176 : : { 177 : 0 : context.expressionContext().setOriginalValueVariable( d->opacity * 100 ); 178 : 0 : d->opacity = properties.value( QgsPalLayerSettings::MaskOpacity, context.expressionContext(), d->opacity * 100 ).toDouble() / 100.0; 179 : 0 : } 180 : : 181 : 0 : if ( properties.isActive( QgsPalLayerSettings::MaskJoinStyle ) ) 182 : : { 183 : 0 : QVariant exprVal = properties.value( QgsPalLayerSettings::MaskJoinStyle, context.expressionContext() ); 184 : 0 : QString joinstr = exprVal.toString().trimmed(); 185 : 0 : if ( !joinstr.isEmpty() ) 186 : : { 187 : 0 : d->joinStyle = QgsSymbolLayerUtils::decodePenJoinStyle( joinstr ); 188 : 0 : } 189 : 0 : } 190 : 0 : } 191 : : 192 : 0 : QSet<QString> QgsTextMaskSettings::referencedFields( const QgsRenderContext & ) const 193 : : { 194 : 0 : return QSet< QString >(); // nothing for now 195 : : } 196 : : 197 : 0 : void QgsTextMaskSettings::readXml( const QDomElement &elem ) 198 : : { 199 : 0 : QDomElement textMaskElem = elem.firstChildElement( QStringLiteral( "text-mask" ) ); 200 : 0 : d->enabled = textMaskElem.attribute( QStringLiteral( "maskEnabled" ), QStringLiteral( "0" ) ).toInt(); 201 : 0 : d->type = static_cast<QgsTextMaskSettings::MaskType>( textMaskElem.attribute( QStringLiteral( "maskType" ), QStringLiteral( "0" ) ).toInt() ); 202 : 0 : d->size = textMaskElem.attribute( QStringLiteral( "maskSize" ), QStringLiteral( "0" ) ).toDouble(); 203 : 0 : d->sizeUnit = QgsUnitTypes::decodeRenderUnit( textMaskElem.attribute( QStringLiteral( "maskSizeUnits" ) ) ); 204 : 0 : d->sizeMapUnitScale = QgsSymbolLayerUtils::decodeMapUnitScale( textMaskElem.attribute( QStringLiteral( "maskSizeMapUnitScale" ) ) ); 205 : 0 : d->joinStyle = static_cast< Qt::PenJoinStyle >( textMaskElem.attribute( QStringLiteral( "maskJoinStyle" ), QString::number( Qt::RoundJoin ) ).toUInt() ); 206 : 0 : d->opacity = textMaskElem.attribute( QStringLiteral( "maskOpacity" ), QStringLiteral( "1.0" ) ).toDouble(); 207 : 0 : QDomElement effectElem = textMaskElem.firstChildElement( QStringLiteral( "effect" ) ); 208 : 0 : if ( !effectElem.isNull() ) 209 : 0 : setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) ); 210 : : else 211 : 0 : setPaintEffect( nullptr ); 212 : 0 : d->maskedSymbolLayers = stringToSymbolLayerReferenceList( textMaskElem.attribute( QStringLiteral( "maskedSymbolLayers" ) ) ); 213 : 0 : } 214 : : 215 : 0 : QDomElement QgsTextMaskSettings::writeXml( QDomDocument &doc ) const 216 : : { 217 : 0 : QDomElement textMaskElem = doc.createElement( QStringLiteral( "text-mask" ) ); 218 : 0 : textMaskElem.setAttribute( QStringLiteral( "maskEnabled" ), d->enabled ); 219 : 0 : textMaskElem.setAttribute( QStringLiteral( "maskType" ), d->type ); 220 : 0 : textMaskElem.setAttribute( QStringLiteral( "maskSize" ), d->size ); 221 : 0 : textMaskElem.setAttribute( QStringLiteral( "maskSizeUnits" ), QgsUnitTypes::encodeUnit( d->sizeUnit ) ); 222 : 0 : textMaskElem.setAttribute( QStringLiteral( "maskSizeMapUnitScale" ), QgsSymbolLayerUtils::encodeMapUnitScale( d->sizeMapUnitScale ) ); 223 : 0 : textMaskElem.setAttribute( QStringLiteral( "maskJoinStyle" ), static_cast< unsigned int >( d->joinStyle ) ); 224 : 0 : textMaskElem.setAttribute( QStringLiteral( "maskOpacity" ), d->opacity ); 225 : 0 : if ( d->paintEffect && !QgsPaintEffectRegistry::isDefaultStack( d->paintEffect.get() ) ) 226 : 0 : d->paintEffect->saveProperties( doc, textMaskElem ); 227 : 0 : textMaskElem.setAttribute( QStringLiteral( "maskedSymbolLayers" ), symbolLayerReferenceListToString( d->maskedSymbolLayers ) ); 228 : 0 : return textMaskElem; 229 : 0 : } 230 : : 231 : 0 : QgsSymbolLayerReferenceList QgsTextMaskSettings::maskedSymbolLayers() const 232 : : { 233 : 0 : return d->maskedSymbolLayers; 234 : : } 235 : : 236 : 0 : void QgsTextMaskSettings::setMaskedSymbolLayers( QgsSymbolLayerReferenceList maskedSymbols ) 237 : : { 238 : 0 : d->maskedSymbolLayers = maskedSymbols; 239 : 0 : }