New widget QgsTextPreview for previewing all formatting for QgsTextRenderer

Switch the labeling gui to use this widget, which has the benefits:
- previews all label settings, including shadow and background
- previews at a specified scale, so that any sizes using map units
will be correct
This commit is contained in:
Nyall Dawson 2016-10-01 14:29:05 +10:00
parent e3517c6f4c
commit 0b88de2487
8 changed files with 606 additions and 412 deletions

View File

@ -161,6 +161,7 @@
%Include qgstabwidget.sip
%Include qgstablewidgetitem.sip
%Include qgstextannotationitem.sip
%Include qgstextpreview.sip
%Include qgstrackedvectorlayertools.sip
%Include qgstreewidgetitem.sip
%Include qgsunitselectionwidget.sip

View File

@ -0,0 +1,66 @@
/** \class QgsTextPreview
* \ingroup gui
* A widget for previewing text formatting settings.
*
* QgsTextPreview provides a widget for previewing the appearance of text rendered
* using QgsTextRenderer. The preview includes all settings contained within
* a QgsTextFormat, including shadow, background and buffer.
*
* In order to preview the exact appearance of text which uses sizes in map units,
* the scale and map units must be set by calling setScale() and setMapUnits().
*
* @note Added in QGIS 3.0
*/
class QgsTextPreview : public QLabel
{
%TypeHeaderCode
#include <qgstextpreview.h>
%End
public:
/** Constructor for QgsTextPreview
* @param parent parent widget
*/
QgsTextPreview( QWidget* parent = nullptr );
void paintEvent( QPaintEvent* e );
/** Sets the text format for previewing in the widget.
* @param format text format
* @see format()
*/
void setFormat( const QgsTextFormat& format );
/** Returns the text format used for previewing text in the widget.
* @see setFormat()
*/
QgsTextFormat format() const;
/** Sets the scale to use for previewing format sizes in map units.
* @param scale preview map scale
* @see scale()
* @see setMapUnits()
*/
void setScale( double scale );
/** Returns the scale used for previewing format sizes in map units.
* @see setScale()
* @see mapUnits()
*/
double scale() const;
/** Sets the map unit type for previewing format sizes in map units.
* @param unit map units
* @see mapUnits()
* @see setScale()
*/
void setMapUnits( QgsUnitTypes::DistanceUnit unit );
/** Returns the map unit type used for previewing format sizes in map units.
* @see setMapUnits()
* @see scale()
*/
QgsUnitTypes::DistanceUnit mapUnits() const;
};

View File

