Change labeling from transparency to opacity

This commit is contained in:
Nyall Dawson 2017-05-29 20:29:12 +10:00
parent 5aae97ec9f
commit 07b45cdcc9
8 changed files with 268 additions and 140 deletions

View File

@ -158,6 +158,7 @@ class QgsPalLayerSettings
FontStyle,
FontSizeUnit,
FontTransp,
FontOpacity,
FontCase,
FontLetterSpacing,
FontWordSpacing,
@ -182,6 +183,7 @@ class QgsPalLayerSettings
BufferUnit,
BufferColor,
BufferTransp,
BufferOpacity,
BufferJoinStyle,
BufferBlendMode,
@ -200,6 +202,7 @@ class QgsPalLayerSettings
ShapeRadii,
ShapeRadiiUnits,
ShapeTransparency,
ShapeOpacity,
ShapeBlendMode,
ShapeFillColor,
ShapeStrokeColor,
@ -216,6 +219,7 @@ class QgsPalLayerSettings
ShadowRadius,
ShadowRadiusUnits,
ShadowTransparency,
ShadowOpacity,
ShadowScale,
ShadowColor,
ShadowBlendMode,

View File

@ -445,7 +445,7 @@ void QgsLabelingGui::populateDataDefinedButtons()
registerDataDefinedButton( mFontSizeDDBtn, QgsPalLayerSettings::Size );
registerDataDefinedButton( mFontUnitsDDBtn, QgsPalLayerSettings::FontSizeUnit );
registerDataDefinedButton( mFontColorDDBtn, QgsPalLayerSettings::Color );
registerDataDefinedButton( mFontTranspDDBtn, QgsPalLayerSettings::FontTransp );
registerDataDefinedButton( mFontOpacityDDBtn, QgsPalLayerSettings::FontOpacity );
registerDataDefinedButton( mFontCaseDDBtn, QgsPalLayerSettings::FontCase );
registerDataDefinedButton( mFontLetterSpacingDDBtn, QgsPalLayerSettings::FontLetterSpacing );
registerDataDefinedButton( mFontWordSpacingDDBtn, QgsPalLayerSettings::FontWordSpacing );
@ -475,7 +475,7 @@ void QgsLabelingGui::populateDataDefinedButtons()
registerDataDefinedButton( mBufferSizeDDBtn, QgsPalLayerSettings::BufferSize );
registerDataDefinedButton( mBufferUnitsDDBtn, QgsPalLayerSettings::BufferUnit );
registerDataDefinedButton( mBufferColorDDBtn, QgsPalLayerSettings::BufferColor );
registerDataDefinedButton( mBufferTranspDDBtn, QgsPalLayerSettings::BufferTransp );
registerDataDefinedButton( mBufferOpacityDDBtn, QgsPalLayerSettings::BufferOpacity );
registerDataDefinedButton( mBufferJoinStyleDDBtn, QgsPalLayerSettings::BufferJoinStyle );
registerDataDefinedButton( mBufferBlendModeDDBtn, QgsPalLayerSettings::BufferBlendMode );
@ -494,7 +494,7 @@ void QgsLabelingGui::populateDataDefinedButtons()
registerDataDefinedButton( mShapeOffsetUnitsDDBtn, QgsPalLayerSettings::ShapeOffsetUnits );
registerDataDefinedButton( mShapeRadiusDDBtn, QgsPalLayerSettings::ShapeRadii );
registerDataDefinedButton( mShapeRadiusUnitsDDBtn, QgsPalLayerSettings::ShapeRadiiUnits );
registerDataDefinedButton( mShapeTranspDDBtn, QgsPalLayerSettings::ShapeTransparency );
registerDataDefinedButton( mShapeOpacityDDBtn, QgsPalLayerSettings::ShapeOpacity );
registerDataDefinedButton( mShapeBlendModeDDBtn, QgsPalLayerSettings::ShapeBlendMode );
registerDataDefinedButton( mShapeFillColorDDBtn, QgsPalLayerSettings::ShapeFillColor );
registerDataDefinedButton( mShapeStrokeColorDDBtn, QgsPalLayerSettings::ShapeStrokeColor );
@ -511,7 +511,7 @@ void QgsLabelingGui::populateDataDefinedButtons()
registerDataDefinedButton( mShadowOffsetUnitsDDBtn, QgsPalLayerSettings::ShadowOffsetUnits );
registerDataDefinedButton( mShadowRadiusDDBtn, QgsPalLayerSettings::ShadowRadius );
registerDataDefinedButton( mShadowRadiusUnitsDDBtn, QgsPalLayerSettings::ShadowRadiusUnits );
registerDataDefinedButton( mShadowTranspDDBtn, QgsPalLayerSettings::ShadowTransparency );
registerDataDefinedButton( mShadowOpacityDDBtn, QgsPalLayerSettings::ShadowOpacity );
registerDataDefinedButton( mShadowScaleDDBtn, QgsPalLayerSettings::ShadowScale );
registerDataDefinedButton( mShadowColorDDBtn, QgsPalLayerSettings::ShadowColor );
registerDataDefinedButton( mShadowBlendDDBtn, QgsPalLayerSettings::ShadowBlendMode );

View File

@ -245,7 +245,7 @@ class CORE_EXPORT QgsLegendSettings
//! Conversion ratio between millimeters and map units - for symbols with size given in map units
double mMmPerMapUnit;
//! Whether to use advanced effects like transparency for symbols - may require their rasterization
//! Whether to use advanced effects like opacity for symbols - may require their rasterization
bool mUseAdvancedEffects;
//! Denominator of map's scale

View File

