Skip to content

Commit 9d2c4fc

Browse files
committedMay 11, 2018
[FEATURE][layouts] Use text renderer for drawing scalebar text
Allows the full range of formatting options exposed through text renderer - e.g. scalebar text with buffers, shadows, background shapes, letter spacing, etc. Say goodbye to unreadable scale bar text!
1 parent a06000e commit 9d2c4fc

21 files changed

+351
-208
lines changed
 

‎python/core/layout/qgslayoutitemscalebar.sip.in

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,36 +192,62 @@ Sets the ``label`` for units.
192192
.. seealso:: :py:func:`unitLabel`
193193
%End
194194

195-
QFont font() const;
195+
QgsTextFormat textFormat() const;
196+
%Docstring
197+
Returns the text format used for drawing text in the scalebar.
198+
199+
.. seealso:: :py:func:`setTextFormat`
200+
201+
.. versionadded:: 3.2
202+
%End
203+
204+
void setTextFormat( const QgsTextFormat &format );
205+
%Docstring
206+
Sets the text ``format`` used for drawing text in the scalebar.
207+
208+
.. seealso:: :py:func:`textFormat`
209+
210+
.. versionadded:: 3.2
211+
%End
212+
213+
QFont font() const /Deprecated/;
196214
%Docstring
197215
Returns the font used for drawing text in the scalebar.
198216

199217
.. seealso:: :py:func:`setFont`
218+
219+
.. deprecated:: use textFormat() instead
200220
%End
201221

202-
void setFont( const QFont &font );
222+
void setFont( const QFont &font ) /Deprecated/;
203223
%Docstring
204224
Sets the ``font`` used for drawing text in the scalebar.
205225

206-
.. seealso:: :py:func:`setFont`
226+
.. seealso:: :py:func:`font`
227+
228+
.. deprecated:: use setTextFormat() instead
207229
%End
208230

209-
QColor fontColor() const;
231+
QColor fontColor() const /Deprecated/;
210232
%Docstring
211233
Returns the color used for drawing text in the scalebar.
212234

213235
.. seealso:: :py:func:`setFontColor`
214236

215237
.. seealso:: :py:func:`font`
238+
239+
.. deprecated:: use textFormat() instead
216240
%End
217241

218-
void setFontColor( const QColor &color );
242+
void setFontColor( const QColor &color ) /Deprecated/;
219243
%Docstring
220244
Sets the ``color`` used for drawing text in the scalebar.
221245

222246
.. seealso:: :py:func:`fontColor`
223247

224248
.. seealso:: :py:func:`setFont`
249+
250+
.. deprecated:: use setTextFormat() instead
225251
%End
226252

227253
QColor fillColor() const;

‎python/core/scalebar/qgsscalebarrenderer.sip.in

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,18 @@ Draws default scalebar labels using the specified ``settings`` and ``scaleContex
7474
Returns the text used for the first label in the scalebar.
7575
%End
7676

77-
double firstLabelXOffset( const QgsScaleBarSettings &settings ) const;
77+
double firstLabelXOffset( const QgsScaleBarSettings &settings ) const /Deprecated/;
7878
%Docstring
7979
Returns the x-offset (in millimeters) used for the first label in the scalebar.
80+
81+
.. deprecated:: Use the version with QgsRenderContext instead.
82+
%End
83+
84+
double firstLabelXOffset( const QgsScaleBarSettings &settings, const QgsRenderContext &context ) const;
85+
%Docstring
86+
Returns the x-offset (in render context painter units) used for the first label in the scalebar.
87+
88+
.. versionadded:: 3.2
8089
%End
8190