@ -78,6 +78,10 @@ QgsLabelingGui::QgsLabelingGui( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas,
{
setupUi( this );
mPreviewScaleComboBox->setMapCanvas( mMapCanvas );
mPreviewScaleComboBox->setShowCurrentScaleButton( true );
connect( mPreviewScaleComboBox, SIGNAL( scaleChanged( double ) ), this, SLOT( previewScaleChanged( double ) ) );
mFieldExpressionWidget->registerExpressionContextGenerator( this );
Q_FOREACH ( QgsUnitSelectionWidget* unitWidget, findChildren<QgsUnitSelectionWidget*>() )
@ -485,6 +489,12 @@ QgsLabelingGui::QgsLabelingGui( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas,
// set correct initial tab to match displayed setting page
whileBlocking( mOptionsTab )->setCurrentIndex( mLabelStackedWidget->currentIndex() );
if ( mMapCanvas )
{
lblFontPreview->setMapUnits( mMapCanvas->mapSettings().mapUnits() );
mPreviewScaleComboBox->setScale( 1.0 / mMapCanvas->mapSettings().scale() );
}
}
void QgsLabelingGui::setDockMode( bool enabled )
@ -958,7 +968,10 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
lyr.distInMapUnits = ( mLineDistanceUnitWidget->unit() == QgsUnitTypes::RenderMapUnits );
lyr.distMapUnitScale = mLineDistanceUnitWidget->getMapUnitScale();
lyr.offsetType = static_cast< QgsPalLayerSettings::OffsetType >( mOffsetTypeComboBox->currentData().toInt() );
lyr.quadOffset = ( QgsPalLayerSettings::QuadrantPosition )mQuadrantBtnGrp->checkedId();
if ( mQuadrantBtnGrp )
{
lyr.quadOffset = ( QgsPalLayerSettings::QuadrantPosition )mQuadrantBtnGrp->checkedId();
}
lyr.xOffset = mPointOffsetXSpinBox->value();
lyr.yOffset = mPointOffsetYSpinBox->value();
lyr.labelOffsetInMapUnits = ( mPointOffsetUnitWidget->unit() == QgsUnitTypes::RenderMapUnits );
@ -1036,6 +1049,7 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
QgsTextFormat format;
format.setColor( btnTextColor->color() );
format.setFont( mRefFont );
format.setSize( mFontSizeSpinBox->value() );
format.setNamedStyle( mFontStyleComboBox->currentText() );
format.setOpacity( 1.0 - mFontTranspSpinBox->value() / 100.0 );
format.setBlendMode( comboBlendMode->blendMode() );
@ -1115,9 +1129,14 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
lyr.leftDirectionSymbol = mDirectSymbLeftLineEdit->text();
lyr.rightDirectionSymbol = mDirectSymbRightLineEdit->text();
lyr.reverseDirectionSymbol = mDirectSymbRevChkBx->isChecked();
lyr.placeDirectionSymbol = ( QgsPalLayerSettings::DirectionSymbols )mDirectSymbBtnGrp->checkedId();
lyr.upsidedownLabels = ( QgsPalLayerSettings::UpsideDownLabels )mUpsidedownBtnGrp->checkedId();
if ( mDirectSymbBtnGrp )
{
lyr.placeDirectionSymbol = ( QgsPalLayerSettings::DirectionSymbols )mDirectSymbBtnGrp->checkedId();
}
if ( mUpsidedownBtnGrp )
{
lyr.upsidedownLabels = ( QgsPalLayerSettings::UpsideDownLabels )mUpsidedownBtnGrp->checkedId();
}
lyr.maxCurvedCharAngleIn = mMaxCharAngleInDSpinBox->value();
// lyr.maxCurvedCharAngleOut must be negative, but it is shown as positive spinbox in GUI
@ -1590,78 +1609,12 @@ void QgsLabelingGui::updatePreview()
return;
}
QgsTextFormat format = layerSettings().format();
scrollPreview();
lblFontPreview->setFont( mRefFont );
QFont previewFont = lblFontPreview->font();
double fontSize = mFontSizeSpinBox->value();
double previewRatio = mPreviewSize / fontSize;
double bufferSize = 0.0;
lblFontPreview->setFormat( format );
QString grpboxtitle;
QString sampleTxt = tr( "Text/Buffer sample" );
if ( mFontSizeUnitWidget->getUnit() == 1 ) // map units
{
// TODO: maybe match current map zoom level instead?
previewFont.setPointSize( mPreviewSize );
mPreviewSizeSlider->setEnabled( true );
grpboxtitle = sampleTxt + tr( " @ %1 pts (using map units)" ).arg( mPreviewSize );
previewFont.setWordSpacing( previewRatio * mFontWordSpacingSpinBox->value() );
previewFont.setLetterSpacing( QFont::AbsoluteSpacing, previewRatio * mFontLetterSpacingSpinBox->value() );
if ( mBufferDrawChkBx->isChecked() )
{
if ( mBufferUnitWidget->unit() == QgsUnitTypes::RenderMapUnits )
{
bufferSize = previewRatio * spinBufferSize->value() / 3.527;
}
else // millimeters
{
grpboxtitle = sampleTxt + tr( " @ %1 pts (using map units, BUFFER IN MILLIMETERS)" ).arg( mPreviewSize );
bufferSize = spinBufferSize->value();
}
}
}
else // in points
{
if ( fontSize > 0 )
previewFont.setPointSize( fontSize );
mPreviewSizeSlider->setEnabled( false );
grpboxtitle = sampleTxt;
if ( mBufferDrawChkBx->isChecked() )
{
if ( mBufferUnitWidget->unit() == QgsUnitTypes::RenderMillimeters )
{
bufferSize = spinBufferSize->value();
}
else // map units
{
grpboxtitle = sampleTxt + tr( " (BUFFER NOT SHOWN, in map units)" );
}
}
}
lblFontPreview->setFont( previewFont );
groupBox_mPreview->setTitle( grpboxtitle );
QColor prevColor = btnTextColor->color();
prevColor.setAlphaF(( 100.0 - ( double )( mFontTranspSpinBox->value() ) ) / 100.0 );
lblFontPreview->setTextColor( prevColor );
bool bufferNoFill = false;
if ( mBufferDrawChkBx->isChecked() && bufferSize != 0.0 )
{
QColor buffColor = btnBufferColor->color();
buffColor.setAlphaF(( 100.0 - ( double )( mBufferTranspSpinBox->value() ) ) / 100.0 );
bufferNoFill = !mBufferTranspFillChbx->isChecked();
lblFontPreview->setBuffer( bufferSize, buffColor, mBufferJoinStyleComboBox->penJoinStyle(), bufferNoFill );
}
else
{
lblFontPreview->setBuffer( 0, Qt::white, Qt::BevelJoin, bufferNoFill );
}
}
void QgsLabelingGui::scrollPreview()
@ -1813,12 +1766,6 @@ void QgsLabelingGui::populateFontStyleComboBox()
mFontStyleComboBox->setCurrentIndex( curIndx );
}
void QgsLabelingGui::on_mPreviewSizeSlider_valueChanged( int i )
{
mPreviewSize = i;
updatePreview();
}
void QgsLabelingGui::on_mFontSizeSpinBox_valueChanged( double d )
{
mRefFont.setPointSizeF( d );
@ -2013,6 +1960,11 @@ void QgsLabelingGui::onSubstitutionsChanged( const QgsStringReplacementCollectio
emit widgetChanged();
}
void QgsLabelingGui::previewScaleChanged( double scale )
{
lblFontPreview->setScale( scale );
}
void QgsLabelingGui::updateSvgWidgets( const QString& svgPath )
{
if ( mShapeSVGPathLineEdit->text() != svgPath )

View File

@ -22,6 +22,7 @@
#include <QFontDatabase>
#include <ui_qgslabelingguibase.h>
#include "qgsstringutils.h"
#include "qgspallabeling.h"
class QgsVectorLayer;
class QgsMapCanvas;
@ -67,7 +68,6 @@ class APP_EXPORT QgsLabelingGui : public QWidget, private Ui::QgsLabelingGuiBase
void updatePlacementWidgets();
void updateSvgWidgets( const QString& svgPath );
void on_mPreviewSizeSlider_valueChanged( int i );
void on_mFontSizeSpinBox_valueChanged( double d );
void on_mFontCapitalsComboBox_currentIndexChanged( int index );
void on_mFontFamilyCmbBx_currentFontChanged( const QFont& f );
@ -150,6 +150,7 @@ class APP_EXPORT QgsLabelingGui : public QWidget, private Ui::QgsLabelingGuiBase
void on_mShapeSVGPathLineEdit_textChanged( const QString& text );
void updateLinePlacementOptions();
void onSubstitutionsChanged( const QgsStringReplacementCollection& substitutions );
void previewScaleChanged( double scale );
};
#endif

View File

@ -308,6 +308,7 @@ SET(QGIS_GUI_SRCS
qgstabwidget.cpp
qgstablewidgetitem.cpp
qgstextannotationitem.cpp
qgstextpreview.cpp
qgstrackedvectorlayertools.cpp
qgstreewidgetitem.cpp
qgsunitselectionwidget.cpp
@ -461,6 +462,7 @@ SET(QGIS_GUI_MOC_HDRS
qgssublayersdialog.h
qgstablewidgetbase.h
qgstabwidget.h
qgstextpreview.h
qgstreewidgetitem.h
qgsunitselectionwidget.h
qgsuserinputdockwidget.h

View File

@ -0,0 +1,97 @@
/***************************************************************************
qgstextpreview.cpp
------------------
begin : October 2016
copyright : (C) 2016 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgstextpreview.h"
#include <QDesktopWidget>
#include <QPainter>
QgsTextPreview::QgsTextPreview( QWidget* parent )
: QLabel( parent )
, mScale( -1 )
, mMapUnits( QgsUnitTypes::DistanceMeters )
{
// initially use a basic transform with no scale
QgsMapToPixel newCoordXForm;
newCoordXForm.setParameters( 1, 0, 0, 0, 0, 0 );
mContext.setMapToPixel( newCoordXForm );
mContext.setScaleFactor( QgsApplication::desktop()->logicalDpiX() / 25.4 );
mContext.setUseAdvancedEffects( true );
}
void QgsTextPreview::paintEvent( QPaintEvent *e )
{
Q_UNUSED( e );
QPainter p( this );
p.setRenderHint( QPainter::Antialiasing );
// slightly inset text
double xtrans = 0;
if ( mFormat.buffer().enabled() )
xtrans = QgsTextRenderer::scaleToPixelContext( mFormat.buffer().size(), mContext, mFormat.buffer().sizeUnit(), false, mFormat.buffer().sizeMapUnitScale() );
if ( mFormat.background().enabled() && mFormat.background().sizeType() != QgsTextBackgroundSettings::SizeFixed )
xtrans = qMax( xtrans, QgsTextRenderer::scaleToPixelContext( mFormat.background().size().width(), mContext, mFormat.background().sizeUnit(), false, mFormat.background().sizeMapUnitScale() ) );
xtrans += 4;
double ytrans = 0.0;
if ( mFormat.buffer().enabled() )
ytrans = qMax( ytrans, QgsTextRenderer::scaleToPixelContext( mFormat.buffer().size(), mContext, mFormat.buffer().sizeUnit(), false, mFormat.buffer().sizeMapUnitScale() ) );
if ( mFormat.background().enabled() )
ytrans = qMax( ytrans, QgsTextRenderer::scaleToPixelContext( mFormat.background().size().height(), mContext, mFormat.background().sizeUnit(), false, mFormat.background().sizeMapUnitScale() ) );
ytrans += 4;
QRectF textRect = rect();
textRect.setLeft( xtrans );
textRect.setWidth( textRect.width() - xtrans );
textRect.setTop( ytrans );
if ( textRect.height() > 300 )
textRect.setHeight( 300 );
if ( textRect.width() > 2000 )
textRect.setWidth( 2000 );
mContext.setPainter( &p );
QgsTextRenderer::drawText( textRect, 0 , QgsTextRenderer::AlignLeft, QStringList() << text(),
mContext, mFormat );
}
void QgsTextPreview::setFormat( const QgsTextFormat& format )
{
mFormat = format;
update();
}
void QgsTextPreview::updateContext()
{
if ( mScale >= 0 )
{
QgsMapToPixel newCoordXForm = QgsMapToPixel::fromScale( mScale, mMapUnits, QgsApplication::desktop()->logicalDpiX() );
mContext.setMapToPixel( newCoordXForm );
}
update();
}
void QgsTextPreview::setScale( double scale )
{
mScale = scale;
updateContext();
}
void QgsTextPreview::setMapUnits( QgsUnitTypes::DistanceUnit unit )
{
mMapUnits = unit;
updateContext();
}

98
src/gui/qgstextpreview.h Normal file
View File

@ -0,0 +1,98 @@
/***************************************************************************
qgstextpreview.h
----------------
begin : October 2016
copyright : (C) 2016 by Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSTEXTPREVIEW_H
#define QGSTEXTPREVIEW_H
#include "qgstextrenderer.h"
#include <QLabel>
/** \class QgsTextPreview
* \ingroup gui
* A widget for previewing text formatting settings.
*
* QgsTextPreview provides a widget for previewing the appearance of text rendered
* using QgsTextRenderer. The preview includes all settings contained within
* a QgsTextFormat, including shadow, background and buffer.
*
* In order to preview the exact appearance of text which uses sizes in map units,
* the scale and map units must be set by calling setScale() and setMapUnits().
*
* @note Added in QGIS 3.0
*/
class GUI_EXPORT QgsTextPreview : public QLabel
{
Q_OBJECT
Q_PROPERTY( QgsTextFormat format READ format WRITE setFormat )
Q_PROPERTY( double scale READ scale WRITE setScale )
Q_PROPERTY( QgsUnitTypes::DistanceUnit mapUnits READ mapUnits WRITE setMapUnits )
public:
/** Constructor for QgsTextPreview
* @param parent parent widget
*/
QgsTextPreview( QWidget* parent = nullptr );
void paintEvent( QPaintEvent* e ) override;
/** Sets the text format for previewing in the widget.
* @param format text format
* @see format()
*/
void setFormat( const QgsTextFormat& format );
/** Returns the text format used for previewing text in the widget.
* @see setFormat()
*/
QgsTextFormat format() const { return mFormat; }
/** Sets the scale to use for previewing format sizes in map units.
* @param scale preview map scale
* @see scale()
* @see setMapUnits()
*/
void setScale( double scale );
/** Returns the scale used for previewing format sizes in map units.
* @see setScale()
* @see mapUnits()
*/
double scale() const { return mScale; }
/** Sets the map unit type for previewing format sizes in map units.
* @param unit map units
* @see mapUnits()
* @see setScale()
*/
void setMapUnits( QgsUnitTypes::DistanceUnit unit );
/** Returns the map unit type used for previewing format sizes in map units.
* @see setMapUnits()
* @see scale()
*/
QgsUnitTypes::DistanceUnit mapUnits() const { return mMapUnits; }
private:
QgsTextFormat mFormat;
QgsRenderContext mContext;
double mScale;
QgsUnitTypes::DistanceUnit mMapUnits;
void updateContext();
};
#endif // QGSTEXTPREVIEW_H

View File

@ -78,7 +78,7 @@
</size>
</property>
<property name="title">
<string>Text/Buffer Sample</string>
<string>Text Sample</string>
</property>
<property name="flat">
<bool>true</bool>
@ -112,7 +112,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>486</width>
<width>482</width>
<height>300</height>
</rect>
</property>
@ -139,7 +139,7 @@
<number>0</number>
</property>
<item>
<widget class="QgsLabelPreview" name="lblFontPreview">
<widget class="QgsTextPreview" name="lblFontPreview">
<property name="enabled">
<bool>true</bool>
</property>
@ -243,39 +243,12 @@
</spacer>
</item>
<item>
<widget class="QSlider" name="mPreviewSizeSlider">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>200</width>
<height>0</height>
</size>
<widget class="QgsScaleWidget" name="mPreviewScaleComboBox" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Size for sample text in map units</string>
</property>
<property name="minimum">
<number>8</number>
</property>
<property name="maximum">
<number>320</number>
</property>
<property name="singleStep">
<number>4</number>
</property>
<property name="value">
<number>24</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickInterval">
<number>4</number>
<string>Preview text at specific map scale</string>
</property>
</widget>
</item>
@ -618,7 +591,7 @@
<item>
<widget class="QStackedWidget" name="mLabelStackedWidget">
<property name="currentIndex">
<number>5</number>
<number>0</number>
</property>
<widget class="QWidget" name="mLabelPage_Text">
<layout class="QVBoxLayout" name="verticalLayout_6">
@ -647,8 +620,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>452</width>
<height>387</height>
<width>448</width>
<height>442</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
@ -691,88 +664,31 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item row="3" column="2">
<widget class="QgsDataDefinedButton" name="mFontStyleDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="mFontStyleLabel">
<item row="3" column="1">
<widget class="QComboBox" name="mFontStyleComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Style</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QgsUnitSelectionWidget" name="mFontSizeUnitWidget" native="true"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="mFontLabel_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Text</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="mFontTranspLabel">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Transparency</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QgsColorButton" name="btnTextColor">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>120</width>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>120</width>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="labelBlendMode">
<property name="text">
<string>Blend mode</string>
<property name="toolTip">
<string>Available typeface styles</string>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QgsDataDefinedButton" name="mFontColorDDBtn">
<property name="text">
<string>...</string>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContentsOnFirstShow</enum>
</property>
</widget>
</item>
@ -828,16 +744,166 @@
</item>
</layout>
</item>
<item row="12" column="1">
<widget class="QgsBlendModeComboBox" name="comboBlendMode"/>
<item row="0" column="0">
<widget class="QLabel" name="mFontLabel_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Text</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="9" column="2">
<widget class="QgsDataDefinedButton" name="mFontCaseDDBtn">
<item row="7" column="0">
<widget class="QLabel" name="mFontColorLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Color</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QgsDataDefinedButton" name="mFontColorDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_15">
<item>
<widget class="QLabel" name="mFontWordSpacingLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>word</string>
</property>
</widget>
</item>
<item>
<widget class="QgsDoubleSpinBox" name="mFontWordSpacingSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Space in pixels or map units, relative to size unit choice</string>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>-1000.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="showClearButton" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mFontWordSpacingDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="5" column="0">
<widget class="QLabel" name="mFontSizeLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Size</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QgsDataDefinedButton" name="mFontSizeDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QgsDataDefinedButton" name="mFontUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="12" column="2">
<widget class="QgsDataDefinedButton" name="mFontBlendModeDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QgsUnitSelectionWidget" name="mFontSizeUnitWidget" native="true"/>
</item>
<item row="5" column="1">
<widget class="QgsDoubleSpinBox" name="mFontSizeSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Spacing</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="mFontLabel">
<property name="sizePolicy">
@ -854,20 +920,66 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="mFontStyleComboBox">
<item row="8" column="2">
<widget class="QgsDataDefinedButton" name="mFontTranspDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QgsColorButton" name="btnTextColor">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<width>120</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>120</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="12" column="1">
<widget class="QgsBlendModeComboBox" name="comboBlendMode"/>
</item>
<item row="13" column="0" colspan="2">
<widget class="QCheckBox" name="mCheckBoxSubstituteText">
<property name="toolTip">
<string>If enabled, the label text will automatically be modified using a preset list of substitutes</string>
</property>
<property name="text">
<string>Apply label text substitutes</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QFontComboBox" name="mFontFamilyCmbBx">
<property name="editable">
<bool>false</bool>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QComboBox" name="mFontCapitalsComboBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
@ -875,43 +987,7 @@
</size>
</property>
<property name="toolTip">
<string>Available typeface styles</string>
</property>
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContentsOnFirstShow</enum>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="mFontCapitalsLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Type case</string>
</property>
</widget>
</item>
<item row="12" column="2">
<widget class="QgsDataDefinedButton" name="mFontBlendModeDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="mFontSizeLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Size</string>
<string>Capitalization style of text</string>
</property>
</widget>
</item>
@ -983,85 +1059,18 @@
</layout>
</widget>
</item>
<item row="2" column="1">
<widget class="QFrame" name="mFontFamilyFrame">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="mFontMissingLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">color: #990000;
font-style: italic;</string>
</property>
<property name="text">
<string>Font is missing.</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="5" column="1">
<widget class="QgsDoubleSpinBox" name="mFontSizeSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<item row="8" column="0">
<widget class="QLabel" name="mFontTranspLabel">
<property name="enabled">
<bool>true</bool>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Spacing</string>
<string>Transparency</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QgsDataDefinedButton" name="mFontUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mFontDDBtn">
<item row="3" column="2">
<widget class="QgsDataDefinedButton" name="mFontStyleDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1249,96 +1258,67 @@ font-style: italic;</string>
</item>
</layout>
</item>
<item row="8" column="2">
<widget class="QgsDataDefinedButton" name="mFontTranspDDBtn">
<item row="9" column="2">
<widget class="QgsDataDefinedButton" name="mFontCaseDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_15">
<item>
<widget class="QLabel" name="mFontWordSpacingLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>word</string>
</property>
</widget>
</item>
<item>
<widget class="QgsDoubleSpinBox" name="mFontWordSpacingSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Space in pixels or map units, relative to size unit choice</string>
</property>
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>-1000.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="showClearButton" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mFontWordSpacingDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="1">
<widget class="QFontComboBox" name="mFontFamilyCmbBx">
<property name="editable">
<bool>false</bool>
<item row="12" column="0">
<widget class="QLabel" name="labelBlendMode">
<property name="text">
<string>Blend mode</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QComboBox" name="mFontCapitalsComboBox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>Capitalization style of text</string>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mFontDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="mFontColorLabel">
<item row="2" column="1">
<widget class="QFrame" name="mFontFamilyFrame">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="mFontMissingLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">color: #990000;
font-style: italic;</string>
</property>
<property name="text">
<string>Font is missing.</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="mFontCapitalsLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
@ -1346,27 +1326,20 @@ font-style: italic;</string>
</sizepolicy>
</property>
<property name="text">
<string>Color</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<string>Type case</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QgsDataDefinedButton" name="mFontSizeDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="13" column="0" colspan="2">
<widget class="QCheckBox" name="mCheckBoxSubstituteText">
<property name="toolTip">
<string>If enabled, the label text will automatically be modified using a preset list of substitutes</string>
<item row="3" column="0">
<widget class="QLabel" name="mFontStyleLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Apply label text substitutes</string>
<string>Style</string>
</property>
</widget>
</item>
@ -1439,8 +1412,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>342</width>
<height>338</height>
<width>383</width>
<height>389</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_14">
@ -2074,8 +2047,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>285</width>
<height>245</height>
<width>301</width>
<height>280</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
@ -2456,8 +2429,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>431</width>
<height>628</height>
<width>454</width>
<height>720</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_21">
@ -3276,8 +3249,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>305</width>
<height>398</height>
<width>330</width>
<height>447</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_22">
@ -3773,8 +3746,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>452</width>
<height>839</height>
<width>430</width>
<height>917</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
@ -5399,8 +5372,8 @@ font-style: italic;</string>
<rect>
<x>0</x>
<y>0</y>
<width>452</width>
<height>731</height>
<width>429</width>
<height>799</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
@ -6430,16 +6403,20 @@ font-style: italic;</string>
<header>qgspenstylecombobox.h</header>
</customwidget>
<customwidget>
<class>QgsLabelPreview</class>
<class>QgsTextPreview</class>
<extends>QLabel</extends>
<header>qgslabelpreview.h</header>
<header>qgstextpreview.h</header>
</customwidget>
<customwidget>
<class>QgsScaleWidget</class>
<extends>QWidget</extends>
<header>qgsscalewidget.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>scrollArea_mPreview</tabstop>
<tabstop>mPreviewTextEdit</tabstop>
<tabstop>mPreviewTextBtn</tabstop>
<tabstop>mPreviewSizeSlider</tabstop>
<tabstop>mPreviewBackgroundBtn</tabstop>
<tabstop>mLabelingOptionsListWidget</tabstop>
<tabstop>scrollArea</tabstop>