QGIS API Documentation 3.39.0-Master (8f1a6e30482)
Loading...
Searching...
No Matches
qgstextcharacterformat.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgstextcharacterformat.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
17#include "qgsrendercontext.h"
18#include "qgsfontutils.h"
19
20#include <QTextCharFormat>
21
22Qgis::TextCharacterVerticalAlignment convertTextCharFormatVAlign( const QTextCharFormat &format, bool &set )
23{
24 set = format.hasProperty( QTextFormat::TextVerticalAlignment );
25 switch ( format.verticalAlignment() )
26 {
27 case QTextCharFormat::AlignNormal:
29 case QTextCharFormat::AlignSuperScript:
31 case QTextCharFormat::AlignSubScript:
33
34 // not yet supported
35 case QTextCharFormat::AlignMiddle:
36 case QTextCharFormat::AlignTop:
37 case QTextCharFormat::AlignBottom:
38 case QTextCharFormat::AlignBaseline:
39 set = false;
41 }
43}
44
45QgsTextCharacterFormat::QgsTextCharacterFormat( const QTextCharFormat &format )
46 : mTextColor( format.hasProperty( QTextFormat::ForegroundBrush ) ? format.foreground().color() : QColor() )
47 , mFontWeight( format.hasProperty( QTextFormat::FontWeight ) ? format.fontWeight() : -1 )
48 , mStyleName( format.font().styleName() )
49 , mItalic( format.hasProperty( QTextFormat::FontItalic ) ? ( format.fontItalic() ? BooleanValue::SetTrue : BooleanValue::SetFalse ) : BooleanValue::NotSet )
50 , mFontPointSize( format.hasProperty( QTextFormat::FontPointSize ) ? format.fontPointSize() : - 1 )
51 , mWordSpacing( format.hasProperty( QTextFormat::FontWordSpacing ) ? format.fontWordSpacing() : std::numeric_limits< double >::quiet_NaN() )
52 , mStrikethrough( format.hasProperty( QTextFormat::FontStrikeOut ) ? ( format.fontStrikeOut() ? BooleanValue::SetTrue : BooleanValue::SetFalse ) : BooleanValue::NotSet )
53 , mUnderline( format.hasProperty( QTextFormat::FontUnderline ) ? ( format.fontUnderline() ? BooleanValue::SetTrue : BooleanValue::SetFalse ) : BooleanValue::NotSet )
54 , mOverline( format.hasProperty( QTextFormat::FontOverline ) ? ( format.fontOverline() ? BooleanValue::SetTrue : BooleanValue::SetFalse ) : BooleanValue::NotSet )
55{
56 mVerticalAlign = convertTextCharFormatVAlign( format, mHasVerticalAlignSet );
57
58 if ( format.hasProperty( QTextFormat::FontFamily ) )
59 {
60 mFontFamily = format.fontFamily();
61 }
62 if ( mFontFamily.isEmpty() && format.hasProperty( QTextFormat::FontFamilies ) )
63 {
64 const QStringList families = format.fontFamilies().toStringList();
65 if ( !families.isEmpty() )
66 mFontFamily = families.at( 0 );
67 }
68 if ( format.isImageFormat() )
69 {
70 const QTextImageFormat imageFormat = format.toImageFormat();
71 mImagePath = imageFormat.name();
72 mImageSize = QSizeF( imageFormat.width(), imageFormat.height() );
73 }
74}
75
77{
78 if ( !mTextColor.isValid() && other.mTextColor.isValid() )
79 mTextColor = other.mTextColor;
80 if ( mFontPointSize == -1 && other.mFontPointSize != -1 )
81 mFontPointSize = other.mFontPointSize;
82 if ( mFontPercentageSize == -1 && other.mFontPercentageSize != -1 )
83 mFontPercentageSize = other.mFontPercentageSize;
84 if ( std::isnan( mWordSpacing ) )
85 mWordSpacing = other.mWordSpacing;
86 if ( mFontFamily.isEmpty() && !other.mFontFamily.isEmpty() )
87 mFontFamily = other.mFontFamily;
88 if ( mStrikethrough == BooleanValue::NotSet && other.mStrikethrough != BooleanValue::NotSet )
89 mStrikethrough = other.mStrikethrough;
90 if ( mUnderline == BooleanValue::NotSet && other.mUnderline != BooleanValue::NotSet )
91 mUnderline = other.mUnderline;
92 if ( mOverline == BooleanValue::NotSet && other.mOverline != BooleanValue::NotSet )
93 mOverline = other.mOverline;
94 if ( mItalic == BooleanValue::NotSet && other.mItalic != BooleanValue::NotSet )
95 mItalic = other.mItalic;
96 if ( mFontWeight == -1 && other.mFontWeight != -1 )
97 mFontWeight = other.mFontWeight;
98 if ( mStyleName.isEmpty() && ! other.mStyleName.isEmpty() )
99 mStyleName = other.mStyleName;
100 if ( mHasVerticalAlignSet && other.hasVerticalAlignmentSet() )
101 {
102 mVerticalAlign = other.mVerticalAlign;
103 mHasVerticalAlignSet = true;
104 }
105}
106
108{
109 return mTextColor;
110}
111
112void QgsTextCharacterFormat::setTextColor( const QColor &textColor )
113{
114 mTextColor = textColor;
115}
116
118{
119 return mFontPointSize;
120}
121
123{
124 mFontPointSize = size;
125}
126
128{
129 return mFontPercentageSize;
130}
131
133{
134 mFontPercentageSize = size;
135}
136
138{
139 return mFontFamily;
140}
141
142void QgsTextCharacterFormat::setFamily( const QString &family )
143{
144 mFontFamily = family;
145}
146
151
153{
154 mStrikethrough = strikethrough;
155}
156
161
163{
164 mUnderline = underline;
165}
166
171
173{
174 mOverline = enabled;
175}
176
178{
179 return mImagePath;
180}
181
182void QgsTextCharacterFormat::setImagePath( const QString &path )
183{
184 mImagePath = path;
185}
186
188{
189 return mImageSize;
190}
191
192void QgsTextCharacterFormat::setImageSize( const QSizeF &size )
193{
194 mImageSize = size;
195}
196
197void QgsTextCharacterFormat::updateFontForFormat( QFont &font, const QgsRenderContext &context, const double scaleFactor ) const
198{
199 // important -- MUST set family first
200 if ( !mFontFamily.isEmpty() )
201 QgsFontUtils::setFontFamily( font, mFontFamily );
202
203 if ( mFontPointSize != -1 )
204 font.setPixelSize( scaleFactor * context.convertToPainterUnits( mFontPointSize, Qgis::RenderUnit::Points ) );
205
206 if ( mFontPercentageSize != -1 )
207 font.setPixelSize( font.pixelSize() * mFontPercentageSize );
208
210 font.setItalic( mItalic == QgsTextCharacterFormat::BooleanValue::SetTrue );
211
212 if ( mFontWeight != - 1 )
213 {
214#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
215 font.setWeight( mFontWeight );
216#else
217 if ( mFontWeight <= 150 )
218 font.setWeight( QFont::Thin );
219 else if ( mFontWeight <= 250 )
220 font.setWeight( QFont::ExtraLight );
221 else if ( mFontWeight <= 350 )
222 font.setWeight( QFont::Light );
223 else if ( mFontWeight <= 450 )
224 font.setWeight( QFont::Normal );
225 else if ( mFontWeight <= 550 )
226 font.setWeight( QFont::Medium );
227 else if ( mFontWeight <= 650 )
228 font.setWeight( QFont::DemiBold );
229 else if ( mFontWeight <= 750 )
230 font.setWeight( QFont::Bold );
231 else if ( mFontWeight <= 850 )
232 font.setWeight( QFont::ExtraBold );
233 else
234 font.setWeight( QFont::Black );
235#endif
236
237 // depending on the font, platform, and the phase of the moon, we need to both set the font weight AND the style name
238 // in order to get correct rendering!
239 font.setStyleName( mStyleName );
240 }
241
242 if ( mUnderline != BooleanValue::NotSet )
243 font.setUnderline( mUnderline == QgsTextCharacterFormat::BooleanValue::SetTrue );
244 if ( mOverline != BooleanValue::NotSet )
245 font.setOverline( mOverline == QgsTextCharacterFormat::BooleanValue::SetTrue );
246 if ( mStrikethrough != QgsTextCharacterFormat::BooleanValue::NotSet )
247 font.setStrikeOut( mStrikethrough == QgsTextCharacterFormat::BooleanValue::SetTrue );
248
249 if ( !std::isnan( mWordSpacing ) )
250 {
251 font.setWordSpacing( scaleFactor * context.convertToPainterUnits( mWordSpacing, Qgis::RenderUnit::Points ) );
252 }
253}
254
259
261{
262 mItalic = enabled;
263}
264
266{
267 return mFontWeight;
268}
269
271{
272 mFontWeight = fontWeight;
273}
274
276{
277 return mWordSpacing;
278}
279
281{
282 mWordSpacing = spacing;
283}
TextCharacterVerticalAlignment
Text vertical alignment for characters.
Definition qgis.h:2767
@ Normal
Adjacent characters are positioned in the standard way for text in the writing system in use.
@ SubScript
Characters are placed below the base line for normal text.
@ SuperScript
Characters are placed above the base line for normal text.
@ Points
Points (e.g., for font sizes)
static void setFontFamily(QFont &font, const QString &family)
Sets the family for a font object.
Contains information about the context of a rendering operation.
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).
Stores information relating to individual character formatting.
void setFamily(const QString &family)
Sets the font family name.
void overrideWith(const QgsTextCharacterFormat &other)
Override all the default/unset properties of the current character format with the settings from anot...
void updateFontForFormat(QFont &font, const QgsRenderContext &context, double scaleFactor=1.0) const
Updates the specified font in place, applying character formatting options which are applicable on a ...
void setFontWeight(int fontWeight)
Sets the font weight.
void setImageSize(const QSizeF &size)
Sets the image size, if the format applies to a document image fragment.
QSizeF imageSize() const
Returns the image size, if the format applies to a document image fragment.
QColor textColor() const
Returns the character's text color, or an invalid color if no color override is set and the default f...
BooleanValue italic() const
Returns whether the format has italic enabled.
QString imagePath() const
Returns the path to the image to render, if the format applies to a document image fragment.
QgsTextCharacterFormat()=default
void setStrikeOut(BooleanValue enabled)
Sets whether the format has strikethrough enabled.
void setOverline(BooleanValue enabled)
Sets whether the format has overline enabled.
BooleanValue
Status values for boolean format properties.
@ SetTrue
Property is set and true.
void setImagePath(const QString &path)
Sets the path to the image to render, if the format applies to a document image fragment.
int fontWeight() const
Returns the font weight, or -1 if the font weight is not set and should be inherited.
bool hasVerticalAlignmentSet() const
Returns true if the format has an explicit vertical alignment set.
BooleanValue strikeOut() const
Returns whether the format has strikethrough enabled.
double wordSpacing() const
Returns the font word spacing, in points, or NaN if word spacing is not set and should be inherited.
double fontPointSize() const
Returns the font point size, or -1 if the font size is not set and should be inherited.
QString family() const
Returns the font family name, or an empty string if the family is not set and should be inherited.
BooleanValue underline() const
Returns whether the format has underline enabled.
void setWordSpacing(double spacing)
Sets the font word spacing, in points, or NaN if word spacing is not set and should be inherited.
void setTextColor(const QColor &textColor)
Sets the character's text color.
void setUnderline(BooleanValue enabled)
Sets whether the format has underline enabled.
void setItalic(BooleanValue enabled)
Sets whether the format has italic enabled.
BooleanValue overline() const
Returns whether the format has overline enabled.
void setFontPointSize(double size)
Sets the font point size.
void setFontPercentageSize(double size)
Sets the font percentage size (as fraction of inherited font size).
double fontPercentageSize() const
Returns the font percentage size (as fraction of inherited font size), or -1 if the font size percent...
#define BUILTIN_UNREACHABLE
Definition qgis.h:6571
Qgis::TextCharacterVerticalAlignment convertTextCharFormatVAlign(const QTextCharFormat &format, bool &set)