8291
QList<double> segmentPositions( const QgsScaleBarRenderer::ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const;

‎python/core/scalebar/qgsscalebarsettings.sip.in

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,36 +206,63 @@ Sets the ``label`` for units.
206206
.. seealso:: :py:func:`unitLabel`
207207
%End
208208

209-
QFont font() const;
209+
QgsTextFormat &textFormat();
210+
%Docstring
211+
Returns the text format used for drawing text in the scalebar.
212+
213+
.. seealso:: :py:func:`setTextFormat`
214+
215+
.. versionadded:: 3.2
216+
%End
217+
218+
219+
void setTextFormat( const QgsTextFormat &format );
220+
%Docstring
221+
Sets the text ``format`` used for drawing text in the scalebar.
222+
223+
.. seealso:: :py:func:`textFormat`
224+
225+
.. versionadded:: 3.2
226+
%End
227+
228+
QFont font() const /Deprecated/;
210229
%Docstring
211230
Returns the font used for drawing text in the scalebar.
212231

213232
.. seealso:: :py:func:`setFont`
233+
234+
.. deprecated:: use textFormat() instead
214235
%End
215236

216-
void setFont( const QFont &font );
237+
void setFont( const QFont &font ) /Deprecated/;
217238
%Docstring
218239
Sets the ``font`` used for drawing text in the scalebar.
219240

220-
.. seealso:: :py:func:`setFont`
241+
.. seealso:: :py:func:`font`
242+
243+
.. deprecated:: use setTextFormat() instead
221244
%End
222245

223-
QColor fontColor() const;
246+
QColor fontColor() const /Deprecated/;
224247
%Docstring
225248
Returns the color used for drawing text in the scalebar.
226249

227250
.. seealso:: :py:func:`setFontColor`
228251

229252
.. seealso:: :py:func:`font`
253+
254+
.. deprecated:: use textFormat() instead
230255
%End
231256

232-
void setFontColor( const QColor &color );
257+
void setFontColor( const QColor &color ) /Deprecated/;
233258
%Docstring
234259
Sets the ``color`` used for drawing text in the scalebar.
235260

236261
.. seealso:: :py:func:`fontColor`
237262

238263
.. seealso:: :py:func:`setFont`
264+
265+
.. deprecated:: use textFormat() instead
239266
%End
240267

241268
QColor fillColor() const;
Binary file not shown.

‎src/app/layout/qgslayoutscalebarwidget.cpp

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ QgsLayoutScaleBarWidget::QgsLayoutScaleBarWidget( QgsLayoutItemScaleBar *scaleBa
3636
connect( mNumberOfSegmentsSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsLayoutScaleBarWidget::mNumberOfSegmentsSpinBox_valueChanged );
3737
connect( mUnitLabelLineEdit, &QLineEdit::textChanged, this, &QgsLayoutScaleBarWidget::mUnitLabelLineEdit_textChanged );
3838
connect( mMapUnitsPerBarUnitSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutScaleBarWidget::mMapUnitsPerBarUnitSpinBox_valueChanged );
39-
connect( mFontColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutScaleBarWidget::mFontColorButton_colorChanged );
4039
connect( mFillColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutScaleBarWidget::mFillColorButton_colorChanged );
4140
connect( mFillColor2Button, &QgsColorButton::colorChanged, this, &QgsLayoutScaleBarWidget::mFillColor2Button_colorChanged );
4241
connect( mStrokeColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutScaleBarWidget::mStrokeColorButton_colorChanged );
@@ -101,9 +100,8 @@ QgsLayoutScaleBarWidget::QgsLayoutScaleBarWidget( QgsLayoutItemScaleBar *scaleBa
101100
mFillColor2Button->setNoColorString( tr( "Transparent fill" ) );
102101
mFillColor2Button->setShowNoColor( true );
103102

104-
mFontColorButton->setColorDialogTitle( tr( "Select Font Color" ) );
105-
mFontColorButton->setAllowOpacity( true );
106-
mFontColorButton->setContext( QStringLiteral( "composer" ) );
103+
mFontButton->setDialogTitle( tr( "Scalebar Font" ) );
104+
mFontButton->setMode( QgsFontButton::ModeTextRenderer );
107105

108106
mStrokeColorButton->setColorDialogTitle( tr( "Select Line Color" ) );
109107
mStrokeColorButton->setAllowOpacity( true );
@@ -135,7 +133,7 @@ QgsLayoutScaleBarWidget::QgsLayoutScaleBarWidget( QgsLayoutItemScaleBar *scaleBa
135133
blockMemberSignals( false );
136134
setGuiElements(); //set the GUI elements to the state of scaleBar
137135

138-
connect( mFontButton, &QgsFontButton::changed, this, &QgsLayoutScaleBarWidget::fontChanged );
136+
connect( mFontButton, &QgsFontButton::changed, this, &QgsLayoutScaleBarWidget::textFormatChanged );
139137
}
140138

141139
bool QgsLayoutScaleBarWidget::setNewItem( QgsLayoutItem *item )
@@ -181,11 +179,10 @@ void QgsLayoutScaleBarWidget::setGuiElements()
181179
mUnitLabelLineEdit->setText( mScalebar->unitLabel() );
182180
mLineJoinStyleCombo->setPenJoinStyle( mScalebar->lineJoinStyle() );
183181
mLineCapStyleCombo->setPenCapStyle( mScalebar->lineCapStyle() );
184-
mFontColorButton->setColor( mScalebar->fontColor() );
185182
mFillColorButton->setColor( mScalebar->fillColor() );
186183
mFillColor2Button->setColor( mScalebar->fillColor2() );
187184
mStrokeColorButton->setColor( mScalebar->lineColor() );
188-
mFontButton->setCurrentFont( mScalebar->font() );
185+
mFontButton->setTextFormat( mScalebar->textFormat() );
189186

190187
//map combo box
191188
mMapItemComboBox->setItem( mScalebar->linkedMap() );
@@ -196,7 +193,7 @@ void QgsLayoutScaleBarWidget::setGuiElements()
196193
toggleStyleSpecificControls( style );
197194

198195
//alignment
199-
mAlignmentComboBox->setCurrentIndex( ( int )( mScalebar->alignment() ) );
196+
mAlignmentComboBox->setCurrentIndex( static_cast< int >( mScalebar->alignment() ) );
200197

201198
//units
202199
mUnitsComboBox->setCurrentIndex( mUnitsComboBox->findData( static_cast< int >( mScalebar->units() ) ) );
@@ -300,7 +297,7 @@ void QgsLayoutScaleBarWidget::mHeightSpinBox_valueChanged( double d )
300297
mScalebar->endCommand();
301298
}
302299

303-
void QgsLayoutScaleBarWidget::fontChanged()
300+
void QgsLayoutScaleBarWidget::textFormatChanged()
304301
{
305302
if ( !mScalebar )
306303
{
@@ -309,27 +306,12 @@ void QgsLayoutScaleBarWidget::fontChanged()
309306

310307
mScalebar->beginCommand( tr( "Set Scalebar Font" ) );
311308
disconnectUpdateSignal();
312-
mScalebar->setFont( mFontButton->currentFont() );
309+
mScalebar->setTextFormat( mFontButton->textFormat() );
313310
connectUpdateSignal();
314311
mScalebar->endCommand();
315312
mScalebar->update();
316313
}
317314

318-
void QgsLayoutScaleBarWidget::mFontColorButton_colorChanged( const QColor &newColor )
319-
{
320-
if ( !mScalebar )
321-
{
322-
return;
323-
}
324-
325-
mScalebar->beginCommand( tr( "Set Scalebar Font Color" ), QgsLayoutItem::UndoScaleBarFontColor );
326-
disconnectUpdateSignal();
327-
mScalebar->setFontColor( newColor );
328-
mScalebar->update();
329-
connectUpdateSignal();
330-
mScalebar->endCommand();
331-
}
332-
333315
void QgsLayoutScaleBarWidget::mFillColorButton_colorChanged( const QColor &newColor )
334316
{
335317
if ( !mScalebar )
@@ -535,7 +517,7 @@ void QgsLayoutScaleBarWidget::mAlignmentComboBox_currentIndexChanged( int index
535517

536518
mScalebar->beginCommand( tr( "Set Scalebar Alignment" ) );
537519
disconnectUpdateSignal();
538-
mScalebar->setAlignment( ( QgsScaleBarSettings::Alignment ) index );
520+
mScalebar->setAlignment( static_cast< QgsScaleBarSettings::Alignment >( index ) );
539521
mScalebar->update();
540522
connectUpdateSignal();
541523
mScalebar->endCommand();
@@ -583,7 +565,6 @@ void QgsLayoutScaleBarWidget::blockMemberSignals( bool block )
583565
mUnitsComboBox->blockSignals( block );
584566
mLineJoinStyleCombo->blockSignals( block );
585567
mLineCapStyleCombo->blockSignals( block );
586-
mFontColorButton->blockSignals( block );
587568
mFillColorButton->blockSignals( block );
588569
mFillColor2Button->blockSignals( block );
589570
mStrokeColorButton->blockSignals( block );

‎src/app/layout/qgslayoutscalebarwidget.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ class QgsLayoutScaleBarWidget: public QgsLayoutItemBaseWidget, private Ui::QgsLa
4848
void mNumberOfSegmentsSpinBox_valueChanged( int i );
4949
void mUnitLabelLineEdit_textChanged( const QString &text );
5050
void mMapUnitsPerBarUnitSpinBox_valueChanged( double d );
51-
void mFontColorButton_colorChanged( const QColor &newColor );
5251
void mFillColorButton_colorChanged( const QColor &newColor );
5352
void mFillColor2Button_colorChanged( const QColor &newColor );
5453
void mStrokeColorButton_colorChanged( const QColor &newColor );
@@ -66,7 +65,7 @@ class QgsLayoutScaleBarWidget: public QgsLayoutItemBaseWidget, private Ui::QgsLa
6665
void setGuiElements();
6766
void segmentSizeRadioChanged( QAbstractButton *radio );
6867
void mapChanged( QgsLayoutItem *item );
69-
void fontChanged();
68+
void textFormatChanged();
7069

7170
private:
7271
QPointer< QgsLayoutItemScaleBar > mScalebar;

‎src/app/qgsdecorationscalebar.cpp

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,31 @@ void QgsDecorationScaleBar::projectRead()
8585

8686
QDomDocument doc;
8787
QDomElement elem;
88-
QString fontXml = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/Font" ) );
89-
if ( !fontXml.isEmpty() )
88+
QString textFormatXml = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/TextFormat" ) );
89+
if ( !textFormatXml.isEmpty() )
9090
{
91-
doc.setContent( fontXml );
91+
doc.setContent( textFormatXml );
9292
elem = doc.documentElement();
93-
QgsDebugMsg( doc.toString() );
94-
QgsFontUtils::setFromXmlElement( mFont, elem );
93+
QgsReadWriteContext context;
94+
context.setPathResolver( QgsProject::instance()->pathResolver() );
95+
mTextFormat.readXml( elem, context );
9596
}
9697
else
9798
{
98-
mFont = QFont();
99+
QString fontXml = QgsProject::instance()->readEntry( mNameConfig, QStringLiteral( "/Font" ) );
100+
if ( !fontXml.isEmpty() )
101+
{
102+
doc.setContent( fontXml );
103+
elem = doc.documentElement();
104+
QFont font;
105+
QgsFontUtils::setFromXmlElement( font, elem );
106+
mTextFormat = QgsTextFormat::fromQFont( font );
107+
mTextFormat.setColor( mColor );
108+
}
109+
else
110+
{
111+
mTextFormat = QgsTextFormat();
112+
}
99113
}
100114

101115
setupScaleBar();
@@ -113,9 +127,12 @@ void QgsDecorationScaleBar::saveToProject()
113127
QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/MarginV" ), mMarginVertical );
114128

115129
QDomDocument fontDoc;
116-
QDomElement font = QgsFontUtils::toXmlElement( mFont, fontDoc, QStringLiteral( "BarFont" ) );
117-
fontDoc.appendChild( font );
118-
QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/Font" ), fontDoc.toString() );
130+
QgsReadWriteContext context;
131+
context.setPathResolver( QgsProject::instance()->pathResolver() );
132+
QDomElement textElem = mTextFormat.writeXml( fontDoc, context );
133+
fontDoc.appendChild( textElem );
134+
135+
QgsProject::instance()->writeEntry( mNameConfig, QStringLiteral( "/TextFormat" ), fontDoc.toString() );
119136
}
120137

121138

@@ -127,6 +144,7 @@ void QgsDecorationScaleBar::run()
127144

128145
void QgsDecorationScaleBar::setupScaleBar()
129146
{
147+
mSettings.setTextFormat( mTextFormat );
130148
switch ( mStyleIndex )
131149
{
132150
case 0:
@@ -137,8 +155,6 @@ void QgsDecorationScaleBar::setupScaleBar()
137155
mStyle = std::move( tickStyle );
138156
mSettings.setFillColor( mColor );
139157
mSettings.setLineColor( mColor ); // Compatibility with pre 3.2 configuration
140-
mSettings.setFont( mFont );
141-
mSettings.setFontColor( mColor );
142158
mSettings.setHeight( 2.2 );
143159
mSettings.setLineWidth( 0.3 );
144160
break;
@@ -149,8 +165,6 @@ void QgsDecorationScaleBar::setupScaleBar()
149165
mSettings.setFillColor( mColor );
150166
mSettings.setFillColor2( QColor( "transparent" ) );
151167
mSettings.setLineColor( mOutlineColor );
152-
mSettings.setFont( mFont );
153-
mSettings.setFontColor( mColor );
154168
mSettings.setHeight( mStyleIndex == 2 ? 1 : 3 );
155169
mSettings.setLineWidth( mStyleIndex == 2 ? 0.2 : 0.3 );
156170
break;

‎src/app/qgsdecorationscalebar.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class APP_EXPORT QgsDecorationScaleBar: public QgsDecorationItem
6464
QColor mColor;
6565
//! The scale bar otuline color
6666
QColor mOutlineColor;
67-
//! The scale bar font
68-
QFont mFont;
67+
68+
QgsTextFormat mTextFormat;
6969

7070
QgsScaleBarSettings mSettings;
7171

‎src/app/qgsdecorationscalebardialog.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ QgsDecorationScaleBarDialog::QgsDecorationScaleBarDialog( QgsDecorationScaleBar
8484
pbnChangeOutlineColor->setContext( QStringLiteral( "gui" ) );
8585
pbnChangeOutlineColor->setColorDialogTitle( tr( "Select Scale Bar Outline Color" ) );
8686

87-
mButtonFontStyle->setMode( QgsFontButton::ModeQFont );
88-
mButtonFontStyle->setCurrentFont( mDeco.mFont );
87+
mButtonFontStyle->setMode( QgsFontButton::ModeTextRenderer );
88+
mButtonFontStyle->setTextFormat( mDeco.mTextFormat );
8989
}
9090

9191
QgsDecorationScaleBarDialog::~QgsDecorationScaleBarDialog()
@@ -111,7 +111,7 @@ void QgsDecorationScaleBarDialog::apply()
111111
mDeco.mStyleIndex = cboStyle->currentIndex();
112112
mDeco.mColor = pbnChangeColor->color();
113113
mDeco.mOutlineColor = pbnChangeOutlineColor->color();
114-
mDeco.mFont = mButtonFontStyle->currentFont();
114+
mDeco.mTextFormat = mButtonFontStyle->textFormat();
115115
mDeco.setupScaleBar();
116116
mDeco.update();
117117
}

‎src/core/layout/qgscompositionconverter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,9 @@ bool QgsCompositionConverter::readScaleBarXml( QgsLayoutItemScaleBar *layoutItem
10311031
{
10321032
f.fromString( itemElem.attribute( QStringLiteral( "font" ), QLatin1String( "" ) ) );
10331033
}
1034+
Q_NOWARN_DEPRECATED_PUSH
10341035
layoutItem->setFont( f );
1036+
Q_NOWARN_DEPRECATED_POP
10351037

10361038
//colors
10371039
//fill color
@@ -1124,14 +1126,18 @@ bool QgsCompositionConverter::readScaleBarXml( QgsLayoutItemScaleBar *layoutItem
11241126

11251127
if ( redOk && greenOk && blueOk && alphaOk )
11261128
{
1129+
Q_NOWARN_DEPRECATED_PUSH
11271130
layoutItem->setFontColor( QColor( textRed, textGreen, textBlue, textAlpha ) );
1131+
Q_NOWARN_DEPRECATED_POP
11281132
}
11291133
}
11301134
else
11311135
{
11321136
QColor c;
11331137
c.setNamedColor( itemElem.attribute( QStringLiteral( "fontColor" ), QStringLiteral( "#000000" ) ) );
1138+
Q_NOWARN_DEPRECATED_PUSH
11341139
layoutItem->setFontColor( c );
1140+
Q_NOWARN_DEPRECATED_POP
11351141
}
11361142

11371143
//style

‎src/core/layout/qgslayoutitemscalebar.cpp

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,18 @@ void QgsLayoutItemScaleBar::setMaximumBarWidth( double maxWidth )
134134
resizeToMinimumWidth();
135135
}
136136

137+
QgsTextFormat QgsLayoutItemScaleBar::textFormat() const
138+
{
139+
return mSettings.textFormat();
140+
}
141+
142+
void QgsLayoutItemScaleBar::setTextFormat( const QgsTextFormat &format )
143+
{
144+
mSettings.setTextFormat( format );
145+
refreshItemSize();
146+
emit changed();
147+
}
148+
137149
void QgsLayoutItemScaleBar::setNumberOfSegmentsLeft( int nSegmentsLeft )
138150
{
139151
if ( !mStyle )
@@ -376,13 +388,17 @@ void QgsLayoutItemScaleBar::applyDefaultSettings()
376388
//get default composer font from settings
377389
QgsSettings settings;
378390
QString defaultFontString = settings.value( QStringLiteral( "LayoutDesigner/defaultFont" ), QVariant(), QgsSettings::Gui ).toString();
391+
QgsTextFormat format;
379392
QFont f;
380393
if ( !defaultFontString.isEmpty() )
381394
{
382395
f.setFamily( defaultFontString );
383396
}
384-
f.setPointSizeF( 12.0 );
385-
mSettings.setFont( f );
397+
format.setFont( f );
398+
format.setSize( 12.0 );
399+
format.setSizeUnit( QgsUnitTypes::RenderPoints );
400+
401+
mSettings.setTextFormat( format );
386402

387403
mSettings.setUnits( QgsUnitTypes::DistanceUnknownUnit );
388404
refreshItemSize();
@@ -546,17 +562,19 @@ QString QgsLayoutItemScaleBar::style() const
546562

547563
QFont QgsLayoutItemScaleBar::font() const
548564
{
549-
return mSettings.font();
565+
return mSettings.textFormat().font();
550566
}
551567

552568
void QgsLayoutItemScaleBar::setFont( const QFont &font )
553569
{
570+
Q_NOWARN_DEPRECATED_PUSH
554571
mSettings.setFont( font );
572+
Q_NOWARN_DEPRECATED_POP
555573
refreshItemSize();
556574
emit changed();
557575
}
558576

559-
bool QgsLayoutItemScaleBar::writePropertiesToElement( QDomElement &composerScaleBarElem, QDomDocument &doc, const QgsReadWriteContext & ) const
577+
bool QgsLayoutItemScaleBar::writePropertiesToElement( QDomElement &composerScaleBarElem, QDomDocument &doc, const QgsReadWriteContext &rwContext ) const
560578
{
561579
composerScaleBarElem.setAttribute( QStringLiteral( "height" ), QString::number( mSettings.height() ) );
562580
composerScaleBarElem.setAttribute( QStringLiteral( "labelBarSpace" ), QString::number( mSettings.labelBarSpace() ) );
@@ -569,7 +587,10 @@ bool QgsLayoutItemScaleBar::writePropertiesToElement( QDomElement &composerScale
569587
composerScaleBarElem.setAttribute( QStringLiteral( "maxBarWidth" ), mSettings.maximumBarWidth() );
570588
composerScaleBarElem.setAttribute( QStringLiteral( "segmentMillimeters" ), QString::number( mSegmentMillimeters ) );
571589
composerScaleBarElem.setAttribute( QStringLiteral( "numMapUnitsPerScaleBarUnit" ), QString::number( mSettings.mapUnitsPerScaleBarUnit() ) );
572-
composerScaleBarElem.appendChild( QgsFontUtils::toXmlElement( mSettings.font(), doc, QStringLiteral( "scaleBarFont" ) ) );
590+
591+
QDomElement textElem = mSettings.textFormat().writeXml( doc, rwContext );
592+
composerScaleBarElem.appendChild( textElem );
593+
573594
composerScaleBarElem.setAttribute( QStringLiteral( "outlineWidth" ), QString::number( mSettings.lineWidth() ) );
574595
composerScaleBarElem.setAttribute( QStringLiteral( "unitLabel" ), mSettings.unitLabel() );
575596
composerScaleBarElem.setAttribute( QStringLiteral( "unitType" ), QgsUnitTypes::encodeUnit( mSettings.units() ) );
@@ -614,21 +635,13 @@ bool QgsLayoutItemScaleBar::writePropertiesToElement( QDomElement &composerScale
614635
strokeColorElem.setAttribute( QStringLiteral( "alpha" ), QString::number( mSettings.lineColor().alpha() ) );
615636
composerScaleBarElem.appendChild( strokeColorElem );
616637

617-
//font color
618-
QDomElement fontColorElem = doc.createElement( QStringLiteral( "textColor" ) );
619-
fontColorElem.setAttribute( QStringLiteral( "red" ), QString::number( mSettings.fontColor().red() ) );
620-
fontColorElem.setAttribute( QStringLiteral( "green" ), QString::number( mSettings.fontColor().green() ) );
621-
fontColorElem.setAttribute( QStringLiteral( "blue" ), QString::number( mSettings.fontColor().blue() ) );
622-
fontColorElem.setAttribute( QStringLiteral( "alpha" ), QString::number( mSettings.fontColor().alpha() ) );
623-
composerScaleBarElem.appendChild( fontColorElem );
624-
625638
//alignment
626639
composerScaleBarElem.setAttribute( QStringLiteral( "alignment" ), QString::number( static_cast< int >( mSettings.alignment() ) ) );
627640

628641
return true;
629642
}
630643

631-
bool QgsLayoutItemScaleBar::readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &, const QgsReadWriteContext & )
644+
bool QgsLayoutItemScaleBar::readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &, const QgsReadWriteContext &context )
632645
{
633646
mSettings.setHeight( itemElem.attribute( QStringLiteral( "height" ), QStringLiteral( "5.0" ) ).toDouble() );
634647
mSettings.setLabelBarSpace( itemElem.attribute( QStringLiteral( "labelBarSpace" ), QStringLiteral( "3.0" ) ).toDouble() );
@@ -645,12 +658,32 @@ bool QgsLayoutItemScaleBar::readPropertiesFromElement( const QDomElement &itemEl
645658
mSettings.setUnitLabel( itemElem.attribute( QStringLiteral( "unitLabel" ) ) );
646659
mSettings.setLineJoinStyle( QgsSymbolLayerUtils::decodePenJoinStyle( itemElem.attribute( QStringLiteral( "lineJoinStyle" ), QStringLiteral( "miter" ) ) ) );
647660
mSettings.setLineCapStyle( QgsSymbolLayerUtils::decodePenCapStyle( itemElem.attribute( QStringLiteral( "lineCapStyle" ), QStringLiteral( "square" ) ) ) );
648-
QFont f;
649-
if ( !QgsFontUtils::setFromXmlChildNode( f, itemElem, QStringLiteral( "scaleBarFont" ) ) )
661+
662+
QDomNodeList textFormatNodeList = itemElem.elementsByTagName( QStringLiteral( "text-style" ) );
663+
if ( !textFormatNodeList.isEmpty() )
664+
{
665+
QDomElement textFormatElem = textFormatNodeList.at( 0 ).toElement();
666+
mSettings.textFormat().readXml( textFormatElem, context );
667+
}
668+
else
650669
{
651-
f.fromString( itemElem.attribute( QStringLiteral( "font" ), QLatin1String( "" ) ) );
670+
QFont f;
671+
if ( !QgsFontUtils::setFromXmlChildNode( f, itemElem, QStringLiteral( "scaleBarFont" ) ) )
672+
{
673+
f.fromString( itemElem.attribute( QStringLiteral( "font" ), QLatin1String( "" ) ) );
674+
}
675+
mSettings.textFormat().setFont( f );
676+
if ( f.pointSizeF() > 0 )
677+
{
678+
mSettings.textFormat().setSize( f.pointSizeF() );
679+
mSettings.textFormat().setSizeUnit( QgsUnitTypes::RenderPoints );
680+
}
681+
else if ( f.pixelSize() > 0 )
682+
{
683+
mSettings.textFormat().setSize( f.pixelSize() );
684+
mSettings.textFormat().setSizeUnit( QgsUnitTypes::RenderPixels );
685+
}
652686
}
653-
mSettings.setFont( f );
654687

655688
//colors
656689
//fill color
@@ -743,14 +776,14 @@ bool QgsLayoutItemScaleBar::readPropertiesFromElement( const QDomElement &itemEl
743776

744777
if ( redOk && greenOk && blueOk && alphaOk )
745778
{
746-
mSettings.setFontColor( QColor( textRed, textGreen, textBlue, textAlpha ) );
779+
mSettings.textFormat().setColor( QColor( textRed, textGreen, textBlue, textAlpha ) );
747780
}
748781
}
749-
else
782+
else if ( itemElem.hasAttribute( QStringLiteral( "fontColor" ) ) )
750783
{
751784
QColor c;
752785
c.setNamedColor( itemElem.attribute( QStringLiteral( "fontColor" ), QStringLiteral( "#000000" ) ) );
753-
mSettings.setFontColor( c );
786+
mSettings.textFormat().setColor( c );
754787
}
755788

756789
//style

‎src/core/layout/qgslayoutitemscalebar.h

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,31 +174,49 @@ class CORE_EXPORT QgsLayoutItemScaleBar: public QgsLayoutItem
174174
*/
175175
void setUnitLabel( const QString &label ) { mSettings.setUnitLabel( label );}
176176

177+
/**
178+
* Returns the text format used for drawing text in the scalebar.
179+
* \see setTextFormat()
180+
* \since QGIS 3.2
181+
*/
182+
QgsTextFormat textFormat() const;
183+
184+
/**
185+
* Sets the text \a format used for drawing text in the scalebar.
186+
* \see textFormat()
187+
* \since QGIS 3.2
188+
*/
189+
void setTextFormat( const QgsTextFormat &format );
190+
177191
/**
178192
* Returns the font used for drawing text in the scalebar.
179193
* \see setFont()
194+
* \deprecated use textFormat() instead
180195
*/
181-
QFont font() const;
196+
Q_DECL_DEPRECATED QFont font() const SIP_DEPRECATED;
182197

183198
/**
184199
* Sets the \a font used for drawing text in the scalebar.
185-
* \see setFont()
200+
* \see font()
201+
* \deprecated use setTextFormat() instead
186202
*/
187-
void setFont( const QFont &font );
203+
Q_DECL_DEPRECATED void setFont( const QFont &font ) SIP_DEPRECATED;
188204

189205
/**
190206
* Returns the color used for drawing text in the scalebar.
191207
* \see setFontColor()
192208
* \see font()
209+
* \deprecated use textFormat() instead
193210
*/
194-
QColor fontColor() const { return mSettings.fontColor(); }
211+
Q_DECL_DEPRECATED QColor fontColor() const SIP_DEPRECATED { return mSettings.textFormat().color(); }
195212

196213
/**
197214
* Sets the \a color used for drawing text in the scalebar.
198215
* \see fontColor()
199216
* \see setFont()
217+
* \deprecated use setTextFormat() instead
200218
*/
201-
void setFontColor( const QColor &color ) { mSettings.setFontColor( color ); }
219+
Q_DECL_DEPRECATED void setFontColor( const QColor &color ) SIP_DEPRECATED { mSettings.textFormat().setColor( color ); }
202220

203221
/**
204222
* Returns the color used for fills in the scalebar.

‎src/core/scalebar/qgsdoubleboxscalebarrenderer.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ void QgsDoubleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
2828
}
2929
QPainter *painter = context.painter();
3030

31-
double barTopPosition = context.convertToPainterUnits( QgsLayoutUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
31+
double scaledLabelBarSpace = context.convertToPainterUnits( settings.labelBarSpace(), QgsUnitTypes::RenderMillimeters );
32+
double scaledBoxContentSpace = context.convertToPainterUnits( settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
33+
QFontMetricsF fontMetrics = QgsTextRenderer::fontMetrics( context, settings.textFormat() );
34+
double barTopPosition = fontMetrics.ascent() + scaledLabelBarSpace + scaledBoxContentSpace;
3235
double segmentHeight = context.convertToPainterUnits( settings.height() / 2, QgsUnitTypes::RenderMillimeters );
3336

3437
painter->save();
@@ -41,7 +44,7 @@ void QgsDoubleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
4144

4245
bool useColor = true; //alternate brush color/white
4346

44-
double xOffset = context.convertToPainterUnits( firstLabelXOffset( settings ), QgsUnitTypes::RenderMillimeters );
47+
double xOffset = firstLabelXOffset( settings, context );
4548

4649
QList<double> positions = segmentPositions( scaleContext, settings );
4750
QList<double> widths = segmentWidths( scaleContext, settings );

‎src/core/scalebar/qgsnumericscalebarrenderer.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,38 +33,37 @@ void QgsNumericScaleBarRenderer::draw( QgsRenderContext &context, const QgsScale
3333
if ( context.flags() & QgsRenderContext::Antialiasing )
3434
painter->setRenderHint( QPainter::Antialiasing, true );
3535

36-
QFont scaledFont = settings.font();
37-
scaledFont.setPointSizeF( scaledFont.pointSizeF() * context.scaleFactor() );
38-
3936
double margin = context.convertToPainterUnits( settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
4037
//map scalebar alignment to Qt::AlignmentFlag type
41-
Qt::AlignmentFlag hAlign = Qt::AlignLeft;
38+
QgsTextRenderer::HAlignment hAlign = QgsTextRenderer::AlignLeft;
4239
switch ( settings.alignment() )
4340
{
4441
case QgsScaleBarSettings::AlignLeft:
45-
hAlign = Qt::AlignLeft;
42+
hAlign = QgsTextRenderer::AlignLeft;
4643
break;
4744
case QgsScaleBarSettings::AlignMiddle:
48-
hAlign = Qt::AlignHCenter;
45+
hAlign = QgsTextRenderer::AlignCenter;
4946
break;
5047
case QgsScaleBarSettings::AlignRight:
51-
hAlign = Qt::AlignRight;
48+
hAlign = QgsTextRenderer::AlignRight;
5249
break;
5350
}
5451

5552
//text destination is item's rect, excluding the margin
5653
QRectF painterRect( margin, margin, context.convertToPainterUnits( scaleContext.size.width(), QgsUnitTypes::RenderMillimeters ) - 2 * margin,
5754
context.convertToPainterUnits( scaleContext.size.height(), QgsUnitTypes::RenderMillimeters ) - 2 * margin );
58-
QgsLayoutUtils::drawText( painter, painterRect, scaleText( scaleContext.scale ), scaledFont, settings.fontColor(), hAlign, Qt::AlignTop );
55+
QgsTextRenderer::drawText( painterRect, 0, hAlign, QStringList() << scaleText( scaleContext.scale ), context, settings.textFormat() );
5956

6057
painter->restore();
6158
}
6259

6360
QSizeF QgsNumericScaleBarRenderer::calculateBoxSize( const QgsScaleBarSettings &settings,
6461
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const
6562
{
66-
double textWidth = QgsLayoutUtils::textWidthMM( settings.font(), scaleText( scaleContext.scale ) );
67-
double textHeight = QgsLayoutUtils::fontAscentMM( settings.font() );
63+
QFont font = settings.textFormat().toQFont();
64+
65+
double textWidth = QgsLayoutUtils::textWidthMM( font, scaleText( scaleContext.scale ) );
66+
double textHeight = QgsLayoutUtils::fontAscentMM( font );
6867

6968
return QSizeF( 2 * settings.boxContentSpace() + 2 * settings.pen().width() + textWidth,
7069
textHeight + 2 * settings.boxContentSpace() );

‎src/core/scalebar/qgsscalebarrenderer.cpp

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "qgsscalebarrenderer.h"
1818
#include "qgsscalebarsettings.h"
1919
#include "qgslayoututils.h"
20+
#include "qgstextrenderer.h"
2021
#include <QFontMetricsF>
2122
#include <QPainter>
2223

@@ -31,12 +32,13 @@ void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const Qg
3132

3233
painter->save();
3334

34-
QFont scaledFont = settings.font();
35-
scaledFont.setPointSizeF( scaledFont.pointSizeF() * context.scaleFactor() );
36-
painter->setPen( QPen( settings.fontColor() ) );
35+
QgsTextFormat format = settings.textFormat();
3736

3837
QString firstLabel = firstLabelString( settings );
39-
double xOffset = context.convertToPainterUnits( QgsLayoutUtils::textWidthMM( settings.font(), firstLabel ) / 2, QgsUnitTypes::RenderMillimeters );
38+
QFontMetricsF fontMetrics = QgsTextRenderer::fontMetrics( context, format );
39+
double xOffset = fontMetrics.width( firstLabel ) / 2.0;
40+
41+
double scaledBoxContentSpace = context.convertToPainterUnits( settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
4042

4143
double currentLabelNumber = 0.0;
4244

@@ -65,9 +67,9 @@ void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const Qg
6567

6668
if ( segmentCounter == 0 || segmentCounter >= nSegmentsLeft ) //don't draw label for intermediate left segments
6769
{
68-
QgsLayoutUtils::drawText( painter, QPointF( context.convertToPainterUnits( positions.at( i ) - QgsLayoutUtils::textWidthMM( settings.font(), currentNumericLabel ) / 2, QgsUnitTypes::RenderMillimeters ) + xOffset,
69-
context.convertToPainterUnits( QgsLayoutUtils::fontAscentMM( settings.font() ) + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters ) ),
70-
currentNumericLabel, scaledFont, settings.fontColor() );
70+
QgsTextRenderer::drawText( QPointF( context.convertToPainterUnits( positions.at( i ), QgsUnitTypes::RenderMillimeters ) + xOffset,
71+
fontMetrics.ascent() + scaledBoxContentSpace ), 0, QgsTextRenderer::AlignCenter,
72+
QStringList() << currentNumericLabel, context, format );
7173
}
7274

7375
if ( segmentCounter >= nSegmentsLeft )
@@ -81,9 +83,9 @@ void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const Qg
8183
if ( !positions.isEmpty() )
8284
{
8385
currentNumericLabel = QString::number( currentLabelNumber / settings.mapUnitsPerScaleBarUnit() );
84-
QgsLayoutUtils::drawText( painter, QPointF( context.convertToPainterUnits( positions.at( positions.size() - 1 ) + scaleContext.segmentWidth - QgsLayoutUtils::textWidthMM( settings.font(), currentNumericLabel ) / 2, QgsUnitTypes::RenderMillimeters ) + xOffset,
85-
context.convertToPainterUnits( QgsLayoutUtils::fontAscentMM( settings.font() ) + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters ) ),
86-
currentNumericLabel + ' ' + settings.unitLabel(), scaledFont, settings.fontColor() );
86+
QgsTextRenderer::drawText( QPointF( context.convertToPainterUnits( positions.at( positions.size() - 1 ) + scaleContext.segmentWidth, QgsUnitTypes::RenderMillimeters ) + xOffset,
87+
fontMetrics.ascent() + scaledBoxContentSpace ), 0, QgsTextRenderer::AlignCenter,
88+
QStringList() << ( currentNumericLabel + ' ' + settings.unitLabel() ), context, format );
8789
}
8890

8991
painter->restore();
@@ -92,20 +94,22 @@ void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const Qg
9294
QSizeF QgsScaleBarRenderer::calculateBoxSize( const QgsScaleBarSettings &settings,
9395
const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const
9496
{
97+
QFont font = settings.textFormat().toQFont();
98+
9599
//consider centered first label
96-
double firstLabelLeft = QgsLayoutUtils::textWidthMM( settings.font(), firstLabelString( settings ) ) / 2;
100+
double firstLabelLeft = QgsLayoutUtils::textWidthMM( font, firstLabelString( settings ) ) / 2;
97101

98102
//consider last number and label
99103

100104
double largestLabelNumber = settings.numberOfSegments() * settings.unitsPerSegment() / settings.mapUnitsPerScaleBarUnit();
101105
QString largestNumberLabel = QString::number( largestLabelNumber );
102106
QString largestLabel = QString::number( largestLabelNumber ) + ' ' + settings.unitLabel();
103-
double largestLabelWidth = QgsLayoutUtils::textWidthMM( settings.font(), largestLabel ) - QgsLayoutUtils::textWidthMM( settings.font(), largestNumberLabel ) / 2;
107+
double largestLabelWidth = QgsLayoutUtils::textWidthMM( font, largestLabel ) - QgsLayoutUtils::textWidthMM( font, largestNumberLabel ) / 2;
104108

105109
double totalBarLength = scaleContext.segmentWidth * ( settings.numberOfSegments() + ( settings.numberOfSegmentsLeft() > 0 ? 1 : 0 ) );
106110

107111
double width = firstLabelLeft + totalBarLength + 2 * settings.pen().widthF() + largestLabelWidth + 2 * settings.boxContentSpace();
108-
double height = settings.height() + settings.labelBarSpace() + 2 * settings.boxContentSpace() + QgsLayoutUtils::fontAscentMM( settings.font() );
112+
double height = settings.height() + settings.labelBarSpace() + 2 * settings.boxContentSpace() + QgsLayoutUtils::fontAscentMM( font );
109113

110114
return QSizeF( width, height );
111115
}
@@ -125,7 +129,15 @@ QString QgsScaleBarRenderer::firstLabelString( const QgsScaleBarSettings &settin
125129
double QgsScaleBarRenderer::firstLabelXOffset( const QgsScaleBarSettings &settings ) const
126130
{
127131
QString firstLabel = firstLabelString( settings );
132+
Q_NOWARN_DEPRECATED_PUSH
128133
return QgsLayoutUtils::textWidthMM( settings.font(), firstLabel ) / 2.0;
134+
Q_NOWARN_DEPRECATED_POP
135+
}
136+
137+
double QgsScaleBarRenderer::firstLabelXOffset( const QgsScaleBarSettings &settings, const QgsRenderContext &context ) const
138+
{
139+
QString firstLabel = firstLabelString( settings );
140+
return QgsTextRenderer::textWidth( context, settings.textFormat(), QStringList() << firstLabel ) / 2.0;
129141
}
130142

131143
QList<double> QgsScaleBarRenderer::segmentPositions( const ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const
@@ -136,6 +148,7 @@ QList<double> QgsScaleBarRenderer::segmentPositions( const ScaleBarContext &scal
136148

137149
//left segments
138150
double leftSegmentSize = scaleContext.segmentWidth / settings.numberOfSegmentsLeft();
151+
positions.reserve( settings.numberOfSegmentsLeft() + settings.numberOfSegments() );
139152
for ( int i = 0; i < settings.numberOfSegmentsLeft(); ++i )
140153
{
141154
positions << currentXCoord;
@@ -154,6 +167,7 @@ QList<double> QgsScaleBarRenderer::segmentPositions( const ScaleBarContext &scal
154167
QList<double> QgsScaleBarRenderer::segmentWidths( const ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const
155168
{
156169
QList<double> widths;
170+
widths.reserve( settings.numberOfSegmentsLeft() + settings.numberOfSegments() );
157171

158172
//left segments
159173
if ( settings.numberOfSegmentsLeft() > 0 )

‎src/core/scalebar/qgsscalebarrenderer.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#define QGSSCALEBARRENDERER_H
1919

2020
#include "qgis_core.h"
21+
#include "qgis_sip.h"
2122
#include <QRectF>
2223
#include <QList>
2324

@@ -103,8 +104,15 @@ class CORE_EXPORT QgsScaleBarRenderer
103104

104105
/**
105106
* Returns the x-offset (in millimeters) used for the first label in the scalebar.
107+
* \deprecated Use the version with QgsRenderContext instead.
106108
*/
107-
double firstLabelXOffset( const QgsScaleBarSettings &settings ) const;
109+
Q_DECL_DEPRECATED double firstLabelXOffset( const QgsScaleBarSettings &settings ) const SIP_DEPRECATED;
110+
111+
/**
112+
* Returns the x-offset (in render context painter units) used for the first label in the scalebar.
113+
* \since QGIS 3.2
114+
*/
115+
double firstLabelXOffset( const QgsScaleBarSettings &settings, const QgsRenderContext &context ) const;
108116

109117
/**
110118
* Returns a list of positions for each segment within the scalebar.

‎src/core/scalebar/qgsscalebarsettings.h

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgis_core.h"
2121
#include "qgis.h"
2222
#include "qgsunittypes.h"
23+
#include "qgstextrenderer.h"
2324
#include <QColor>
2425
#include <QFont>
2526
#include <QPen>
@@ -71,8 +72,9 @@ class CORE_EXPORT QgsScaleBarSettings
7172
mBrush2.setColor( mFillColor2 );
7273
mBrush2.setStyle( Qt::SolidPattern );
7374

74-
mFont.setPointSizeF( 12.0 );
75-
mFontColor = QColor( 0, 0, 0 );
75+
mTextFormat.setSize( 12.0 );
76+
mTextFormat.setSizeUnit( QgsUnitTypes::RenderPoints );
77+
mTextFormat.setColor( QColor( 0, 0, 0 ) );
7678
}
7779

7880
/**
@@ -207,31 +209,69 @@ class CORE_EXPORT QgsScaleBarSettings
207209
*/
208210
void setUnitLabel( const QString &label ) { mUnitLabeling = label; }
209211

212+
/**
213+
* Returns the text format used for drawing text in the scalebar.
214+
* \see setTextFormat()
215+
* \since QGIS 3.2
216+
*/
217+
QgsTextFormat &textFormat() { return mTextFormat; }
218+
219+
/**
220+
* Returns the text format used for drawing text in the scalebar.
221+
* \see setTextFormat()
222+
* \since QGIS 3.2
223+
*/
224+
QgsTextFormat textFormat() const SIP_SKIP { return mTextFormat; }
225+
226+
/**
227+
* Sets the text \a format used for drawing text in the scalebar.
228+
* \see textFormat()
229+
* \since QGIS 3.2
230+
*/
231+
void setTextFormat( const QgsTextFormat &format ) { mTextFormat = format; }
232+
210233
/**
211234
* Returns the font used for drawing text in the scalebar.
212235
* \see setFont()
236+
* \deprecated use textFormat() instead
213237
*/
214-
QFont font() const { return mFont; }
238+
Q_DECL_DEPRECATED QFont font() const SIP_DEPRECATED { return mTextFormat.font(); }
215239

216240
/**
217241
* Sets the \a font used for drawing text in the scalebar.
218-
* \see setFont()
242+
* \see font()
243+
* \deprecated use setTextFormat() instead
219244
*/
220-
void setFont( const QFont &font ) { mFont = font; }
245+
Q_DECL_DEPRECATED void setFont( const QFont &font ) SIP_DEPRECATED
246+
{
247+
mTextFormat.setFont( font );
248+
if ( font.pointSizeF() > 0 )
249+
{
250+
mTextFormat.setSize( font.pointSizeF() );
251+
mTextFormat.setSizeUnit( QgsUnitTypes::RenderPoints );
252+
}
253+
else if ( font.pixelSize() > 0 )
254+
{
255+
mTextFormat.setSize( font.pixelSize() );
256+
mTextFormat.setSizeUnit( QgsUnitTypes::RenderPixels );
257+
}
258+
}
221259

222260
/**
223261
* Returns the color used for drawing text in the scalebar.
224262
* \see setFontColor()
225263
* \see font()
264+
* \deprecated use textFormat() instead
226265
*/
227-
QColor fontColor() const { return mFontColor; }
266+
Q_DECL_DEPRECATED QColor fontColor() const SIP_DEPRECATED { return mTextFormat.color(); }
228267

229268
/**
230269
* Sets the \a color used for drawing text in the scalebar.
231270
* \see fontColor()
232271
* \see setFont()
272+
* \deprecated use textFormat() instead
233273
*/
234-
void setFontColor( const QColor &color ) { mFontColor = color; }
274+
Q_DECL_DEPRECATED void setFontColor( const QColor &color ) SIP_DEPRECATED { mTextFormat.setColor( color ); }
235275

236276
/**
237277
* Returns the color used for fills in the scalebar.
@@ -417,9 +457,10 @@ class CORE_EXPORT QgsScaleBarSettings
417457

418458
//! Labeling of map units
419459
QString mUnitLabeling;
420-
//! Font
421-
QFont mFont;
422-
QColor mFontColor;
460+
461+
//! Text format
462+
QgsTextFormat mTextFormat;
463+
423464
//! Fill color
424465
QColor mFillColor = QColor( 0, 0, 0 );
425466
//! Secondary fill color

‎src/core/scalebar/qgssingleboxscalebarrenderer.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ void QgsSingleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
2828
}
2929
QPainter *painter = context.painter();
3030

31-
double barTopPosition = context.convertToPainterUnits( QgsLayoutUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
31+
double scaledLabelBarSpace = context.convertToPainterUnits( settings.labelBarSpace(), QgsUnitTypes::RenderMillimeters );
32+
double scaledBoxContentSpace = context.convertToPainterUnits( settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
33+
QFontMetricsF fontMetrics = QgsTextRenderer::fontMetrics( context, settings.textFormat() );
34+
double barTopPosition = fontMetrics.ascent() + scaledLabelBarSpace + scaledBoxContentSpace;
3235

3336
painter->save();
3437
if ( context.flags() & QgsRenderContext::Antialiasing )
@@ -39,7 +42,7 @@ void QgsSingleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
3942
painter->setPen( pen );
4043

4144
bool useColor = true; //alternate brush color/white
42-
double xOffset = context.convertToPainterUnits( firstLabelXOffset( settings ), QgsUnitTypes::RenderMillimeters );
45+
double xOffset = firstLabelXOffset( settings, context );
4346

4447
QList<double> positions = segmentPositions( scaleContext, settings );
4548
QList<double> widths = segmentWidths( scaleContext, settings );

‎src/core/scalebar/qgsticksscalebarrenderer.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,14 @@ void QgsTicksScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBa
4040

4141
QPainter *painter = context.painter();
4242

43-
double barTopPosition = context.convertToPainterUnits( QgsLayoutUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
43+
double scaledLabelBarSpace = context.convertToPainterUnits( settings.labelBarSpace(), QgsUnitTypes::RenderMillimeters );
44+
double scaledBoxContentSpace = context.convertToPainterUnits( settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
45+
QFontMetricsF fontMetrics = QgsTextRenderer::fontMetrics( context, settings.textFormat() );
46+
double barTopPosition = fontMetrics.ascent() + scaledLabelBarSpace + scaledBoxContentSpace;
4447
double middlePosition = barTopPosition + context.convertToPainterUnits( settings.height() / 2.0, QgsUnitTypes::RenderMillimeters );
4548
double bottomPosition = barTopPosition + context.convertToPainterUnits( settings.height(), QgsUnitTypes::RenderMillimeters );
4649

47-
double xOffset = context.convertToPainterUnits( firstLabelXOffset( settings ), QgsUnitTypes::RenderMillimeters );
50+
double xOffset = firstLabelXOffset( settings, context );
4851

4952
painter->save();
5053
if ( context.flags() & QgsRenderContext::Antialiasing )

‎src/ui/layout/qgslayoutscalebarwidgetbase.ui

Lines changed: 32 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,9 @@
6060
<property name="geometry">
6161
<rect>
6262
<x>0</x>
63-
<y>0</y>
63+
<y>-337</y>
6464
<width>440</width>
65-
<height>1004</height>
65+
<height>973</height>
6666
</rect>
6767
</property>
6868
<layout class="QVBoxLayout" name="mainLayout">
@@ -466,50 +466,7 @@
466466
<bool>true</bool>
467467
</property>
468468
<layout class="QGridLayout" name="gridLayout_5" columnstretch="0,0">
469-
<item row="1" column="1">
470-
<layout class="QHBoxLayout" name="horizontalLayout_2">
471-
<item>
472-
<widget class="QgsColorButton" name="mFontColorButton">
473-
<property name="minimumSize">
474-
<size>
475-
<width>120</width>
476-
<height>0</height>
477-
</size>
478-
</property>
479-
<property name="maximumSize">
480-
<size>
481-
<width>120</width>
482-
<height>16777215</height>
483-
</size>
484-
</property>
485-
<property name="text">
486-
<string/>
487-
</property>
488-
</widget>
489-
</item>
490-
<item>
491-
<spacer name="horizontalSpacer">
492-
<property name="orientation">
493-
<enum>Qt::Horizontal</enum>
494-
</property>
495-
<property name="sizeHint" stdset="0">
496-
<size>
497-
<width>40</width>
498-
<height>20</height>
499-
</size>
500-
</property>
501-
</spacer>
502-
</item>
503-
</layout>
504-
</item>
505-
<item row="1" column="0">
506-
<widget class="QLabel" name="label_7">
507-
<property name="text">
508-
<string>Font color</string>
509-
</property>
510-
</widget>
511-
</item>
512-
<item row="4" column="1">
469+
<item row="3" column="1">
513470
<layout class="QHBoxLayout" name="horizontalLayout_5">
514471
<item>
515472
<widget class="QgsColorButton" name="mStrokeColorButton">
@@ -552,24 +509,37 @@
552509
</item>
553510
</layout>
554511
</item>
555-
<item row="3" column="0">
556-
<widget class="QLabel" name="label_10">
512+
<item row="0" column="0" colspan="2">
513+
<widget class="QgsFontButton" name="mFontButton">
514+
<property name="sizePolicy">
515+
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
516+
<horstretch>0</horstretch>
517+
<verstretch>0</verstretch>
518+
</sizepolicy>
519+
</property>
557520
<property name="text">
558-
<string>Secondary fill color</string>
521+
<string>Font</string>
559522
</property>
560523
</widget>
561524
</item>
562-
<item row="2" column="0">
525+
<item row="1" column="0">
563526
<widget class="QLabel" name="label_9">
564527
<property name="text">
565528
<string>Fill color</string>
566529
</property>
567530
</widget>
568531
</item>
569-
<item row="3" column="1">
570-
<layout class="QHBoxLayout" name="horizontalLayout_4">
532+
<item row="3" column="0">
533+
<widget class="QLabel" name="label_11">
534+
<property name="text">
535+
<string>Line color</string>
536+
</property>
537+
</widget>
538+
</item>
539+
<item row="1" column="1">
540+
<layout class="QHBoxLayout" name="horizontalLayout_3">
571541
<item>
572-
<widget class="QgsColorButton" name="mFillColor2Button">
542+
<widget class="QgsColorButton" name="mFillColorButton">
573543
<property name="minimumSize">
574544
<size>
575545
<width>120</width>
@@ -588,14 +558,14 @@
588558
</widget>
589559
</item>
590560
<item>
591-
<widget class="QgsPropertyOverrideButton" name="mFillColor2DDBtn">
561+
<widget class="QgsPropertyOverrideButton" name="mFillColorDDBtn">
592562
<property name="text">
593563
<string>…</string>
594564
</property>
595565
</widget>
596566
</item>
597567
<item>
598-
<spacer name="horizontalSpacer_3">
568+
<spacer name="horizontalSpacer_2">
599569
<property name="orientation">
600570
<enum>Qt::Horizontal</enum>
601571
</property>
@@ -609,17 +579,17 @@
609579
</item>
610580
</layout>
611581
</item>
612-
<item row="4" column="0">
613-
<widget class="QLabel" name="label_11">
582+
<item row="2" column="0">
583+
<widget class="QLabel" name="label_10">
614584
<property name="text">
615-
<string>Line color</string>
585+
<string>Secondary fill color</string>
616586
</property>
617587
</widget>
618588
</item>
619589
<item row="2" column="1">
620-
<layout class="QHBoxLayout" name="horizontalLayout_3">
590+
<layout class="QHBoxLayout" name="horizontalLayout_4">
621591
<item>
622-
<widget class="QgsColorButton" name="mFillColorButton">
592+
<widget class="QgsColorButton" name="mFillColor2Button">
623593
<property name="minimumSize">
624594
<size>
625595
<width>120</width>
@@ -638,14 +608,14 @@
638608
</widget>
639609
</item>
640610
<item>
641-
<widget class="QgsPropertyOverrideButton" name="mFillColorDDBtn">
611+
<widget class="QgsPropertyOverrideButton" name="mFillColor2DDBtn">
642612
<property name="text">
643613
<string>…</string>
644614
</property>
645615
</widget>
646616
</item>
647617
<item>
648-
<spacer name="horizontalSpacer_2">
618+
<spacer name="horizontalSpacer_3">
649619
<property name="orientation">
650620
<enum>Qt::Horizontal</enum>
651621
</property>
@@ -659,19 +629,6 @@
659629
</item>
660630
</layout>
661631
</item>
662-
<item row="0" column="0" colspan="2">
663-
<widget class="QgsFontButton" name="mFontButton">
664-
<property name="sizePolicy">
665-
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
666-
<horstretch>0</horstretch>
667-
<verstretch>0</verstretch>
668-
</sizepolicy>
669-
</property>
670-
<property name="text">
671-
<string>Font</string>
672-
</property>
673-
</widget>
674-
</item>
675632
</layout>
676633
</widget>
677634
</item>
@@ -765,7 +722,6 @@
765722
<tabstop>mAlignmentComboBox</tabstop>
766723
<tabstop>groupBox_4</tabstop>
767724
<tabstop>mFontButton</tabstop>
768-
<tabstop>mFontColorButton</tabstop>
769725
<tabstop>mFillColorButton</tabstop>
770726
<tabstop>mFillColorDDBtn</tabstop>
771727
<tabstop>mFillColor2Button</tabstop>

‎tests/src/core/testqgslayoutscalebar.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ void TestQgsLayoutScaleBar::singleBox()
113113
scalebar->attemptSetSceneRect( QRectF( 20, 180, 50, 20 ) );
114114
l.addLayoutItem( scalebar );
115115
scalebar->setLinkedMap( map );
116-
scalebar->setFont( QgsFontUtils::getStandardTestFont() );
116+
scalebar->setTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont() ) );
117117
scalebar->setUnits( QgsUnitTypes::DistanceMeters );
118118
scalebar->setUnitsPerSegment( 2000 );
119119
scalebar->setNumberOfSegmentsLeft( 0 );
@@ -141,7 +141,9 @@ void TestQgsLayoutScaleBar::singleBoxAlpha()
141141
scalebar->attemptSetSceneRect( QRectF( 20, 180, 50, 20 ) );
142142
l.addLayoutItem( scalebar );
143143
scalebar->setLinkedMap( map );
144-
scalebar->setFont( QgsFontUtils::getStandardTestFont() );
144+
QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont() );
145+
format.setColor( QColor( 255, 0, 255, 100 ) );
146+
scalebar->setTextFormat( format );
145147
scalebar->setUnits( QgsUnitTypes::DistanceMeters );
146148
scalebar->setUnitsPerSegment( 2000 );
147149
scalebar->setNumberOfSegmentsLeft( 0 );
@@ -153,7 +155,6 @@ void TestQgsLayoutScaleBar::singleBoxAlpha()
153155
scalebar->setFillColor( QColor( 255, 0, 0, 100 ) );
154156
scalebar->setFillColor2( QColor( 0, 255, 0, 50 ) );
155157
scalebar->setLineColor( QColor( 0, 0, 255, 150 ) );
156-
scalebar->setFontColor( QColor( 255, 0, 255, 100 ) );
157158
scalebar->setLineWidth( 1.0 );
158159
QgsLayoutChecker checker( QStringLiteral( "layoutscalebar_singlebox_alpha" ), &l );
159160
checker.setControlPathPrefix( QStringLiteral( "layout_scalebar" ) );
@@ -174,7 +175,9 @@ void TestQgsLayoutScaleBar::doubleBox()
174175
scalebar->attemptSetSceneRect( QRectF( 20, 180, 50, 20 ) );
175176
l.addLayoutItem( scalebar );
176177
scalebar->setLinkedMap( map );
177-
scalebar->setFont( QgsFontUtils::getStandardTestFont() );
178+
QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont() );
179+
format.setColor( Qt::black );
180+
scalebar->setTextFormat( format );
178181
scalebar->setUnits( QgsUnitTypes::DistanceMeters );
179182
scalebar->setUnitsPerSegment( 2000 );
180183
scalebar->setNumberOfSegmentsLeft( 0 );
@@ -186,7 +189,6 @@ void TestQgsLayoutScaleBar::doubleBox()
186189
scalebar->setFillColor2( Qt::white );
187190
scalebar->setLineColor( Qt::black );
188191
scalebar->setLineWidth( 1.0 );
189-
scalebar->setFontColor( Qt::black );
190192
scalebar->setStyle( QStringLiteral( "Double Box" ) );
191193

192194
QgsLayoutChecker checker( QStringLiteral( "layoutscalebar_doublebox" ), &l );
@@ -208,7 +210,8 @@ void TestQgsLayoutScaleBar::numeric()
208210
scalebar->attemptSetSceneRect( QRectF( 20, 180, 50, 20 ) );
209211
l.addLayoutItem( scalebar );
210212
scalebar->setLinkedMap( map );
211-
scalebar->setFont( QgsFontUtils::getStandardTestFont() );
213+
QgsTextFormat format = QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont() );
214+
scalebar->setTextFormat( format );
212215
scalebar->setUnits( QgsUnitTypes::DistanceMeters );
213216
scalebar->setUnitsPerSegment( 2000 );
214217
scalebar->setNumberOfSegmentsLeft( 0 );
@@ -218,7 +221,7 @@ void TestQgsLayoutScaleBar::numeric()
218221

219222
QFont newFont = QgsFontUtils::getStandardTestFont( QStringLiteral( "Bold" ) );
220223
newFont.setPointSizeF( 12 );
221-
scalebar->setFont( newFont );
224+
scalebar->setTextFormat( QgsTextFormat::fromQFont( newFont ) );
222225

223226
scalebar->setStyle( QStringLiteral( "Numeric" ) );
224227
QgsLayoutChecker checker( QStringLiteral( "layoutscalebar_numeric" ), &l );
@@ -241,7 +244,7 @@ void TestQgsLayoutScaleBar::tick()
241244
scalebar->attemptSetSceneRect( QRectF( 20, 180, 50, 20 ) );
242245
l.addLayoutItem( scalebar );
243246
scalebar->setLinkedMap( map );
244-
scalebar->setFont( QgsFontUtils::getStandardTestFont() );
247+
scalebar->setTextFormat( QgsTextFormat::fromQFont( QgsFontUtils::getStandardTestFont() ) );
245248
scalebar->setUnits( QgsUnitTypes::DistanceMeters );
246249
scalebar->setUnitsPerSegment( 2000 );
247250
scalebar->setNumberOfSegmentsLeft( 0 );

0 commit comments

Comments
 (0)
Please sign in to comment.