@ -115,6 +115,7 @@ void QgsPalLayerSettings::initPropertyDefinitions()
},
{ QgsPalLayerSettings::FontSizeUnit, QgsPropertyDefinition( "FontSizeUnit", QObject::tr( "Font size units" ), QgsPropertyDefinition::RenderUnits ) },
{ QgsPalLayerSettings::FontTransp, QgsPropertyDefinition( "FontTransp", QObject::tr( "Text transparency" ), QgsPropertyDefinition::Transparency ) },
{ QgsPalLayerSettings::FontOpacity, QgsPropertyDefinition( "FontOpacity", QObject::tr( "Text opacity" ), QgsPropertyDefinition::Transparency ) },
{ QgsPalLayerSettings::FontCase, QgsPropertyDefinition( "FontCase", QgsPropertyDefinition::DataTypeString, QObject::tr( "Font case" ), QObject::tr( "string " ) + QStringLiteral( "[<b>NoChange</b>|<b>Upper</b>|<br><b>Lower</b>|<b>Capitalize</b>]" ) ) },
{ QgsPalLayerSettings::FontLetterSpacing, QgsPropertyDefinition( "FontLetterSpacing", QObject::tr( "Letter spacing" ), QgsPropertyDefinition::Double ) },
{ QgsPalLayerSettings::FontWordSpacing, QgsPropertyDefinition( "FontWordSpacing", QObject::tr( "Word spacing" ), QgsPropertyDefinition::Double ) },
@ -135,6 +136,7 @@ void QgsPalLayerSettings::initPropertyDefinitions()
{ QgsPalLayerSettings::BufferUnit, QgsPropertyDefinition( "BufferUnit", QObject::tr( "Buffer units" ), QgsPropertyDefinition::RenderUnits ) },
{ QgsPalLayerSettings::BufferColor, QgsPropertyDefinition( "BufferColor", QObject::tr( "Buffer color" ), QgsPropertyDefinition::ColorNoAlpha ) },
{ QgsPalLayerSettings::BufferTransp, QgsPropertyDefinition( "BufferTransp", QObject::tr( "Buffer transparency" ), QgsPropertyDefinition::Transparency ) },
{ QgsPalLayerSettings::BufferOpacity, QgsPropertyDefinition( "BufferOpacity", QObject::tr( "Buffer opacity" ), QgsPropertyDefinition::Transparency ) },
{ QgsPalLayerSettings::BufferJoinStyle, QgsPropertyDefinition( "BufferJoinStyle", QObject::tr( "Buffer join style" ), QgsPropertyDefinition::PenJoinStyle ) },
{ QgsPalLayerSettings::BufferBlendMode, QgsPropertyDefinition( "BufferBlendMode", QObject::tr( "Buffer blend mode" ), QgsPropertyDefinition::BlendMode ) },
{ QgsPalLayerSettings::ShapeDraw, QgsPropertyDefinition( "ShapeDraw", QObject::tr( "Draw shape" ), QgsPropertyDefinition::Boolean ) },
@ -154,6 +156,7 @@ void QgsPalLayerSettings::initPropertyDefinitions()
{ QgsPalLayerSettings::ShapeRadii, QgsPropertyDefinition( "ShapeRadii", QObject::tr( "Shape radii" ), QgsPropertyDefinition::Size2D ) },
{ QgsPalLayerSettings::ShapeRadiiUnits, QgsPropertyDefinition( "ShapeRadiiUnits", QObject::tr( "Symbol radii units" ), QgsPropertyDefinition::RenderUnits ) },
{ QgsPalLayerSettings::ShapeTransparency, QgsPropertyDefinition( "ShapeTransparency", QObject::tr( "Shape transparency" ), QgsPropertyDefinition::Transparency ) },
{ QgsPalLayerSettings::ShapeOpacity, QgsPropertyDefinition( "ShapeOpacity", QObject::tr( "Shape opacity" ), QgsPropertyDefinition::Transparency ) },
{ QgsPalLayerSettings::ShapeBlendMode, QgsPropertyDefinition( "ShapeBlendMode", QObject::tr( "Shape blend mode" ), QgsPropertyDefinition::BlendMode ) },
{ QgsPalLayerSettings::ShapeFillColor, QgsPropertyDefinition( "ShapeFillColor", QObject::tr( "Shape fill color" ), QgsPropertyDefinition::ColorWithAlpha ) },
{ QgsPalLayerSettings::ShapeStrokeColor, QgsPropertyDefinition( "ShapeBorderColor", QObject::tr( "Shape stroke color" ), QgsPropertyDefinition::ColorWithAlpha ) },
@ -171,6 +174,7 @@ void QgsPalLayerSettings::initPropertyDefinitions()
{ QgsPalLayerSettings::ShadowRadius, QgsPropertyDefinition( "ShadowRadius", QObject::tr( "Shadow blur radius" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsPalLayerSettings::ShadowRadiusUnits, QgsPropertyDefinition( "ShadowRadiusUnits", QObject::tr( "Shadow blur units" ), QgsPropertyDefinition::RenderUnits ) },
{ QgsPalLayerSettings::ShadowTransparency, QgsPropertyDefinition( "ShadowTransparency", QObject::tr( "Shadow transparency" ), QgsPropertyDefinition::Transparency ) },
{ QgsPalLayerSettings::ShadowOpacity, QgsPropertyDefinition( "ShadowOpacity", QObject::tr( "Shadow opacity" ), QgsPropertyDefinition::Transparency ) },
{ QgsPalLayerSettings::ShadowScale, QgsPropertyDefinition( "ShadowScale", QObject::tr( "Shadow scale" ), QgsPropertyDefinition::IntegerPositive ) },
{ QgsPalLayerSettings::ShadowColor, QgsPropertyDefinition( "ShadowColor", QObject::tr( "Shadow color" ), QgsPropertyDefinition::ColorNoAlpha ) },
{ QgsPalLayerSettings::ShadowBlendMode, QgsPropertyDefinition( "ShadowBlendMode", QObject::tr( "Shadow blend mode" ), QgsPropertyDefinition::BlendMode ) },
@ -666,6 +670,27 @@ void QgsPalLayerSettings::readFromLayerCustomProperties( QgsVectorLayer *layer )
// read QGIS 2.x style data defined properties
readOldDataDefinedPropertyMap( layer, nullptr );
}
// upgrade older data defined settings
if ( mDataDefinedProperties.isActive( FontTransp ) )
{
mDataDefinedProperties.setProperty( FontOpacity, QgsProperty::fromExpression( QStringLiteral( "100 - (%1)" ).arg( mDataDefinedProperties.property( FontTransp ).asExpression() ) ) );
mDataDefinedProperties.setProperty( FontTransp, QgsProperty() );
}
if ( mDataDefinedProperties.isActive( BufferTransp ) )
{
mDataDefinedProperties.setProperty( BufferOpacity, QgsProperty::fromExpression( QStringLiteral( "100 - (%1)" ).arg( mDataDefinedProperties.property( BufferTransp ).asExpression() ) ) );
mDataDefinedProperties.setProperty( BufferTransp, QgsProperty() );
}
if ( mDataDefinedProperties.isActive( ShapeTransparency ) )
{
mDataDefinedProperties.setProperty( ShapeOpacity, QgsProperty::fromExpression( QStringLiteral( "100 - (%1)" ).arg( mDataDefinedProperties.property( ShapeTransparency ).asExpression() ) ) );
mDataDefinedProperties.setProperty( ShapeTransparency, QgsProperty() );
}
if ( mDataDefinedProperties.isActive( ShadowTransparency ) )
{
mDataDefinedProperties.setProperty( ShadowOpacity, QgsProperty::fromExpression( QStringLiteral( "100 - (%1)" ).arg( mDataDefinedProperties.property( ShadowTransparency ).asExpression() ) ) );
mDataDefinedProperties.setProperty( ShadowTransparency, QgsProperty() );
}
}
void QgsPalLayerSettings::readXml( QDomElement &elem, const QgsReadWriteContext &context )
@ -785,14 +810,33 @@ void QgsPalLayerSettings::readXml( QDomElement &elem, const QgsReadWriteContext
QDomElement ddElem = elem.firstChildElement( QStringLiteral( "data-defined" ) );
readOldDataDefinedPropertyMap( nullptr, &ddElem );
}
// upgrade older data defined settings
if ( mDataDefinedProperties.isActive( FontTransp ) )
{
mDataDefinedProperties.setProperty( FontOpacity, QgsProperty::fromExpression( QStringLiteral( "100 - (%1)" ).arg( mDataDefinedProperties.property( FontTransp ).asExpression() ) ) );
mDataDefinedProperties.setProperty( FontTransp, QgsProperty() );
}
if ( mDataDefinedProperties.isActive( BufferTransp ) )
{
mDataDefinedProperties.setProperty( BufferOpacity, QgsProperty::fromExpression( QStringLiteral( "100 - (%1)" ).arg( mDataDefinedProperties.property( BufferTransp ).asExpression() ) ) );
mDataDefinedProperties.setProperty( BufferTransp, QgsProperty() );
}
if ( mDataDefinedProperties.isActive( ShapeTransparency ) )
{
mDataDefinedProperties.setProperty( ShapeOpacity, QgsProperty::fromExpression( QStringLiteral( "100 - (%1)" ).arg( mDataDefinedProperties.property( ShapeTransparency ).asExpression() ) ) );
mDataDefinedProperties.setProperty( ShapeTransparency, QgsProperty() );
}
if ( mDataDefinedProperties.isActive( ShadowTransparency ) )
{
mDataDefinedProperties.setProperty( ShadowOpacity, QgsProperty::fromExpression( QStringLiteral( "100 - (%1)" ).arg( mDataDefinedProperties.property( ShadowTransparency ).asExpression() ) ) );
mDataDefinedProperties.setProperty( ShadowTransparency, QgsProperty() );
}
}
QDomElement QgsPalLayerSettings::writeXml( QDomDocument &doc, const QgsReadWriteContext &context )
{
QDomElement textStyleElem = mFormat.writeXml( doc, context );
// text style
@ -1976,10 +2020,10 @@ bool QgsPalLayerSettings::dataDefinedValEval( DataDefinedValueType valType,
}
return false;
}
case DDTransparency:
case DDOpacity:
{
bool ok;
int size = exprVal.toInt( &ok );
int size = exprVal.toDouble( &ok );
if ( ok && size >= 0 && size <= 100 )
{
dataDefinedValues.insert( p, QVariant( size ) );
@ -2200,8 +2244,8 @@ void QgsPalLayerSettings::parseTextStyle( QFont &labelFont,
// data defined font color?
dataDefinedValEval( DDColor, QgsPalLayerSettings::Color, exprVal, context.expressionContext(), QgsSymbolLayerUtils::encodeColor( mFormat.color() ) );
// data defined font transparency?
dataDefinedValEval( DDTransparency, QgsPalLayerSettings::FontTransp, exprVal, context.expressionContext(), 100 - mFormat.opacity() * 100 );
// data defined font opacity?
dataDefinedValEval( DDOpacity, QgsPalLayerSettings::FontOpacity, exprVal, context.expressionContext(), mFormat.opacity() * 100 );
// data defined font blend mode?
dataDefinedValEval( DDBlendMode, QgsPalLayerSettings::FontBlendMode, exprVal, context.expressionContext() );
@ -2234,19 +2278,19 @@ void QgsPalLayerSettings::parseTextBuffer( QgsRenderContext &context )
}
// data defined buffer transparency?
int bufTransp = 100 - buffer.opacity() * 100;
if ( dataDefinedValEval( DDTransparency, QgsPalLayerSettings::BufferTransp, exprVal, context.expressionContext(), bufTransp ) )
double bufferOpacity = buffer.opacity() * 100;
if ( dataDefinedValEval( DDOpacity, QgsPalLayerSettings::BufferOpacity, exprVal, context.expressionContext(), bufferOpacity ) )
{
bufTransp = exprVal.toInt();
bufferOpacity = exprVal.toDouble();
}
drawBuffer = ( drawBuffer && bufrSize > 0.0 && bufTransp < 100 );
drawBuffer = ( drawBuffer && bufrSize > 0.0 && bufferOpacity > 0 );
if ( !drawBuffer )
{
dataDefinedValues.insert( QgsPalLayerSettings::BufferDraw, QVariant( false ) ); // trigger value
dataDefinedValues.remove( QgsPalLayerSettings::BufferSize );
dataDefinedValues.remove( QgsPalLayerSettings::BufferTransp );
dataDefinedValues.remove( QgsPalLayerSettings::BufferOpacity );
return; // don't bother evaluating values that won't be used
}
@ -2371,18 +2415,18 @@ void QgsPalLayerSettings::parseShapeBackground( QgsRenderContext &context )
}
// data defined shape transparency?
int shapeTransp = 100 - background.opacity() * 100;
if ( dataDefinedValEval( DDTransparency, QgsPalLayerSettings::ShapeTransparency, exprVal, context.expressionContext(), shapeTransp ) )
double shapeOpacity = background.opacity() * 100;
if ( dataDefinedValEval( DDOpacity, QgsPalLayerSettings::ShapeOpacity, exprVal, context.expressionContext(), shapeOpacity ) )
{
shapeTransp = exprVal.toInt();
shapeOpacity = 100.0 * exprVal.toDouble();
}
drawShape = ( drawShape && shapeTransp < 100 ); // size is not taken into account (could be)
drawShape = ( drawShape && shapeOpacity > 0 ); // size is not taken into account (could be)
if ( !drawShape )
{
dataDefinedValues.insert( QgsPalLayerSettings::ShapeDraw, QVariant( false ) ); // trigger value
dataDefinedValues.remove( QgsPalLayerSettings::ShapeTransparency );
dataDefinedValues.remove( QgsPalLayerSettings::ShapeOpacity );
return; // don't bother evaluating values that won't be used
}
@ -2490,7 +2534,7 @@ void QgsPalLayerSettings::parseShapeBackground( QgsRenderContext &context )
if ( skip )
{
dataDefinedValues.insert( QgsPalLayerSettings::ShapeDraw, QVariant( false ) ); // trigger value
dataDefinedValues.remove( QgsPalLayerSettings::ShapeTransparency );
dataDefinedValues.remove( QgsPalLayerSettings::ShapeOpacity );
dataDefinedValues.remove( QgsPalLayerSettings::ShapeKind );
dataDefinedValues.remove( QgsPalLayerSettings::ShapeSVGFile );
dataDefinedValues.remove( QgsPalLayerSettings::ShapeSizeX );
@ -2579,10 +2623,10 @@ void QgsPalLayerSettings::parseDropShadow( QgsRenderContext &context )
}
// data defined shadow transparency?
int shadowTransp = 100 - shadow.opacity() * 100;
if ( dataDefinedValEval( DDTransparency, QgsPalLayerSettings::ShadowTransparency, exprVal, context.expressionContext(), shadowTransp ) )
double shadowOpacity = shadow.opacity() * 100;
if ( dataDefinedValEval( DDOpacity, QgsPalLayerSettings::ShadowOpacity, exprVal, context.expressionContext(), shadowOpacity ) )
{
shadowTransp = exprVal.toInt();
shadowOpacity = exprVal.toDouble();
}
// data defined shadow offset distance?
@ -2599,12 +2643,12 @@ void QgsPalLayerSettings::parseDropShadow( QgsRenderContext &context )
shadowRad = exprVal.toDouble();
}
drawShadow = ( drawShadow && shadowTransp < 100 && !( shadowOffDist == 0.0 && shadowRad == 0.0 ) );
drawShadow = ( drawShadow && shadowOpacity > 0 && !( shadowOffDist == 0.0 && shadowRad == 0.0 ) );
if ( !drawShadow )
{
dataDefinedValues.insert( QgsPalLayerSettings::ShadowDraw, QVariant( false ) ); // trigger value
dataDefinedValues.remove( QgsPalLayerSettings::ShadowTransparency );
dataDefinedValues.remove( QgsPalLayerSettings::ShadowOpacity );
dataDefinedValues.remove( QgsPalLayerSettings::ShadowOffsetDist );
dataDefinedValues.remove( QgsPalLayerSettings::ShadowRadius );
return; // don't bother evaluating values that won't be used
@ -2861,9 +2905,9 @@ void QgsPalLabeling::dataDefinedTextStyle( QgsPalLayerSettings &tmpLyr,
}
//font transparency
if ( ddValues.contains( QgsPalLayerSettings::FontTransp ) )
if ( ddValues.contains( QgsPalLayerSettings::FontOpacity ) )
{
format.setOpacity( 1.0 - ddValues.value( QgsPalLayerSettings::FontTransp ).toInt() / 100.0 );
format.setOpacity( ddValues.value( QgsPalLayerSettings::FontOpacity ).toDouble() / 100.0 );
changed = true;
}
@ -2968,10 +3012,10 @@ void QgsPalLabeling::dataDefinedTextBuffer( QgsPalLayerSettings &tmpLyr,
changed = true;
}
//buffer transparency
if ( ddValues.contains( QgsPalLayerSettings::BufferTransp ) )
//buffer opacity
if ( ddValues.contains( QgsPalLayerSettings::BufferOpacity ) )
{
buffer.setOpacity( 1.0 - ddValues.value( QgsPalLayerSettings::BufferTransp ).toInt() / 100.0 );
buffer.setOpacity( ddValues.value( QgsPalLayerSettings::BufferOpacity ).toDouble() / 100.0 );
changed = true;
}
@ -3132,9 +3176,9 @@ void QgsPalLabeling::dataDefinedShapeBackground( QgsPalLayerSettings &tmpLyr,
changed = true;
}
if ( ddValues.contains( QgsPalLayerSettings::ShapeTransparency ) )
if ( ddValues.contains( QgsPalLayerSettings::ShapeOpacity ) )
{
background.setOpacity( 1.0 - ddValues.value( QgsPalLayerSettings::ShapeTransparency ).toInt() / 100.0 );
background.setOpacity( ddValues.value( QgsPalLayerSettings::ShapeOpacity ).toDouble() / 100.0 );
changed = true;
}
@ -3231,9 +3275,9 @@ void QgsPalLabeling::dataDefinedDropShadow( QgsPalLayerSettings &tmpLyr,
changed = true;
}
if ( ddValues.contains( QgsPalLayerSettings::ShadowTransparency ) )
if ( ddValues.contains( QgsPalLayerSettings::ShadowOpacity ) )
{
shadow.setOpacity( 1.0 - ddValues.value( QgsPalLayerSettings::ShadowTransparency ).toInt() / 100.0 );
shadow.setOpacity( ddValues.value( QgsPalLayerSettings::ShadowOpacity ).toDouble() / 100.0 );
changed = true;
}

View File

@ -272,7 +272,8 @@ class CORE_EXPORT QgsPalLayerSettings
Family = 6, //!< Font family
FontStyle = 21, //!< Font style name
FontSizeUnit = 22, //!< Font size units
FontTransp = 18, //!< Text transparency
FontTransp = 18, //!< Text transparency (deprecated)
FontOpacity = 92, //!< Text opacity
FontCase = 27, //!< Label text case
FontLetterSpacing = 28, //!< Letter spacing
FontWordSpacing = 29, //!< Word spacing
@ -296,7 +297,8 @@ class CORE_EXPORT QgsPalLayerSettings
BufferSize = 7,
BufferUnit = 43,
BufferColor = 8,
BufferTransp = 19,
BufferTransp = 19, //!< Buffer transparency (deprecated)
BufferOpacity = 94, //!< Buffer opacity
BufferJoinStyle = 44,
BufferBlendMode = 45,
@ -314,7 +316,8 @@ class CORE_EXPORT QgsPalLayerSettings
ShapeOffsetUnits = 55,
ShapeRadii = 56,
ShapeRadiiUnits = 57,
ShapeTransparency = 63,
ShapeTransparency = 63, //!< Shape transparency (deprecated)
ShapeOpacity = 93, //!< Shape opacity
ShapeBlendMode = 64,
ShapeFillColor = 58,
ShapeStrokeColor = 59,
@ -330,7 +333,8 @@ class CORE_EXPORT QgsPalLayerSettings
ShadowOffsetUnits = 69,
ShadowRadius = 70,
ShadowRadiusUnits = 71,
ShadowTransparency = 72,
ShadowTransparency = 72, //!< Shadow transparency (deprecated)
ShadowOpacity = 94, //!< Shadow opacity
ShadowScale = 73,
ShadowColor = 74,
ShadowBlendMode = 75,
@ -604,7 +608,7 @@ class CORE_EXPORT QgsPalLayerSettings
DDDouble,
DDDoublePos,
DDRotation180,
DDTransparency,
DDOpacity, //!< Data defined opacity (double between 0 and 100)
DDString,
DDUnits,
DDColor,

View File

@ -59,7 +59,7 @@ class CORE_EXPORT QgsRenderContext
{
DrawEditingInfo = 0x01, //!< Enable drawing of vertex markers for layers in editing mode
ForceVectorOutput = 0x02, //!< Vector graphics should not be cached and drawn as raster images
UseAdvancedEffects = 0x04, //!< Enable layer transparency and blending effects
UseAdvancedEffects = 0x04, //!< Enable layer opacity and blending effects
UseRenderingOptimization = 0x08, //!< Enable vector simplification and other rendering optimizations
DrawSelection = 0x10, //!< Whether vector selections should be shown in the rendered map
DrawSymbolBounds = 0x20, //!< Draw bounds of symbols (for debugging/testing)

View File

@ -112,6 +112,10 @@ void QgsTextFormatWidget::initWidget()
mFontLetterSpacingSpinBox->setClearValue( 0.0 );
mFontWordSpacingSpinBox->setClearValue( 0.0 );
mZIndexSpinBox->setClearValue( 0.0 );
mFontOpacitySpinBox->setClearValue( 100.0 );
mBufferOpacitySpinBox->setClearValue( 100.0 );
mShadowOpacitySpnBx->setClearValue( 100.0 );
mShapeOpacitySpinBox->setClearValue( 100.0 );
mObstacleTypeComboBox->addItem( tr( "Over the feature's interior" ), QgsPalLayerSettings::PolygonInterior );
mObstacleTypeComboBox->addItem( tr( "Over the feature's boundary" ), QgsPalLayerSettings::PolygonBoundary );
@ -124,16 +128,16 @@ void QgsTextFormatWidget::initWidget()
mRefFont = lblFontPreview->font();
// internal connections
connect( mFontTranspSlider, &QAbstractSlider::valueChanged, mFontTranspSpinBox, &QSpinBox::setValue );
connect( mFontTranspSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mFontTranspSlider, &QAbstractSlider::setValue );
connect( mBufferTranspSlider, &QAbstractSlider::valueChanged, mBufferTranspSpinBox, &QSpinBox::setValue );
connect( mBufferTranspSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mBufferTranspSlider, &QAbstractSlider::setValue );
connect( mShapeTranspSlider, &QAbstractSlider::valueChanged, mShapeTranspSpinBox, &QSpinBox::setValue );
connect( mShapeTranspSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mShapeTranspSlider, &QAbstractSlider::setValue );
connect( mFontOpacitySlider, &QAbstractSlider::valueChanged, this, [ = ]( int value ) { mFontOpacitySpinBox->setValue( value / 10.0 ); } );
connect( mFontOpacitySpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, [ = ]( double value ) { mFontOpacitySlider->setValue( value * 10 ); } );
connect( mBufferOpacitySlider, &QAbstractSlider::valueChanged, this, [ = ]( int value ) { mBufferOpacitySpinBox->setValue( value / 10.0 ); } );
connect( mBufferOpacitySpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, [ = ]( double value ) { mBufferOpacitySlider->setValue( value * 10 ); } );
connect( mShapeOpacitySlider, &QAbstractSlider::valueChanged, this, [ = ]( int value ) { mShapeOpacitySpinBox->setValue( value / 10.0 ); } );
connect( mShapeOpacitySpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, [ = ]( double value ) { mShapeOpacitySlider->setValue( value * 10 ); } );
connect( mShadowOffsetAngleDial, &QAbstractSlider::valueChanged, mShadowOffsetAngleSpnBx, &QSpinBox::setValue );
connect( mShadowOffsetAngleSpnBx, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mShadowOffsetAngleDial, &QAbstractSlider::setValue );
connect( mShadowTranspSlider, &QAbstractSlider::valueChanged, mShadowTranspSpnBx, &QSpinBox::setValue );
connect( mShadowTranspSpnBx, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mShadowTranspSlider, &QAbstractSlider::setValue );
connect( mShadowOpacitySlider, &QAbstractSlider::valueChanged, this, [ = ]( int value ) { mShadowOpacitySpnBx->setValue( value / 10.0 ); } );
connect( mShadowOpacitySpnBx, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, [ = ]( double value ) { mShadowOpacitySlider->setValue( value * 10 ); } );
connect( mLimitLabelChkBox, &QAbstractButton::toggled, mLimitLabelSpinBox, &QWidget::setEnabled );
connect( mCheckBoxSubstituteText, &QAbstractButton::toggled, mToolButtonConfigureSubstitutes, &QWidget::setEnabled );
@ -293,9 +297,9 @@ void QgsTextFormatWidget::initWidget()
<< mBufferJoinStyleComboBox
<< mBufferJoinStyleDDBtn
<< mBufferSizeDDBtn
<< mBufferTranspDDBtn
<< mBufferOpacityDDBtn
<< mBufferTranspFillChbx
<< mBufferTranspSpinBox
<< mBufferOpacitySpinBox
<< mBufferUnitsDDBtn
<< mCentroidDDBtn
<< mCentroidInsideCheckBox
@ -339,8 +343,8 @@ void QgsTextFormatWidget::initWidget()
<< mFontStrikeoutDDBtn
<< mFontStyleComboBox
<< mFontStyleDDBtn
<< mFontTranspDDBtn
<< mFontTranspSpinBox
<< mFontOpacityDDBtn
<< mFontOpacitySpinBox
<< mFontUnderlineDDBtn
<< mFontUnitsDDBtn
<< mFontWordSpacingDDBtn
@ -410,8 +414,8 @@ void QgsTextFormatWidget::initWidget()
<< mShadowRadiusUnitWidget
<< mShadowScaleDDBtn
<< mShadowScaleSpnBx
<< mShadowTranspDDBtn
<< mShadowTranspSpnBx
<< mShadowOpacityDDBtn
<< mShadowOpacitySpnBx
<< mShadowUnderCmbBx
<< mShadowUnderDDBtn
<< mShapeBlendCmbBx
@ -452,8 +456,8 @@ void QgsTextFormatWidget::initWidget()
<< mShapeSizeXSpnBx
<< mShapeSizeYDDBtn
<< mShapeSizeYSpnBx
<< mShapeTranspDDBtn
<< mShapeTranspSpinBox
<< mShapeOpacityDDBtn
<< mShapeOpacitySpinBox
<< mShapeTypeCmbBx
<< mShapeTypeDDBtn
<< mShowLabelDDBtn
@ -618,7 +622,7 @@ void QgsTextFormatWidget::updateWidgetForFormat( const QgsTextFormat &format )
mBufferUnitWidget->setUnit( buffer.sizeUnit() );
mBufferUnitWidget->setMapUnitScale( buffer.sizeMapUnitScale() );
btnBufferColor->setColor( buffer.color() );
mBufferTranspSpinBox->setValue( 100 - 100 * buffer.opacity() );
mBufferOpacitySpinBox->setValue( 100 * buffer.opacity() );
mBufferJoinStyleComboBox->setPenJoinStyle( buffer.joinStyle() );
mBufferTranspFillChbx->setChecked( buffer.fillBufferInterior() );
comboBufferBlendMode->setBlendMode( buffer.blendMode() );
@ -636,7 +640,7 @@ void QgsTextFormatWidget::updateWidgetForFormat( const QgsTextFormat &format )
mRefFont = format.font();
mFontSizeSpinBox->setValue( format.size() );
btnTextColor->setColor( format.color() );
mFontTranspSpinBox->setValue( 100 - 100 * format.opacity() );
mFontOpacitySpinBox->setValue( 100 * format.opacity() );
comboBlendMode->setBlendMode( format.blendMode() );
mFontWordSpacingSpinBox->setValue( format.font().wordSpacing() );
@ -694,7 +698,7 @@ void QgsTextFormatWidget::updateWidgetForFormat( const QgsTextFormat &format )
mShapeStrokeWidthUnitWidget->setMapUnitScale( background.strokeWidthMapUnitScale() );
mShapePenStyleCmbBx->setPenJoinStyle( background.joinStyle() );
mShapeTranspSpinBox->setValue( 100 - background.opacity() * 100.0 );
mShapeOpacitySpinBox->setValue( background.opacity() * 100.0 );
mShapeBlendCmbBx->setBlendMode( background.blendMode() );
mLoadSvgParams = false;
@ -722,7 +726,7 @@ void QgsTextFormatWidget::updateWidgetForFormat( const QgsTextFormat &format )
mShadowRadiusUnitWidget->setUnit( shadow.blurRadiusUnit() );
mShadowRadiusUnitWidget->setMapUnitScale( shadow.blurRadiusMapUnitScale() );
mShadowRadiusAlphaChkBx->setChecked( shadow.blurAlphaOnly() );
mShadowTranspSpnBx->setValue( 100 - shadow.opacity() * 100.0 );
mShadowOpacitySpnBx->setValue( shadow.opacity() * 100.0 );
mShadowScaleSpnBx->setValue( shadow.scale() );
mShadowColorBtn->setColor( shadow.color() );
@ -745,7 +749,7 @@ QgsTextFormat QgsTextFormatWidget::format() const
format.setFont( mRefFont );
format.setSize( mFontSizeSpinBox->value() );
format.setNamedStyle( mFontStyleComboBox->currentText() );
format.setOpacity( 1.0 - mFontTranspSpinBox->value() / 100.0 );
format.setOpacity( mFontOpacitySpinBox->value() / 100.0 );
format.setBlendMode( comboBlendMode->blendMode() );
format.setSizeUnit( mFontSizeUnitWidget->unit() );
format.setSizeMapUnitScale( mFontSizeUnitWidget->getMapUnitScale() );
@ -756,7 +760,7 @@ QgsTextFormat QgsTextFormatWidget::format() const
buffer.setEnabled( mBufferDrawChkBx->isChecked() );
buffer.setSize( spinBufferSize->value() );
buffer.setColor( btnBufferColor->color() );
buffer.setOpacity( 1.0 - mBufferTranspSpinBox->value() / 100.0 );
buffer.setOpacity( mBufferOpacitySpinBox->value() / 100.0 );
buffer.setSizeUnit( mBufferUnitWidget->unit() );
buffer.setSizeMapUnitScale( mBufferUnitWidget->getMapUnitScale() );
buffer.setJoinStyle( mBufferJoinStyleComboBox->penJoinStyle() );
@ -792,7 +796,7 @@ QgsTextFormat QgsTextFormatWidget::format() const
background.setStrokeWidthUnit( mShapeStrokeWidthUnitWidget->unit() );
background.setStrokeWidthMapUnitScale( mShapeStrokeWidthUnitWidget->getMapUnitScale() );
background.setJoinStyle( mShapePenStyleCmbBx->penJoinStyle() );
background.setOpacity( 1.0 - mShapeTranspSpinBox->value() / 100.0 );
background.setOpacity( mShapeOpacitySpinBox->value() / 100.0 );
background.setBlendMode( mShapeBlendCmbBx->blendMode() );
if ( mBackgroundEffect && !QgsPaintEffectRegistry::isDefaultStack( mBackgroundEffect.get() ) )
background.setPaintEffect( mBackgroundEffect->clone() );
@ -813,7 +817,7 @@ QgsTextFormat QgsTextFormatWidget::format() const
shadow.setBlurRadiusUnit( mShadowRadiusUnitWidget->unit() );
shadow.setBlurRadiusMapUnitScale( mShadowRadiusUnitWidget->getMapUnitScale() );
shadow.setBlurAlphaOnly( mShadowRadiusAlphaChkBx->isChecked() );
shadow.setOpacity( 1.0 - mShadowTranspSpnBx->value() / 100.0 );
shadow.setOpacity( mShadowOpacitySpnBx->value() / 100.0 );
shadow.setScale( mShadowScaleSpnBx->value() );
shadow.setColor( mShadowColorBtn->color() );
shadow.setBlendMode( mShadowBlendCmbBx->blendMode() );

View File

@ -112,7 +112,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>487</width>
<width>486</width>
<height>300</height>
</rect>
</property>
@ -620,8 +620,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>465</width>
<height>385</height>
<width>452</width>
<height>466</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
@ -721,7 +721,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Transparency</string>
<string>Opacity</string>
</property>
</widget>
</item>
@ -1153,7 +1153,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="8" column="2">
<widget class="QgsPropertyOverrideButton" name="mFontTranspDDBtn">
<widget class="QgsPropertyOverrideButton" name="mFontOpacityDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1194,7 +1194,7 @@ font-style: italic;</string>
<number>0</number>
</property>
<item>
<widget class="QSlider" name="mFontTranspSlider">
<widget class="QSlider" name="mFontOpacitySlider">
<property name="enabled">
<bool>true</bool>
</property>
@ -1211,15 +1211,24 @@ font-style: italic;</string>
</size>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="pageStep">
<number>100</number>
</property>
<property name="value">
<number>1000</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QgsSpinBox" name="mFontTranspSpinBox">
<widget class="QgsDoubleSpinBox" name="mFontOpacitySpinBox">
<property name="enabled">
<bool>true</bool>
</property>
@ -1229,11 +1238,20 @@ font-style: italic;</string>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="suffix">
<string> %</string>
</property>
<property name="maximum">
<number>100</number>
<property name="decimals">
<number>1</number>
</property>
<property name="value">
<double>100.000000000000000</double>
</property>
</widget>
</item>
@ -1443,8 +1461,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>293</width>
<height>315</height>
<width>452</width>
<height>410</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_14">
@ -2078,8 +2096,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>465</width>
<height>385</height>
<width>466</width>
<height>365</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
@ -2229,7 +2247,7 @@ font-style: italic;</string>
<bool>true</bool>
</property>
<property name="text">
<string>Transparency</string>
<string>Opacity</string>
</property>
</widget>
</item>
@ -2241,7 +2259,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="4" column="2">
<widget class="QgsPropertyOverrideButton" name="mBufferTranspDDBtn">
<widget class="QgsPropertyOverrideButton" name="mBufferOpacityDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2319,7 +2337,7 @@ font-style: italic;</string>
<number>0</number>
</property>
<item>
<widget class="QSlider" name="mBufferTranspSlider">
<widget class="QSlider" name="mBufferOpacitySlider">
<property name="enabled">
<bool>true</bool>
</property>
@ -2342,23 +2360,41 @@ font-style: italic;</string>
</size>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="pageStep">
<number>100</number>
</property>
<property name="value">
<number>1000</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QgsSpinBox" name="mBufferTranspSpinBox">
<widget class="QgsDoubleSpinBox" name="mBufferOpacitySpinBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="suffix">
<string> %</string>
</property>
<property name="maximum">
<number>100</number>
<property name="decimals">
<number>1</number>
</property>
<property name="value">
<double>100.000000000000000</double>
</property>
</widget>
</item>
@ -2466,9 +2502,9 @@ font-style: italic;</string>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>448</width>
<height>613</height>
<y>-351</y>
<width>459</width>
<height>782</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_21">
@ -2762,7 +2798,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="14" column="2">
<widget class="QgsPropertyOverrideButton" name="mShapeTranspDDBtn">
<widget class="QgsPropertyOverrideButton" name="mShapeOpacityDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2805,7 +2841,7 @@ font-style: italic;</string>
<bool>true</bool>
</property>
<property name="text">
<string>Transparency</string>
<string>Opacity</string>
</property>
</widget>
</item>
@ -2906,7 +2942,7 @@ font-style: italic;</string>
<item row="14" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_38">
<item>
<widget class="QSlider" name="mShapeTranspSlider">
<widget class="QSlider" name="mShapeOpacitySlider">
<property name="enabled">
<bool>true</bool>
</property>
@ -2923,23 +2959,41 @@ font-style: italic;</string>
</size>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="pageStep">
<number>100</number>
</property>
<property name="value">
<number>1000</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QgsSpinBox" name="mShapeTranspSpinBox">
<widget class="QgsDoubleSpinBox" name="mShapeOpacitySpinBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="suffix">
<string> %</string>
</property>
<property name="maximum">
<number>100</number>
<property name="decimals">
<number>1</number>
</property>
<property name="value">
<double>100.000000000000000</double>
</property>
</widget>
</item>
@ -3313,8 +3367,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>465</width>
<height>385</height>
<width>452</width>
<height>474</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_22">
@ -3617,14 +3671,14 @@ font-style: italic;</string>
<item row="8" column="0">
<widget class="QLabel" name="label_28">
<property name="text">
<string>Transparency</string>
<string>Opacity</string>
</property>
</widget>
</item>
<item row="8" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_28">
<item>
<widget class="QSlider" name="mShadowTranspSlider">
<widget class="QSlider" name="mShadowOpacitySlider">
<property name="enabled">
<bool>true</bool>
</property>
@ -3641,23 +3695,41 @@ font-style: italic;</string>
</size>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="pageStep">
<number>100</number>
</property>
<property name="value">
<number>1000</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QgsSpinBox" name="mShadowTranspSpnBx">
<widget class="QgsDoubleSpinBox" name="mShadowOpacitySpnBx">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="suffix">
<string> %</string>
</property>
<property name="maximum">
<number>100</number>
<property name="decimals">
<number>1</number>
</property>
<property name="value">
<double>100.000000000000000</double>
</property>
</widget>
</item>
@ -3706,7 +3778,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="8" column="2">
<widget class="QgsPropertyOverrideButton" name="mShadowTranspDDBtn">
<widget class="QgsPropertyOverrideButton" name="mShadowOpacityDDBtn">
<property name="text">
<string>...</string>
</property>
@ -3818,8 +3890,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>448</width>
<height>770</height>
<width>452</width>
<height>977</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
@ -5456,8 +5528,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>448</width>
<height>665</height>
<width>452</width>
<height>881</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
@ -6440,12 +6512,6 @@ font-style: italic;</string>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QgsScrollArea</class>
<extends>QScrollArea</extends>
<header>qgsscrollarea.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsColorButton</class>
<extends>QToolButton</extends>
@ -6453,16 +6519,9 @@ font-style: italic;</string>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsFieldExpressionWidget</class>
<extends>QWidget</extends>
<header>qgsfieldexpressionwidget.h</header>
<container>1</container>
<class>QgsPropertyOverrideButton</class>
<extends>QToolButton</extends>
<header>qgspropertyoverridebutton.h</header>
</customwidget>
<customwidget>
<class>QgsDoubleSpinBox</class>
@ -6475,9 +6534,9 @@ font-style: italic;</string>
<header>qgsspinbox.h</header>
</customwidget>
<customwidget>
<class>QgsPropertyOverrideButton</class>
<extends>QToolButton</extends>
<header>qgspropertyoverridebutton.h</header>
<class>QgsPenJoinStyleComboBox</class>
<extends>QComboBox</extends>
<header>qgspenstylecombobox.h</header>
</customwidget>
<customwidget>
<class>QgsBlendModeComboBox</class>
@ -6485,9 +6544,10 @@ font-style: italic;</string>
<header>qgsblendmodecombobox.h</header>
</customwidget>
<customwidget>
<class>QgsPenJoinStyleComboBox</class>
<extends>QComboBox</extends>
<header>qgspenstylecombobox.h</header>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsUnitSelectionWidget</class>
@ -6495,6 +6555,18 @@ font-style: italic;</string>
<header>qgsunitselectionwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsScrollArea</class>
<extends>QScrollArea</extends>
<header>qgsscrollarea.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsFieldExpressionWidget</class>
<extends>QWidget</extends>
<header>qgsfieldexpressionwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsScaleWidget</class>
<extends>QWidget</extends>
@ -6540,9 +6612,9 @@ font-style: italic;</string>
<tabstop>mFontUnitsDDBtn</tabstop>
<tabstop>btnTextColor</tabstop>
<tabstop>mFontColorDDBtn</tabstop>
<tabstop>mFontTranspSlider</tabstop>
<tabstop>mFontTranspSpinBox</tabstop>
<tabstop>mFontTranspDDBtn</tabstop>
<tabstop>mFontOpacitySlider</tabstop>
<tabstop>mFontOpacitySpinBox</tabstop>
<tabstop>mFontOpacityDDBtn</tabstop>
<tabstop>mFontCapitalsComboBox</tabstop>
<tabstop>mFontCaseDDBtn</tabstop>
<tabstop>mFontLetterSpacingSpinBox</tabstop>
@ -6590,9 +6662,9 @@ font-style: italic;</string>
<tabstop>btnBufferColor</tabstop>
<tabstop>mBufferColorDDBtn</tabstop>
<tabstop>mBufferTranspFillChbx</tabstop>
<tabstop>mBufferTranspSlider</tabstop>
<tabstop>mBufferTranspSpinBox</tabstop>
<tabstop>mBufferTranspDDBtn</tabstop>
<tabstop>mBufferOpacitySlider</tabstop>
<tabstop>mBufferOpacitySpinBox</tabstop>
<tabstop>mBufferOpacityDDBtn</tabstop>
<tabstop>mBufferJoinStyleComboBox</tabstop>
<tabstop>mBufferJoinStyleDDBtn</tabstop>
<tabstop>comboBufferBlendMode</tabstop>
@ -6627,9 +6699,9 @@ font-style: italic;</string>
<tabstop>mShapeRadiusDDBtn</tabstop>
<tabstop>mShapeRadiusUnitWidget</tabstop>
<tabstop>mShapeRadiusUnitsDDBtn</tabstop>
<tabstop>mShapeTranspSlider</tabstop>
<tabstop>mShapeTranspSpinBox</tabstop>
<tabstop>mShapeTranspDDBtn</tabstop>
<tabstop>mShapeOpacitySlider</tabstop>
<tabstop>mShapeOpacitySpinBox</tabstop>
<tabstop>mShapeOpacityDDBtn</tabstop>
<tabstop>mShapeBlendCmbBx</tabstop>
<tabstop>mShapeBlendModeDDBtn</tabstop>
<tabstop>mShapeSVGParamsBtn</tabstop>
@ -6661,9 +6733,9 @@ font-style: italic;</string>
<tabstop>mShadowRadiusUnitWidget</tabstop>
<tabstop>mShadowRadiusUnitsDDBtn</tabstop>
<tabstop>mShadowRadiusAlphaChkBx</tabstop>
<tabstop>mShadowTranspSlider</tabstop>
<tabstop>mShadowTranspSpnBx</tabstop>
<tabstop>mShadowTranspDDBtn</tabstop>
<tabstop>mShadowOpacitySlider</tabstop>
<tabstop>mShadowOpacitySpnBx</tabstop>
<tabstop>mShadowOpacityDDBtn</tabstop>
<tabstop>mShadowScaleSpnBx</tabstop>
<tabstop>mShadowScaleDDBtn</tabstop>
<tabstop>mShadowColorBtn</tabstop>