32#include <QFontDatabase>
39 d =
new QgsTextSettingsPrivate();
44 : mBufferSettings( other.mBufferSettings )
45 , mBackgroundSettings( other.mBackgroundSettings )
46 , mShadowSettings( other.mShadowSettings )
47 , mMaskSettings( other.mMaskSettings )
48 , mTextFontFamily( other.mTextFontFamily )
49 , mTextFontFound( other.mTextFontFound )
57 : mBufferSettings( std::move( other.mBufferSettings ) )
58 , mBackgroundSettings( std::move( other.mBackgroundSettings ) )
59 , mShadowSettings( std::move( other.mShadowSettings ) )
60 , mMaskSettings( std::move( other.mMaskSettings ) )
61 , mTextFontFamily( std::move( other.mTextFontFamily ) )
62 , mTextFontFound( other.mTextFontFound )
63 , d( std::move( other.d ) )
75 mBufferSettings = other.mBufferSettings;
76 mBackgroundSettings = other.mBackgroundSettings;
77 mShadowSettings = other.mShadowSettings;
78 mMaskSettings = other.mMaskSettings;
79 mTextFontFamily = other.mTextFontFamily;
80 mTextFontFound = other.mTextFontFound;
90 d = std::move( other.d );
91 mBufferSettings = std::move( other.mBufferSettings );
92 mBackgroundSettings = std::move( other.mBackgroundSettings );
93 mShadowSettings = std::move( other.mShadowSettings );
94 mMaskSettings = std::move( other.mMaskSettings );
95 mTextFontFamily = std::move( other.mTextFontFamily );
96 mTextFontFound = other.mTextFontFound;
107 if ( d->isValid != other.
isValid()
108 || d->textFont != other.
font()
110 || d->fontSizeUnits != other.
sizeUnit()
112 || d->fontSize != other.
size()
113 || d->textColor != other.
color()
114 || d->opacity != other.
opacity()
128 || mBufferSettings != other.mBufferSettings
129 || mBackgroundSettings != other.mBackgroundSettings
130 || mShadowSettings != other.mShadowSettings
131 || mMaskSettings != other.mMaskSettings
141 return !( *
this == other );
157 return mBufferSettings;
163 mBufferSettings = bufferSettings;
169 return mBackgroundSettings;
175 mBackgroundSettings = backgroundSettings;
181 return mShadowSettings;
187 mShadowSettings = shadowSettings;
193 return mMaskSettings;
199 mMaskSettings = maskSettings;
212 QFont
font = d->textFont;
213 if ( scaleFactor == 1 )
216 d->fontSizeMapUnitScale );
217 if ( fontPixelSize == 0 )
224 font.setPixelSize( fontPixelSize );
228 double fontPixelSize = context.
convertToPainterUnits( d->fontSize, d->fontSizeUnits, d->fontSizeMapUnitScale );
235 const int roundedPixelSize =
static_cast< int >( std::round( scaleFactor * fontPixelSize + 0.5 ) );
236 font.setPixelSize( roundedPixelSize );
239 font.setLetterSpacing( QFont::AbsoluteSpacing, context.
convertToPainterUnits( d->textFont.letterSpacing(), d->fontSizeUnits, d->fontSizeMapUnitScale ) * scaleFactor );
240 font.setWordSpacing( context.
convertToPainterUnits( d->textFont.wordSpacing(), d->fontSizeUnits, d->fontSizeMapUnitScale ) * scaleFactor * scaleFactor );
244 font.setCapitalization( QFont::SmallCaps );
253 d->originalFontFamily.clear();
258 if ( !d->textNamedStyle.isEmpty() )
259 return d->textNamedStyle;
262 return db.styleString( d->textFont );
269 d->textNamedStyle = style;
274 return d->forcedBold;
280 d->textFont.setBold( forced );
281 d->forcedBold =
true;
286 return d->forcedItalic;
292 d->textFont.setItalic( forced );
293 d->forcedItalic =
true;
309 return d->fontSizeUnits;
315 d->fontSizeUnits = unit;
320 return d->fontSizeMapUnitScale;
326 d->fontSizeMapUnitScale = scale;
348 d->textColor =
color;
360 d->opacity *= opacityFactor;
361 mBufferSettings.setOpacity( mBufferSettings.opacity() * opacityFactor );
362 mShadowSettings.setOpacity( mShadowSettings.opacity() * opacityFactor );
363 mBackgroundSettings.setOpacity( mBackgroundSettings.opacity() * opacityFactor );
364 mMaskSettings.setOpacity( mMaskSettings.opacity() * opacityFactor );
375 return d->textFont.stretch() > 0 ? d->textFont.stretch() : 100;
381 d->textFont.setStretch( factor );
397 return d->multilineHeight;
403 d->multilineHeight = height;
408 return d->multilineHeightUnits;
414 d->multilineHeightUnits = unit;
419 return d->tabStopDistance;
425 d->tabStopDistance = distance;
430 return d->tabPositions;
436 d->tabPositions = positions;
441 return d->tabStopDistanceUnits;
447 d->tabStopDistanceUnits = unit;
452 return d->tabStopDistanceMapUnitScale;
458 d->tabStopDistanceMapUnitScale = scale;
463 return d->orientation;
477 : d->capitalization ;
484#if defined(HAS_KDE_QT5_SMALL_CAPS_FIX) || QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
487 d->textFont.setCapitalization( QFont::MixedCase );
493 return d->allowHtmlFormatting;
499 d->allowHtmlFormatting = allow;
504 return d->previewBackgroundColor;
510 d->previewBackgroundColor =
color;
516 QFont appFont = QApplication::font();
518 mTextFontFamily = d->originalFontFamily;
519 QString fontFamily = mTextFontFamily;
523 mTextFontFound =
false;
529 fontFamily = appFont.family();
533 mTextFontFound =
true;
538 d->fontSize = appFont.pointSizeF();
542 d->fontSize = layer->
customProperty( QStringLiteral(
"labeling/fontSize" ) ).toDouble();
545 if ( layer->
customProperty( QStringLiteral(
"labeling/fontSizeUnit" ) ).toString().isEmpty() )
547 d->fontSizeUnits = layer->
customProperty( QStringLiteral(
"labeling/fontSizeInMapUnits" ), QVariant(
false ) ).toBool() ?
557 if ( layer->
customProperty( QStringLiteral(
"labeling/fontSizeMapUnitScale" ) ).toString().isEmpty() )
560 double oldMin = layer->
customProperty( QStringLiteral(
"labeling/fontSizeMapUnitMinScale" ), 0.0 ).toDouble();
561 d->fontSizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
562 double oldMax = layer->
customProperty( QStringLiteral(
"labeling/fontSizeMapUnitMaxScale" ), 0.0 ).toDouble();
563 d->fontSizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
569 int fontWeight = layer->
customProperty( QStringLiteral(
"labeling/fontWeight" ) ).toInt();
570 bool fontItalic = layer->
customProperty( QStringLiteral(
"labeling/fontItalic" ) ).toBool();
575 d->textFont.setUnderline( layer->
customProperty( QStringLiteral(
"labeling/fontUnderline" ) ).toBool() );
576 d->textFont.setStrikeOut( layer->
customProperty( QStringLiteral(
"labeling/fontStrikeout" ) ).toBool() );
577 d->textFont.setLetterSpacing( QFont::AbsoluteSpacing, layer->
customProperty( QStringLiteral(
"labeling/fontLetterSpacing" ), QVariant( 0.0 ) ).toDouble() );
578 d->textFont.setWordSpacing( layer->
customProperty( QStringLiteral(
"labeling/fontWordSpacing" ), QVariant( 0.0 ) ).toDouble() );
580 if ( layer->
customProperty( QStringLiteral(
"labeling/textOpacity" ) ).toString().isEmpty() )
582 d->opacity = ( 1 - layer->
customProperty( QStringLiteral(
"labeling/textTransp" ) ).toInt() / 100.0 );
586 d->opacity = ( layer->
customProperty( QStringLiteral(
"labeling/textOpacity" ) ).toDouble() );
590 d->multilineHeight = layer->
customProperty( QStringLiteral(
"labeling/multilineHeight" ), QVariant( 1.0 ) ).toDouble();
593 mBufferSettings.readFromLayer( layer );
594 mShadowSettings.readFromLayer( layer );
595 mBackgroundSettings.readFromLayer( layer );
601 QDomElement textStyleElem;
602 if ( elem.nodeName() == QLatin1String(
"text-style" ) )
603 textStyleElem = elem;
605 textStyleElem = elem.firstChildElement( QStringLiteral(
"text-style" ) );
606 QFont appFont = QApplication::font();
608 mTextFontFamily = d->originalFontFamily;
609 QString fontFamily = mTextFontFamily;
611 const QDomElement familiesElem = textStyleElem.firstChildElement( QStringLiteral(
"families" ) );
612 const QDomNodeList familyNodes = familiesElem.childNodes();
614 families.reserve( familyNodes.size() );
615 for (
int i = 0; i < familyNodes.count(); ++i )
617 const QDomElement familyElem = familyNodes.at( i ).toElement();
618 families << familyElem.attribute( QStringLiteral(
"name" ) );
622 mTextFontFound =
false;
628 mTextFontFound =
true;
632 for (
const QString &family : std::as_const(
families ) )
638 mTextFontFound =
true;
639 fontFamily = processedFamily;
644 if ( !mTextFontFound )
647 fontFamily = appFont.family();
653 mTextFontFound =
true;
656 if ( !mTextFontFound )
658 context.
pushMessage( QObject::tr(
"Font “%1” not available on system" ).arg( mTextFontFamily ) );
661 if ( textStyleElem.hasAttribute( QStringLiteral(
"fontSize" ) ) )
663 d->fontSize = textStyleElem.attribute( QStringLiteral(
"fontSize" ) ).toDouble();
667 d->fontSize = appFont.pointSizeF();
670 if ( !textStyleElem.hasAttribute( QStringLiteral(
"fontSizeUnit" ) ) )
672 d->fontSizeUnits = textStyleElem.attribute( QStringLiteral(
"fontSizeInMapUnits" ) ).toUInt() == 0 ?
Qgis::RenderUnit::Points
680 if ( !textStyleElem.hasAttribute( QStringLiteral(
"fontSizeMapUnitScale" ) ) )
683 double oldMin = textStyleElem.attribute( QStringLiteral(
"fontSizeMapUnitMinScale" ), QStringLiteral(
"0" ) ).toDouble();
684 d->fontSizeMapUnitScale.minScale = oldMin != 0 ? 1.0 / oldMin : 0;
685 double oldMax = textStyleElem.attribute( QStringLiteral(
"fontSizeMapUnitMaxScale" ), QStringLiteral(
"0" ) ).toDouble();
686 d->fontSizeMapUnitScale.maxScale = oldMax != 0 ? 1.0 / oldMax : 0;
692 int fontWeight = textStyleElem.attribute( QStringLiteral(
"fontWeight" ) ).toInt();
693 bool fontItalic = textStyleElem.attribute( QStringLiteral(
"fontItalic" ) ).toInt();
695 d->textFont.setPointSizeF( d->fontSize );
698 d->forcedBold = textStyleElem.attribute( QStringLiteral(
"forcedBold" ) ).toInt();
699 d->forcedItalic = textStyleElem.attribute( QStringLiteral(
"forcedItalic" ) ).toInt();
700 d->textFont.setUnderline( textStyleElem.attribute( QStringLiteral(
"fontUnderline" ) ).toInt() );
701 d->textFont.setStrikeOut( textStyleElem.attribute( QStringLiteral(
"fontStrikeout" ) ).toInt() );
702 d->textFont.setKerning( textStyleElem.attribute( QStringLiteral(
"fontKerning" ), QStringLiteral(
"1" ) ).toInt() );
703 d->textFont.setLetterSpacing( QFont::AbsoluteSpacing, textStyleElem.attribute( QStringLiteral(
"fontLetterSpacing" ), QStringLiteral(
"0" ) ).toDouble() );
704 d->textFont.setWordSpacing( textStyleElem.attribute( QStringLiteral(
"fontWordSpacing" ), QStringLiteral(
"0" ) ).toDouble() );
706 if ( !textStyleElem.hasAttribute( QStringLiteral(
"textOpacity" ) ) )
708 d->opacity = ( 1 - textStyleElem.attribute( QStringLiteral(
"textTransp" ) ).toInt() / 100.0 );
712 d->opacity = ( textStyleElem.attribute( QStringLiteral(
"textOpacity" ) ).toDouble() );
714#if defined(HAS_KDE_QT5_FONT_STRETCH_FIX) || (QT_VERSION >= QT_VERSION_CHECK(6, 3, 0))
715 d->textFont.setStretch( textStyleElem.attribute( QStringLiteral(
"stretchFactor" ), QStringLiteral(
"100" ) ).toInt() );
723 if ( !textStyleElem.hasAttribute( QStringLiteral(
"multilineHeight" ) ) )
725 QDomElement textFormatElem = elem.firstChildElement( QStringLiteral(
"text-format" ) );
726 d->multilineHeight = textFormatElem.attribute( QStringLiteral(
"multilineHeight" ), QStringLiteral(
"1" ) ).toDouble();
730 d->multilineHeight = textStyleElem.attribute( QStringLiteral(
"multilineHeight" ), QStringLiteral(
"1" ) ).toDouble();
733 d->multilineHeightUnits =
QgsUnitTypes::decodeRenderUnit( textStyleElem.attribute( QStringLiteral(
"multilineHeightUnit" ), QStringLiteral(
"percent" ) ), &ok );
735 d->tabStopDistance = textStyleElem.attribute( QStringLiteral(
"tabStopDistance" ), QStringLiteral(
"80" ) ).toDouble();
736 d->tabStopDistanceUnits =
QgsUnitTypes::decodeRenderUnit( textStyleElem.attribute( QStringLiteral(
"tabStopDistanceUnit" ), QStringLiteral(
"Point" ) ), &ok );
741 const QDomElement tabPositionsElem = textStyleElem.firstChildElement( QStringLiteral(
"tabPositions" ) );
742 const QDomNodeList tabNodes = tabPositionsElem.childNodes();
744 for (
int i = 0; i < tabNodes.count(); ++i )
746 const QDomElement tabElem = tabNodes.at( i ).toElement();
747 tabPositions <<
Tab( tabElem.attribute( QStringLiteral(
"position" ) ).toDouble() );
752 if ( textStyleElem.hasAttribute( QStringLiteral(
"capitalization" ) ) )
755 d->capitalization =
static_cast< Qgis::Capitalization >( textStyleElem.attribute( QStringLiteral(
"fontCapitals" ), QStringLiteral(
"0" ) ).toUInt() );
758 d->textFont.setCapitalization( QFont::SmallCaps );
760 d->allowHtmlFormatting = textStyleElem.attribute( QStringLiteral(
"allowHtml" ), QStringLiteral(
"0" ) ).toInt();
762 if ( textStyleElem.firstChildElement( QStringLiteral(
"text-buffer" ) ).isNull() )
764 mBufferSettings.readXml( elem );
768 mBufferSettings.readXml( textStyleElem );
770 if ( textStyleElem.firstChildElement( QStringLiteral(
"text-mask" ) ).isNull() )
772 mMaskSettings.readXml( elem );
776 mMaskSettings.readXml( textStyleElem );
778 if ( textStyleElem.firstChildElement( QStringLiteral(
"shadow" ) ).isNull() )
780 mShadowSettings.readXml( elem );
784 mShadowSettings.readXml( textStyleElem );
786 if ( textStyleElem.firstChildElement( QStringLiteral(
"background" ) ).isNull() )
788 mBackgroundSettings.readXml( elem, context );
792 mBackgroundSettings.readXml( textStyleElem, context );
795 QDomElement ddElem = textStyleElem.firstChildElement( QStringLiteral(
"dd_properties" ) );
796 if ( ddElem.isNull() )
798 ddElem = elem.firstChildElement( QStringLiteral(
"dd_properties" ) );
800 if ( !ddElem.isNull() )
803 mBackgroundSettings.upgradeDataDefinedProperties( d->mDataDefinedProperties );
807 d->mDataDefinedProperties.clear();
814 QDomElement textStyleElem = doc.createElement( QStringLiteral(
"text-style" ) );
815 textStyleElem.setAttribute( QStringLiteral(
"fontFamily" ), !d->originalFontFamily.isEmpty() ? d->originalFontFamily : d->textFont.family() );
817 QDomElement familiesElem = doc.createElement( QStringLiteral(
"families" ) );
818 for (
const QString &family : std::as_const( d->families ) )
820 QDomElement familyElem = doc.createElement( QStringLiteral(
"family" ) );
821 familyElem.setAttribute( QStringLiteral(
"name" ), family );
822 familiesElem.appendChild( familyElem );
824 textStyleElem.appendChild( familiesElem );
827 textStyleElem.setAttribute( QStringLiteral(
"fontSize" ), d->fontSize );
830 textStyleElem.setAttribute( QStringLiteral(
"fontWeight" ), d->textFont.weight() );
831 textStyleElem.setAttribute( QStringLiteral(
"fontItalic" ), d->textFont.italic() );
832 textStyleElem.setAttribute( QStringLiteral(
"fontStrikeout" ), d->textFont.strikeOut() );
833 textStyleElem.setAttribute( QStringLiteral(
"fontUnderline" ), d->textFont.underline() );
834 textStyleElem.setAttribute( QStringLiteral(
"forcedBold" ), d->forcedBold );
835 textStyleElem.setAttribute( QStringLiteral(
"forcedItalic" ), d->forcedItalic );
838 textStyleElem.setAttribute( QStringLiteral(
"fontLetterSpacing" ), d->textFont.letterSpacing() );
839 textStyleElem.setAttribute( QStringLiteral(
"fontWordSpacing" ), d->textFont.wordSpacing() );
840 textStyleElem.setAttribute( QStringLiteral(
"fontKerning" ), d->textFont.kerning() );
841 textStyleElem.setAttribute( QStringLiteral(
"textOpacity" ), d->opacity );
842#if defined(HAS_KDE_QT5_FONT_STRETCH_FIX) || (QT_VERSION >= QT_VERSION_CHECK(6, 3, 0))
843 if ( d->textFont.stretch() > 0 )
844 textStyleElem.setAttribute( QStringLiteral(
"stretchFactor" ), d->textFont.stretch() );
848 textStyleElem.setAttribute( QStringLiteral(
"multilineHeight" ), d->multilineHeight );
849 textStyleElem.setAttribute( QStringLiteral(
"multilineHeightUnit" ),
QgsUnitTypes::encodeUnit( d->multilineHeightUnits ) );
851 textStyleElem.setAttribute( QStringLiteral(
"tabStopDistance" ), d->tabStopDistance );
852 textStyleElem.setAttribute( QStringLiteral(
"tabStopDistanceUnit" ),
QgsUnitTypes::encodeUnit( d->tabStopDistanceUnits ) );
855 if ( !d->tabPositions.empty() )
857 QDomElement tabPositionsElem = doc.createElement( QStringLiteral(
"tabPositions" ) );
858 for (
const Tab &tab : std::as_const( d->tabPositions ) )
860 QDomElement tabElem = doc.createElement( QStringLiteral(
"tab" ) );
861 tabElem.setAttribute( QStringLiteral(
"position" ), tab.position() );
862 tabPositionsElem.appendChild( tabElem );
864 textStyleElem.appendChild( tabPositionsElem );
867 textStyleElem.setAttribute( QStringLiteral(
"allowHtml" ), d->allowHtmlFormatting ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
868 textStyleElem.setAttribute( QStringLiteral(
"capitalization" ), QString::number(
static_cast< int >( d->capitalization ) ) );
870 QDomElement ddElem = doc.createElement( QStringLiteral(
"dd_properties" ) );
873 textStyleElem.appendChild( mBufferSettings.writeXml( doc ) );
874 textStyleElem.appendChild( mMaskSettings.writeXml( doc ) );
875 textStyleElem.appendChild( mBackgroundSettings.writeXml( doc, context ) );
876 textStyleElem.appendChild( mShadowSettings.writeXml( doc ) );
877 textStyleElem.appendChild( ddElem );
879 return textStyleElem;
886 QMimeData *mimeData =
new QMimeData;
887 mimeData->setColorData( QVariant(
color() ) );
890 QDomDocument textDoc;
891 QDomElement textElem =
writeXml( textDoc, rwContext );
892 textDoc.appendChild( textElem );
893 mimeData->setText( textDoc.toString() );
902 if (
font.pointSizeF() > 0 )
907 else if (
font.pixelSize() > 0 )
922 f.setPointSizeF(
size() );
926 f.setPointSizeF(
size() * 2.83464567 );
930 f.setPointSizeF(
size() * 72 );
934 f.setPixelSize(
static_cast< int >( std::round(
size() ) ) );
955 QString text = data->text();
956 if ( !text.isEmpty() )
962 if ( doc.setContent( text ) )
964 elem = doc.documentElement();
966 format.
readXml( elem, rwContext );
977 if ( d->blendMode != QPainter::CompositionMode_SourceOver )
980 if ( mBufferSettings.enabled() && mBufferSettings.blendMode() != QPainter::CompositionMode_SourceOver )
983 if ( mBackgroundSettings.enabled() && mBackgroundSettings.blendMode() != QPainter::CompositionMode_SourceOver )
986 if ( mShadowSettings.enabled() && mShadowSettings.blendMode() != QPainter::CompositionMode_SourceOver )
994 if ( d->blendMode != QPainter::CompositionMode_SourceOver )
997 if ( mBufferSettings.enabled() && mBufferSettings.blendMode() != QPainter::CompositionMode_SourceOver )
1000 if ( mBackgroundSettings.enabled() && mBackgroundSettings.blendMode() != QPainter::CompositionMode_SourceOver )
1003 if ( mShadowSettings.enabled() && mShadowSettings.blendMode() != QPainter::CompositionMode_SourceOver )
1018 return d->mDataDefinedProperties;
1023 return d->mDataDefinedProperties;
1029 fields.unite( mBufferSettings.referencedFields( context ) );
1030 fields.unite( mBackgroundSettings.referencedFields( context ) );
1031 fields.unite( mShadowSettings.referencedFields( context ) );
1032 fields.unite( mMaskSettings.referencedFields( context ) );
1039 d->mDataDefinedProperties = collection;
1045 if ( !d->mDataDefinedProperties.hasActiveProperties() )
1048 QString ddFontFamily;
1053 QString family = exprVal.toString().trimmed();
1055 if ( d->textFont.family() != family )
1061 ddFontFamily = family;
1067 QString ddFontStyle;
1072 QString fontstyle = exprVal.toString().trimmed();
1073 ddFontStyle = fontstyle;
1076 bool ddBold =
false;
1083 bool ddItalic =
false;
1093 QFontDatabase fontDb;
1094 QFont appFont = QApplication::font();
1095 bool newFontBuilt =
false;
1096 if ( ddBold || ddItalic )
1100 newFontBuilt =
true;
1101 newFont.setBold( ddBold );
1102 newFont.setItalic( ddItalic );
1104 else if ( !ddFontStyle.isEmpty()
1105 && ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
1107 if ( !ddFontFamily.isEmpty() )
1110 QFont styledfont = fontDb.font( ddFontFamily, ddFontStyle, appFont.pointSize() );
1111 if ( appFont != styledfont )
1113 newFont = styledfont;
1114 newFontBuilt =
true;
1121 else if ( !ddFontFamily.isEmpty() )
1123 if ( ddFontStyle.compare( QLatin1String(
"Ignore" ), Qt::CaseInsensitive ) != 0 )
1126 QFont styledfont = fontDb.font( ddFontFamily, d->textNamedStyle, appFont.pointSize() );
1127 if ( appFont != styledfont )
1129 newFont = styledfont;
1130 newFontBuilt =
true;
1136 newFontBuilt =
true;
1143 newFont.setUnderline( d->textFont.underline() );
1144 newFont.setStrikeOut( d->textFont.strikeOut() );
1145 newFont.setWordSpacing( d->textFont.wordSpacing() );
1146 newFont.setLetterSpacing( QFont::AbsoluteSpacing, d->textFont.letterSpacing() );
1147 d->textFont = newFont;
1177 QString units = exprVal.toString();
1178 if ( !units.isEmpty() )
1183 d->fontSizeUnits = res;
1193 d->opacity = val.toDouble() / 100.0;
1197#if defined(HAS_KDE_QT5_FONT_STRETCH_FIX) || (QT_VERSION >= QT_VERSION_CHECK(6, 3, 0))
1204 d->textFont.setStretch( val.toInt() );
1222 d->textFont.setLetterSpacing( QFont::AbsoluteSpacing, val.toDouble() );
1232 d->textFont.setWordSpacing( val.toDouble() );
1242 if ( val.userType() == QMetaType::Type::QVariantList )
1244 const QVariantList parts = val.toList();
1245 d->tabPositions.clear();
1246 d->tabPositions.reserve( parts.size() );
1247 for (
const QVariant &part : parts )
1249 d->tabPositions.append(
Tab( part.toDouble() ) );
1252 else if ( val.userType() == QMetaType::Type::QStringList )
1254 const QStringList parts = val.toStringList();
1255 d->tabPositions.clear();
1256 d->tabPositions.reserve( parts.size() );
1257 for (
const QString &part : parts )
1259 d->tabPositions.append(
Tab( part.toDouble() ) );
1264 d->tabPositions.clear();
1265 d->tabStopDistance = val.toDouble();
1273 QString blendstr = exprVal.toString().trimmed();
1274 if ( !blendstr.isEmpty() )
1278 mShadowSettings.updateDataDefinedProperties( context, d->mDataDefinedProperties );
1279 mBackgroundSettings.updateDataDefinedProperties( context, d->mDataDefinedProperties );
1280 mBufferSettings.updateDataDefinedProperties( context, d->mDataDefinedProperties );
1281 mMaskSettings.updateDataDefinedProperties( context, d->mDataDefinedProperties );
1288 QPixmap pixmap(
size * devicePixelRatio );
1289 pixmap.fill( Qt::transparent );
1290 pixmap.setDevicePixelRatio( devicePixelRatio );
1293 painter.begin( &pixmap );
1295 painter.setRenderHint( QPainter::Antialiasing );
1297 const QRectF rect( 0, 0,
size.width(),
size.height() );
1300 painter.setPen( Qt::NoPen );
1302 if ( ( background1.lightnessF() < 0.7 ) )
1304 background1 = background1.darker( 125 );
1308 background1 = background1.lighter( 125 );
1311 QLinearGradient linearGrad( QPointF( 0, 0 ), QPointF( 0, rect.height() ) );
1312 linearGrad.setColorAt( 0, background1 );
1313 linearGrad.setColorAt( 1, background2 );
1314 painter.setBrush( QBrush( linearGrad ) );
1315 if (
size.width() > 30 )
1317 painter.drawRoundedRect( rect, 6, 6 );
1322 painter.drawRect( rect );
1324 painter.setBrush( Qt::NoBrush );
1325 painter.setPen( Qt::NoPen );
1339 QWidget *activeWindow = QApplication::activeWindow();
1340 if ( QScreen *screen = activeWindow ? activeWindow->screen() :
nullptr )
1362 ? fontSize * tempFormat.
buffer().
size() / 100
1367 double ytrans = 0.0;
1370 ? fontSize * tempFormat.
buffer().
size() / 100
1375 const QStringList text = QStringList() << ( previewText.isEmpty() ? QObject::tr(
"Aa" ) : previewText );
1377 QRectF textRect = rect;
1378 textRect.setLeft( xtrans + padding );
1379 textRect.setWidth( rect.width() - xtrans - 2 * padding );
1381 if ( textRect.width() > 2000 )
1382 textRect.setWidth( 2000 - 2 * padding );
1384 const double bottom = textRect.height() / 2 + textHeight / 2;
1385 textRect.setTop( bottom - textHeight );
1386 textRect.setBottom( bottom );
1391 painter.setBrush( Qt::NoBrush );
1393 if (
size.width() > 30 )
1395 painter.drawRoundedRect( rect, 6, 6 );
1400 painter.drawRect( rect );
1413 css += QStringLiteral(
"line-height: %1%;" ).arg(
lineHeight() * 100 );
1416 css += QStringLiteral(
"line-height: %1px;" ).arg(
lineHeight() );
1420 css += QStringLiteral(
"line-height: %1px;" ).arg(
lineHeight() * pointToPixelMultiplier );
1424 css += QStringLiteral(
"line-height: %1px;" ).arg(
lineHeight() * 2.83464567 * pointToPixelMultiplier );
1432 css += QStringLiteral(
"color: rgba(%1,%2,%3,%4);" ).arg(
color().red() ).arg(
color().green() ).arg(
color().blue() ).arg( QString::number(
color().alphaF(),
'f', 4 ) );
1436 f.setPointSizeF(
size() / 0.352778 );
@ Default
Allow raster-based rendering in situations where it is required for correct rendering or where it wil...
@ Rectangle
Text within rectangle layout mode.
BlendMode
Blending modes defining the available composition modes that can be used when painting.
Capitalization
String capitalization options.
@ AllSmallCaps
Force all characters to small caps.
@ MixedCase
Mixed case, ie no change.
@ SmallCaps
Mixed case small caps.
TextOrientation
Text orientations.
RenderUnit
Rendering size units.
@ Percentage
Percentage of another measurement (e.g., canvas size, feature size).
@ Millimeters
Millimeters.
@ Points
Points (e.g., for font sizes).
@ Unknown
Mixed or unknown units.
@ MetersInMapUnits
Meters value as Map units.
@ Antialiasing
Use antialiasing while drawing.
static QgsFontManager * fontManager()
Returns the application font manager, which manages available fonts and font installation for the QGI...
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
QString processFontFamilyName(const QString &name) const
Processes a font family name, applying any matching fontFamilyReplacements() to the name.
static QString asCSS(const QFont &font, double pointToPixelMultiplier=1.0)
Returns a CSS string representing the specified font as closely as possible.
static QString translateNamedStyle(const QString &namedStyle)
Returns the localized named style of a font, if such a translation is available.
static QString untranslateNamedStyle(const QString &namedStyle)
Returns the english named style of a font, if possible.
static QFont createFont(const QString &family, int pointSize=-1, int weight=-1, bool italic=false)
Creates a font with the specified family.
static bool fontFamilyMatchOnSystem(const QString &family, QString *chosen=nullptr, bool *match=nullptr)
Check whether font family is on system.
static bool fontFamilyOnSystem(const QString &family)
Check whether font family is on system in a quick manner, which does not compare [foundry].
static bool updateFontViaStyle(QFont &f, const QString &fontstyle, bool fallback=false)
Updates font with named style and retain all font properties.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
Perform transforms between map coordinates and device coordinates.
void setParameters(double mapUnitsPerPixel, double centerX, double centerY, int widthPixels, int heightPixels, double rotation)
Sets parameters for use in transforming coordinates.
Struct for storing maximum and minimum scales for measurements in map units.
static Qgis::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a Qgis::BlendMode corresponding to a QPainter::CompositionMode.
static QPainter::CompositionMode getCompositionMode(Qgis::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a Qgis::BlendMode.
@ FontSizeUnit
Font size units.
@ FontStyle
Font style name.
@ Italic
Use italic style.
@ FontStretchFactor
Font stretch factor, since QGIS 3.24.
@ Strikeout
Use strikeout.
@ Underline
Use underline.
@ FontBlendMode
Text blend mode.
@ FontOpacity
Text opacity.
@ FontWordSpacing
Word spacing.
@ FontLetterSpacing
Letter spacing.
@ TabStopDistance
Tab stop distance, since QGIS 3.38.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the labeling property definitions.
A grouped map of multiple QgsProperty objects, each referenced by an integer key value.
QSet< QString > referencedFields(const QgsExpressionContext &context=QgsExpressionContext(), bool ignoreContext=false) const final
Returns the set of any fields referenced by the active properties from the collection.
A container for the context for various read/write operations on objects.
void pushMessage(const QString &message, Qgis::MessageLevel level=Qgis::MessageLevel::Warning) const
Append a message to the context.
Contains information about the context of a rendering operation.
void setScaleFactor(double factor)
Sets the scaling factor for the render to convert painter units to physical sizes.
void setDevicePixelRatio(float ratio)
Sets the device pixel ratio.
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
QgsExpressionContext & expressionContext()
Gets the expression context.
void setRasterizedRenderingPolicy(Qgis::RasterizedRenderingPolicy policy)
Sets the policy controlling when rasterisation of content during renders is permitted.
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected).
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
void setPainter(QPainter *p)
Sets the destination QPainter for the render operation.
Stores properties relating to a screen.
double devicePixelRatio() const
Returns the ratio between physical pixels and device-independent pixels for the screen.
bool isValid() const
Returns true if the properties are valid.
void updateRenderContextForScreen(QgsRenderContext &context) const
Updates the settings in a render context to match the screen settings.
static QString encodeMapUnitScale(const QgsMapUnitScale &mapUnitScale)
static QgsMapUnitScale decodeMapUnitScale(const QString &str)
static QPainter::CompositionMode decodeBlendMode(const QString &s)
static QString encodeColor(const QColor &color)
Container for settings relating to a text background object.
QSizeF size() const
Returns the size of the background shape.
bool enabled() const
Returns whether the background is enabled.
SizeType sizeType() const
Returns the method used to determine the size of the background shape (e.g., fixed size or buffer aro...
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the shape size.
Qgis::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
Container for settings relating to a text buffer.
Qgis::RenderUnit sizeUnit() const
Returns the units for the buffer size.
double size() const
Returns the size of the buffer.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
bool enabled() const
Returns whether the buffer is enabled.
Defines a tab position for a text format.
double position() const
Returns the tab position.
Tab(double position)
Constructor for a Tab at the specified position.
QgsTextFormat()
Default constructor for QgsTextFormat.
void setColor(const QColor &color)
Sets the color that text will be rendered in.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the text.
void setSize(double size)
Sets the size for rendered text.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the size.
void setCapitalization(Qgis::Capitalization capitalization)
Sets the text capitalization style.
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the format's property collection, used for data defined overrides.
QStringList families() const
Returns the list of font families to use when restoring the text format, in order of precedence.
void setOrientation(Qgis::TextOrientation orientation)
Sets the orientation for the text.
void setFont(const QFont &font)
Sets the font used for rendering text.
QSet< QString > referencedFields(const QgsRenderContext &context) const
Returns all field names referenced by the configuration (e.g.
QList< QgsTextFormat::Tab > tabPositions() const
Returns the list of tab positions for tab stops.
void setFamilies(const QStringList &families)
Sets a list of font families to use for the text format, in order of precedence.
void setForcedItalic(bool forced)
Sets whether the format is set to force an italic style.
static QgsTextFormat fromMimeData(const QMimeData *data, bool *ok=nullptr)
Attempts to parse the provided mime data as a QgsTextFormat.
double lineHeight() const
Returns the line height for text.
double tabStopDistance() const
Returns the distance for tab stops.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the size of rendered text.
int stretchFactor() const
Returns the text's stretch factor.
void updateDataDefinedProperties(QgsRenderContext &context)
Updates the format by evaluating current values of data defined properties.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the format's property collection, used for data defined overrides.
void setStretchFactor(int factor)
Sets the text's stretch factor.
void setShadow(const QgsTextShadowSettings &shadowSettings)
Sets the text's drop shadow settings.
void setMask(const QgsTextMaskSettings &maskSettings)
Sets the text's masking settings.
void setPreviewBackgroundColor(const QColor &color)
Sets the background color that text will be rendered on for previews.
QFont scaledFont(const QgsRenderContext &context, double scaleFactor=1.0, bool *isZeroSize=nullptr) const
Returns a font with the size scaled to match the format's size settings (including units and map unit...
void setTabStopDistanceUnit(Qgis::RenderUnit unit)
Sets the unit used for the tab stop distance.
void multiplyOpacity(double opacityFactor)
Multiply opacity by opacityFactor.
void setOpacity(double opacity)
Sets the text's opacity.
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the text.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Read settings from a DOM element.
bool operator==(const QgsTextFormat &other) const
void setAllowHtmlFormatting(bool allow)
Sets whether text should be treated as a HTML document and HTML tags should be used for formatting th...
void setLineHeightUnit(Qgis::RenderUnit unit)
Sets the unit for the line height for text.
Qgis::RenderUnit lineHeightUnit() const
Returns the units for the line height for text.
Qgis::Capitalization capitalization() const
Returns the text capitalization style.
bool forcedItalic() const
Returns true if the format is set to force an italic style.
QgsTextMaskSettings & mask()
Returns a reference to the masking settings.
void setForcedBold(bool forced)
Sets whether the format is set to force a bold style.
bool isValid() const
Returns true if the format is valid.
void setTabStopDistanceMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the tab stop distance.
bool hasNonDefaultCompositionMode() const
Returns true if any component of the font format requires a non-default composition mode.
void setBuffer(const QgsTextBufferSettings &bufferSettings)
Sets the text's buffer settings.
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
Qgis::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
static QgsTextFormat fromQFont(const QFont &font)
Returns a text format matching the settings from an input font.
void setValid()
Sets the format to a valid state, without changing any of the default format settings.
bool allowHtmlFormatting() const
Returns true if text should be treated as a HTML document and HTML tags should be used for formatting...
QFont toQFont() const
Returns a QFont matching the relevant settings from this text format.
bool operator!=(const QgsTextFormat &other) const
double opacity() const
Returns the text's opacity.
void setTabStopDistance(double distance)
Sets the distance for tab stops.
Qgis::TextOrientation orientation() const
Returns the orientation of the text.
QString namedStyle() const
Returns the named style for the font used for rendering text (e.g., "bold").
double size() const
Returns the size for rendered text.
QgsTextShadowSettings & shadow()
Returns a reference to the text drop shadow settings.
QgsTextFormat & operator=(const QgsTextFormat &other)
void setTabPositions(const QList< QgsTextFormat::Tab > &positions)
Sets the list of tab positions for tab stops.
static QPixmap textFormatPreviewPixmap(const QgsTextFormat &format, QSize size, const QString &previewText=QString(), int padding=0, const QgsScreenProperties &screen=QgsScreenProperties())
Returns a pixmap preview for a text format.
Qgis::RenderUnit tabStopDistanceUnit() const
Returns the units for the tab stop distance.
bool forcedBold() const
Returns true if the format is set to force a bold style.
void setBackground(const QgsTextBackgroundSettings &backgroundSettings)
Sets the text's background settings.q.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Write settings into a DOM element.
QString asCSS(double pointToPixelMultiplier=1.0) const
Returns a CSS string representing the specified text format as closely as possible.
QMimeData * toMimeData() const
Returns new mime data representing the text format settings.
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the size.
void setNamedStyle(const QString &style)
Sets the named style for the font used for rendering text.
QColor color() const
Returns the color that text will be rendered in.
QFont font() const
Returns the font used for rendering text.
void readFromLayer(QgsVectorLayer *layer)
Reads settings from a layer's custom properties (for QGIS 2.x projects).
QgsMapUnitScale tabStopDistanceMapUnitScale() const
Returns the map unit scale object for the tab stop distance.
QColor previewBackgroundColor() const
Returns the background color for text previews.
bool containsAdvancedEffects() const
Returns true if any component of the font format requires advanced effects such as blend modes,...
QgsTextBufferSettings & buffer()
Returns a reference to the text buffer settings.
void setLineHeight(double height)
Sets the line height for text.
Container for settings relating to a selective masking around a text.
static Qgis::TextOrientation decodeTextOrientation(const QString &name, bool *ok=nullptr)
Attempts to decode a string representation of a text orientation.
static QColor readColor(QgsVectorLayer *layer, const QString &property, const QColor &defaultColor=Qt::black, bool withAlpha=true)
Converts an encoded color value from a layer property.
static QString encodeTextOrientation(Qgis::TextOrientation orientation)
Encodes a text orientation.
static int sizeToPixel(double size, const QgsRenderContext &c, Qgis::RenderUnit unit, const QgsMapUnitScale &mapUnitScale=QgsMapUnitScale())
Calculates pixel size (considering output size should be in pixel or map units, scale factors and opt...
static void drawText(const QRectF &rect, double rotation, Qgis::TextHorizontalAlignment alignment, const QStringList &textLines, QgsRenderContext &context, const QgsTextFormat &format, bool drawAsOutlines=true, Qgis::TextVerticalAlignment vAlignment=Qgis::TextVerticalAlignment::Top, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Rectangle)
Draws text within a rectangle using the specified settings.
static double textHeight(const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, Qgis::TextLayoutMode mode=Qgis::TextLayoutMode::Point, QFontMetricsF *fontMetrics=nullptr, Qgis::TextRendererFlags flags=Qgis::TextRendererFlags(), double maxLineWidth=0)
Returns the height of a text based on a given format.
Container for settings relating to a text shadow.
static Q_INVOKABLE Qgis::RenderUnit decodeRenderUnit(const QString &string, bool *ok=nullptr)
Decodes a render unit from a string.
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
Represents a vector layer which manages a vector based dataset.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).