45#include <QButtonGroup>
50 , mMapCanvas( mapCanvas )
54 setWidgetMode(
Text );
61 , mMapCanvas( mapCanvas )
68 setWidgetMode( mode );
71void QgsTextFormatWidget::initWidget()
75 mGeometryGeneratorGroupBox->setCollapsed(
true );
77 connect( mShapeSVGPathLineEdit, &QLineEdit::textChanged,
this, &QgsTextFormatWidget::mShapeSVGPathLineEdit_textChanged );
78 connect( mFontSizeSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsTextFormatWidget::mFontSizeSpinBox_valueChanged );
79 connect( mFontFamilyCmbBx, &QFontComboBox::currentFontChanged,
this, &QgsTextFormatWidget::mFontFamilyCmbBx_currentFontChanged );
80 connect( mFontStyleComboBox, &QComboBox::currentTextChanged,
this, &QgsTextFormatWidget::mFontStyleComboBox_currentIndexChanged );
81 connect( mFontUnderlineBtn, &QToolButton::toggled,
this, &QgsTextFormatWidget::mFontUnderlineBtn_toggled );
82 connect( mFontStrikethroughBtn, &QToolButton::toggled,
this, &QgsTextFormatWidget::mFontStrikethroughBtn_toggled );
83 connect( mFontWordSpacingSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsTextFormatWidget::mFontWordSpacingSpinBox_valueChanged );
84 connect( mFontLetterSpacingSpinBox,
static_cast < void ( QDoubleSpinBox::* )(
double )
> ( &QDoubleSpinBox::valueChanged ),
this, &QgsTextFormatWidget::mFontLetterSpacingSpinBox_valueChanged );
86 connect( mFontMinPixelSpinBox,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ),
this, &QgsTextFormatWidget::mFontMinPixelSpinBox_valueChanged );
87 connect( mFontMaxPixelSpinBox,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ),
this, &QgsTextFormatWidget::mFontMaxPixelSpinBox_valueChanged );
96 connect( mShapeTypeCmbBx,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsTextFormatWidget::mShapeTypeCmbBx_currentIndexChanged );
97 connect( mShapeRotationCmbBx,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsTextFormatWidget::mShapeRotationCmbBx_currentIndexChanged );
98 connect( mShapeSVGParamsBtn, &QPushButton::clicked,
this, &QgsTextFormatWidget::mShapeSVGParamsBtn_clicked );
99 connect( mShapeSVGSelectorBtn, &QPushButton::clicked,
this, &QgsTextFormatWidget::mShapeSVGSelectorBtn_clicked );
100 connect( mPreviewTextEdit, &QLineEdit::textChanged,
this, &QgsTextFormatWidget::mPreviewTextEdit_textChanged );
101 connect( mPreviewTextBtn, &QToolButton::clicked,
this, &QgsTextFormatWidget::mPreviewTextBtn_clicked );
103 connect( mDirectSymbLeftToolBtn, &QToolButton::clicked,
this, &QgsTextFormatWidget::mDirectSymbLeftToolBtn_clicked );
104 connect( mDirectSymbRightToolBtn, &QToolButton::clicked,
this, &QgsTextFormatWidget::mDirectSymbRightToolBtn_clicked );
105 connect( chkLineOrientationDependent, &QCheckBox::toggled,
this, &QgsTextFormatWidget::chkLineOrientationDependent_toggled );
106 connect( mToolButtonConfigureSubstitutes, &QToolButton::clicked,
this, &QgsTextFormatWidget::mToolButtonConfigureSubstitutes_clicked );
107 connect( mKerningCheckBox, &QCheckBox::toggled,
this, &QgsTextFormatWidget::kerningToggled );
108 connect( mComboOverlapHandling, qOverload< int >( &QComboBox::currentIndexChanged ),
this, &QgsTextFormatWidget::overlapModeChanged );
118 mPreviewTextBtn->setIconSize( QSize( iconSize16, iconSize16 ) );
119 mPointOffsetAboveLeft->setIconSize( QSize( iconSize32, iconSize18 ) );
120 mPointOffsetAbove->setIconSize( QSize( iconSize32, iconSize18 ) );
121 mPointOffsetAboveRight->setIconSize( QSize( iconSize32, iconSize18 ) );
122 mPointOffsetLeft->setIconSize( QSize( iconSize32, iconSize18 ) );
123 mPointOffsetOver ->setIconSize( QSize( iconSize32, iconSize18 ) );
124 mPointOffsetRight->setIconSize( QSize( iconSize32, iconSize18 ) );
125 mPointOffsetBelowLeft->setIconSize( QSize( iconSize32, iconSize18 ) );
126 mPointOffsetBelow->setIconSize( QSize( iconSize32, iconSize18 ) );
127 mPointOffsetBelowRight->setIconSize( QSize( iconSize32, iconSize18 ) );
128 mLabelMinScale->setPixmap(
QgsApplication::getThemeIcon( QStringLiteral(
"/mActionZoomOut.svg" ) ).pixmap( QSize( iconSize24, iconSize24 ) ) );
129 mLabelMaxScale->setPixmap(
QgsApplication::getThemeIcon( QStringLiteral(
"/mActionZoomIn.svg" ) ).pixmap( QSize( iconSize24, iconSize24 ) ) );
132 mFontUnderlineBtn->setMinimumSize( buttonSize, buttonSize );
133 mFontUnderlineBtn->setMaximumSize( buttonSize, buttonSize );
134 mFontStrikethroughBtn->setMinimumSize( buttonSize, buttonSize );
135 mFontStrikethroughBtn->setMaximumSize( buttonSize, buttonSize );
136 mFontBoldBtn->setMinimumSize( buttonSize, buttonSize );
137 mFontBoldBtn->setMaximumSize( buttonSize, buttonSize );
138 mFontItalicBtn->setMinimumSize( buttonSize, buttonSize );
139 mFontItalicBtn->setMaximumSize( buttonSize, buttonSize );
141 mPreviewScaleComboBox->setMapCanvas(
mMapCanvas );
142 mPreviewScaleComboBox->setShowCurrentScaleButton(
true );
145 const auto unitWidgets = findChildren<QgsUnitSelectionWidget *>();
150 mFontSizeUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Points << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits
151 << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::Pixels << Qgis::RenderUnit::Inches );
152 mBufferUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
153 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches << Qgis::RenderUnit::Percentage );
154 mMaskBufferUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
155 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches << Qgis::RenderUnit::Percentage );
156 mShapeSizeUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
157 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
158 mShapeOffsetUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
159 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
160 mShapeRadiusUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits
161 << Qgis::RenderUnit::Pixels << Qgis::RenderUnit::Percentage
162 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
163 mShapeStrokeWidthUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
164 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
165 mShadowOffsetUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
166 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches << Qgis::RenderUnit::Percentage );
167 mShadowRadiusUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
168 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches << Qgis::RenderUnit::Percentage );
169 mPointOffsetUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
170 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
171 mLineDistanceUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
172 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
173 mRepeatDistanceUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
174 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
175 mOverrunDistanceUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::MetersInMapUnits << Qgis::RenderUnit::MapUnits << Qgis::RenderUnit::Pixels
176 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
177 mLineHeightUnitWidget->setUnits(
QgsUnitTypes::RenderUnitList() << Qgis::RenderUnit::Percentage << Qgis::RenderUnit::Millimeters << Qgis::RenderUnit::Pixels
178 << Qgis::RenderUnit::Points << Qgis::RenderUnit::Inches );
179 mFontLineHeightSpinBox->setClearValue( 100.0 );
180 mShapeRotationDblSpnBx->setClearValue( 0.0 );
181 mShapeOffsetXSpnBx->setClearValue( 0.0 );
182 mShapeOffsetYSpnBx->setClearValue( 0.0 );
183 mPointOffsetXSpinBox->setClearValue( 0.0 );
184 mPointOffsetYSpinBox->setClearValue( 0.0 );
185 mPointAngleSpinBox->setClearValue( 0.0 );
186 mFontLetterSpacingSpinBox->setClearValue( 0.0 );
187 mFontWordSpacingSpinBox->setClearValue( 0.0 );
188 mZIndexSpinBox->setClearValue( 0.0 );
189 mLineDistanceSpnBx->setClearValue( 0.0 );
190 mSpinStretch->setClearValue( 100 );
194 if ( mLineHeightUnitWidget->unit() == Qgis::RenderUnit::Percentage )
195 mFontLineHeightSpinBox->setClearValue( 100.0 );
197 mFontLineHeightSpinBox->setClearValue( 10.0 );
214 updateAvailableShadowPositions();
217 mBackgroundMarkerSymbolButton->setDialogTitle( tr(
"Background Symbol" ) );
218 mBackgroundMarkerSymbolButton->registerExpressionContextGenerator(
this );
219 mBackgroundMarkerSymbolButton->setMapCanvas(
mMapCanvas );
221 mBackgroundFillSymbolButton->setDialogTitle( tr(
"Background Symbol" ) );
222 mBackgroundFillSymbolButton->registerExpressionContextGenerator(
this );
223 mBackgroundFillSymbolButton->setMapCanvas(
mMapCanvas );
227 mRefFont = lblFontPreview->font();
230 connect( mShadowOffsetAngleDial, &QAbstractSlider::valueChanged, mShadowOffsetAngleSpnBx, &QSpinBox::setValue );
231 connect( mShadowOffsetAngleSpnBx,
static_cast < void ( QSpinBox::* )(
int )
> ( &QSpinBox::valueChanged ), mShadowOffsetAngleDial, &QAbstractSlider::setValue );
232 connect( mLimitLabelChkBox, &QAbstractButton::toggled, mLimitLabelSpinBox, &QWidget::setEnabled );
233 connect( mCheckBoxSubstituteText, &QAbstractButton::toggled, mToolButtonConfigureSubstitutes, &QWidget::setEnabled );
240 mTextOrientationComboBox->addItem( tr(
"Horizontal" ),
static_cast< int >( Qgis::TextOrientation::Horizontal ) );
241 mTextOrientationComboBox->addItem( tr(
"Vertical" ),
static_cast< int >( Qgis::TextOrientation::Vertical ) );
243 populateFontCapitalsComboBox();
246 mPreviewBackgroundBtn->setColorDialogTitle( tr(
"Select Fill Color" ) );
247 mPreviewBackgroundBtn->setContext( QStringLiteral(
"labeling" ) );
248 mPreviewBackgroundBtn->setColor( QColor( 255, 255, 255 ) );
249 btnTextColor->setColorDialogTitle( tr(
"Select Text Color" ) );
250 btnTextColor->setContext( QStringLiteral(
"labeling" ) );
251 btnTextColor->setDefaultColor( Qt::black );
252 btnBufferColor->setColorDialogTitle( tr(
"Select Buffer Color" ) );
253 btnBufferColor->setContext( QStringLiteral(
"labeling" ) );
254 btnBufferColor->setDefaultColor( Qt::white );
255 mShapeStrokeColorBtn->setColorDialogTitle( tr(
"Select Stroke Color" ) );
256 mShapeStrokeColorBtn->setContext( QStringLiteral(
"labeling" ) );
257 mShapeFillColorBtn->setColorDialogTitle( tr(
"Select Fill Color" ) );
258 mShapeFillColorBtn->setContext( QStringLiteral(
"labeling" ) );
259 mShadowColorBtn->setColorDialogTitle( tr(
"Select Shadow Color" ) );
260 mShadowColorBtn->setContext( QStringLiteral(
"labeling" ) );
261 mShadowColorBtn->setDefaultColor( Qt::black );
263 mFontColorDDBtn->registerLinkedWidget( btnTextColor );
264 mBufferColorDDBtn->registerLinkedWidget( btnBufferColor );
265 mShapeStrokeColorDDBtn->registerLinkedWidget( mShapeStrokeColorBtn );
266 mShapeFillColorDDBtn->registerLinkedWidget( mShapeFillColorBtn );
267 mShadowColorDDBtn->registerLinkedWidget( mShadowColorBtn );
271 mQuadrantBtnGrp->addButton( mPointOffsetAboveLeft,
static_cast<int>( Qgis::LabelQuadrantPosition::AboveLeft ) );
272 mQuadrantBtnGrp->addButton( mPointOffsetAbove,
static_cast<int>( Qgis::LabelQuadrantPosition::Above ) );
273 mQuadrantBtnGrp->addButton( mPointOffsetAboveRight,
static_cast<int>( Qgis::LabelQuadrantPosition::AboveRight ) );
274 mQuadrantBtnGrp->addButton( mPointOffsetLeft,
static_cast<int>( Qgis::LabelQuadrantPosition::Left ) );
275 mQuadrantBtnGrp->addButton( mPointOffsetOver,
static_cast<int>( Qgis::LabelQuadrantPosition::Over ) );
276 mQuadrantBtnGrp->addButton( mPointOffsetRight,
static_cast<int>( Qgis::LabelQuadrantPosition::Right ) );
277 mQuadrantBtnGrp->addButton( mPointOffsetBelowLeft,
static_cast<int>( Qgis::LabelQuadrantPosition::BelowLeft ) );
278 mQuadrantBtnGrp->addButton( mPointOffsetBelow,
static_cast<int>( Qgis::LabelQuadrantPosition::Below ) );
279 mQuadrantBtnGrp->addButton( mPointOffsetBelowRight,
static_cast<int>( Qgis::LabelQuadrantPosition::BelowRight ) );
291 mUpsidedownBtnGrp->addButton( mUpsidedownRadioOff,
static_cast<int>( Qgis::UpsideDownLabelHandling::FlipUpsideDownLabels ) );
292 mUpsidedownBtnGrp->addButton( mUpsidedownRadioDefined,
static_cast<int>( Qgis::UpsideDownLabelHandling::AllowUpsideDownWhenRotationIsDefined ) );
293 mUpsidedownBtnGrp->addButton( mUpsidedownRadioAll,
static_cast<int>( Qgis::UpsideDownLabelHandling::AlwaysAllowUpsideDown ) );
308 const auto groupBoxes = findChildren<QgsCollapsibleGroupBox *>();
311 grpbox->setSettingGroup( QStringLiteral(
"mAdvLabelingDlg" ) );
317 mLabelingOptionsListWidget->setAttribute( Qt::WA_MacShowFocusRect,
false );
322 QSizePolicy policy( mLabelingOptionsListFrame->sizePolicy() );
323 policy.setHorizontalStretch( 0 );
324 mLabelingOptionsListFrame->setSizePolicy( policy );
325 if ( !settings.
contains( QStringLiteral(
"/Windows/Labeling/OptionsSplitState" ) ) )
328 QList<int> splitsizes;
330 mLabelingOptionsSplitter->setSizes( splitsizes );
334 connect( mLabelStackedWidget, &QStackedWidget::currentChanged,
this, &QgsTextFormatWidget::optionsStackedWidget_CurrentChanged );
337 mFontPreviewSplitter->restoreState( settings.
value( QStringLiteral(
"Windows/Labeling/FontPreviewSplitState" ) ).toByteArray() );
338 mLabelingOptionsSplitter->restoreState( settings.
value( QStringLiteral(
"Windows/Labeling/OptionsSplitState" ) ).toByteArray() );
340 mLabelingOptionsListWidget->setCurrentRow( settings.
value( QStringLiteral(
"Windows/Labeling/Tab" ), 0 ).toInt() );
344 mBufferEffectWidget->setPaintEffect( mBufferEffect.get() );
348 mMaskEffectWidget->setPaintEffect( mMaskEffect.get() );
352 mBackgroundEffectWidget->setPaintEffect( mBackgroundEffect.get() );
354 overlapModeChanged();
356#ifndef HAS_KDE_QT5_FONT_STRETCH_FIX
357 mLabelStretch->hide();
358 mSpinStretch->hide();
359 mFontStretchDDBtn->hide();
364 QList<QWidget *> widgets;
365 widgets << btnBufferColor
367 << chkLabelPerFeaturePart
371 << chkLineOrientationDependent
373 << chkPreserveRotation
375 << comboBufferBlendMode
377 << mBufferJoinStyleComboBox
378 << mBufferTranspFillChbx
379 << mBufferOpacityWidget
380 << mCentroidInsideCheckBox
382 << mCoordRotationUnitComboBox
384 << mDirectSymbLeftLineEdit
385 << mDirectSymbRevChkBx
386 << mDirectSymbRightLineEdit
387 << mFitInsidePolygonCheckBox
388 << mFontCapitalsComboBox
389 << mFontLetterSpacingSpinBox
390 << mFontLimitPixelChkBox
391 << mFontLineHeightSpinBox
392 << mLineHeightUnitWidget
393 << mFontMaxPixelSpinBox
394 << mFontMinPixelSpinBox
395 << mFontMultiLineAlignComboBox
397 << mFontStyleComboBox
398 << mTextOrientationComboBox
399 << mTextOpacityWidget
401 << mFontWordSpacingSpinBox
403 << mFormatNumDecimalsSpnBx
404 << mFormatNumPlusSignChkBx
406 << mLimitLabelSpinBox
407 << mLineDistanceSpnBx
408 << mLineDistanceUnitWidget
409 << mMaxCharAngleInDSpinBox
410 << mMaxCharAngleOutDSpinBox
412 << mOffsetTypeComboBox
413 << mCheckAllowDegradedPlacement
414 << mComboOverlapHandling
415 << mPointAngleSpinBox
416 << mPointOffsetUnitWidget
417 << mPointOffsetXSpinBox
418 << mPointOffsetYSpinBox
419 << mPreviewBackgroundBtn
422 << mRepeatDistanceSpinBox
423 << mRepeatDistanceUnitWidget
424 << mOverrunDistanceSpinBox
425 << mOverrunDistanceUnitWidget
426 << mScaleBasedVisibilityChkBx
432 << mShadowOffsetAngleSpnBx
433 << mShadowOffsetGlobalChkBx
434 << mShadowOffsetSpnBx
435 << mShadowOffsetUnitWidget
436 << mShadowRadiusAlphaChkBx
437 << mShadowRadiusDblSpnBx
438 << mShadowRadiusUnitWidget
440 << mShadowOpacityWidget
443 << mShapeStrokeColorBtn
444 << mShapeStrokeWidthSpnBx
445 << mShapeStrokeWidthUnitWidget
447 << mShapeFillColorBtn
448 << mShapeOffsetXSpnBx
449 << mShapeOffsetYSpnBx
450 << mShapeOffsetUnitWidget
451 << mShapeRadiusXDbSpnBx
452 << mShapeRadiusYDbSpnBx
453 << mShapeRotationCmbBx
454 << mShapeRotationDblSpnBx
455 << mShapeRadiusUnitWidget
456 << mShapeSVGPathLineEdit
458 << mShapeSizeUnitWidget
461 << mBackgroundOpacityWidget
466 << mAutoWrapLengthSpinBox
467 << mAutoWrapTypeComboBox
468 << mCentroidRadioVisible
469 << mCentroidRadioWhole
470 << mDirectSymbRadioBtnAbove
471 << mDirectSymbRadioBtnBelow
472 << mDirectSymbRadioBtnLR
473 << mUpsidedownRadioAll
474 << mUpsidedownRadioDefined
475 << mUpsidedownRadioOff
476 << mPlacementModeComboBox
477 << mFieldExpressionWidget
478 << mCheckBoxSubstituteText
479 << mGeometryGeneratorGroupBox
480 << mGeometryGenerator
481 << mGeometryGeneratorType
482 << mBackgroundMarkerSymbolButton
483 << mBackgroundFillSymbolButton
484 << mCalloutsDrawCheckBox
485 << mCalloutStyleComboBox
488 << mMaskJoinStyleComboBox
489 << mMaskBufferSizeSpinBox
490 << mMaskOpacityWidget
491 << mCheckAllowLabelsOutsidePolygons
492 << mHtmlFormattingCheckBox;
499 connect( mBufferDrawChkBx, &QCheckBox::stateChanged,
this, [ = ](
int )
501 updateBufferFrameStatus();
504 connect( mShapeDrawChkBx, &QCheckBox::stateChanged,
this, [ = ](
int )
506 updateShapeFrameStatus();
509 connect( mShadowDrawChkBx, &QCheckBox::stateChanged,
this, [ = ](
int )
511 updateShadowFrameStatus();
514 connect( mCalloutsDrawCheckBox, &QCheckBox::stateChanged,
this, [ = ](
int )
516 updateCalloutFrameStatus();
524 whileBlocking( mOptionsTab )->setCurrentIndex( mLabelStackedWidget->currentIndex() );
525 mOptionsTab->tabBar()->setUsesScrollButtons(
true );
546 toggleDDButtons(
true );
548 mTextOrientationComboBox->addItem( tr(
"Rotation-based" ),
static_cast< int >( Qgis::TextOrientation::RotationBased ) );
553 const int prevIndex = mOptionsTab->currentIndex();
554 toggleDDButtons(
true );
555 delete mLabelingOptionsListWidget->takeItem( 8 );
556 delete mLabelingOptionsListWidget->takeItem( 7 );
557 delete mLabelingOptionsListWidget->takeItem( 6 );
558 delete mLabelingOptionsListWidget->takeItem( 3 );
559 mOptionsTab->removeTab( 8 );
560 mOptionsTab->removeTab( 7 );
561 mOptionsTab->removeTab( 6 );
562 mOptionsTab->removeTab( 3 );
563 mLabelStackedWidget->removeWidget( mLabelPage_Rendering );
564 mLabelStackedWidget->removeWidget( mLabelPage_Callouts );
565 mLabelStackedWidget->removeWidget( mLabelPage_Mask );
566 mLabelStackedWidget->removeWidget( mLabelPage_Placement );
576 mLabelStackedWidget->setCurrentIndex( prevIndex - 1 );
577 mOptionsTab->setCurrentIndex( prevIndex - 1 );
584 mLabelStackedWidget->setCurrentIndex( 0 );
585 mOptionsTab->setCurrentIndex( 0 );
589 frameLabelWith->hide();
590 mDirectSymbolsFrame->hide();
591 mFormatNumFrame->hide();
592 mFormatNumChkBx->hide();
593 mFormatNumDDBtn->hide();
594 mCheckBoxSubstituteText->hide();
595 mToolButtonConfigureSubstitutes->hide();
596 mLabelWrapOnCharacter->hide();
597 wrapCharacterEdit->hide();
598 mWrapCharDDBtn->hide();
599 mLabelWrapLinesTo->hide();
600 mAutoWrapLengthSpinBox->hide();
601 mAutoWrapLengthDDBtn->hide();
602 mAutoWrapTypeComboBox->hide();
603 mFontMultiLineLabel->hide();
604 mFontMultiLineAlignComboBox->hide();
605 mFontMultiLineAlignDDBtn->hide();
607 mTextOrientationComboBox->removeItem( mTextOrientationComboBox->findData(
static_cast< int >( Qgis::TextOrientation::RotationBased ) ) );
613void QgsTextFormatWidget::toggleDDButtons(
bool visible )
615 const auto buttons = findChildren< QgsPropertyOverrideButton * >();
618#ifndef HAS_KDE_QT5_FONT_STRETCH_FIX
619 if ( button == mFontStretchDDBtn )
622 button->setVisible( visible );
628 mOptionsTab->setVisible( enabled );
629 mOptionsTab->setTabToolTip( 0, tr(
"Text" ) );
630 mOptionsTab->setTabToolTip( 1, tr(
"Formatting" ) );
631 mOptionsTab->setTabToolTip( 2, tr(
"Buffer" ) );
632 mOptionsTab->setTabToolTip( 3, tr(
"Mask" ) );
633 mOptionsTab->setTabToolTip( 4, tr(
"Background" ) );
634 mOptionsTab->setTabToolTip( 5, tr(
"Shadow" ) );
635 mOptionsTab->setTabToolTip( 6, tr(
"Callouts" ) );
636 mOptionsTab->setTabToolTip( 7, tr(
"Placement" ) );
637 mOptionsTab->setTabToolTip( 8, tr(
"Rendering" ) );
639 mLabelingOptionsListFrame->setVisible( !enabled );
640 groupBox_mPreview->setVisible( !enabled );
644void QgsTextFormatWidget::connectValueChanged(
const QList<QWidget *> &widgets,
const char *slot )
646 const auto constWidgets = widgets;
647 for ( QWidget *widget : constWidgets )
651 connect( w, SIGNAL( changed() ),
this, slot );
655 connect( w, SIGNAL( fieldChanged( QString ) ),
this, slot );
657 else if (
QgsOpacityWidget *w = qobject_cast< QgsOpacityWidget *>( widget ) )
659 connect( w, SIGNAL( opacityChanged(
double ) ),
this, slot );
661 else if (
QgsScaleWidget *w = qobject_cast< QgsScaleWidget *>( widget ) )
663 connect( w, SIGNAL( scaleChanged(
double ) ),
this, slot );
667 connect( w, SIGNAL( changed() ),
this, slot );
669 else if ( QComboBox *w = qobject_cast<QComboBox *>( widget ) )
671 connect( w, SIGNAL( currentIndexChanged(
int ) ),
this, slot );
673 else if ( QSpinBox *w = qobject_cast<QSpinBox *>( widget ) )
675 connect( w, SIGNAL( valueChanged(
int ) ),
this, slot );
677 else if ( QDoubleSpinBox *w = qobject_cast<QDoubleSpinBox *>( widget ) )
679 connect( w, SIGNAL( valueChanged(
double ) ),
this, slot );
681 else if (
QgsColorButton *w = qobject_cast<QgsColorButton *>( widget ) )
683 connect( w, SIGNAL( colorChanged( QColor ) ),
this, slot );
685 else if ( QCheckBox *w = qobject_cast<QCheckBox *>( widget ) )
687 connect( w, SIGNAL( toggled(
bool ) ),
this, slot );
689 else if ( QRadioButton *w = qobject_cast<QRadioButton *>( widget ) )
691 connect( w, SIGNAL( toggled(
bool ) ),
this, slot );
693 else if ( QLineEdit *w = qobject_cast<QLineEdit *>( widget ) )
695 connect( w, SIGNAL( textEdited( QString ) ),
this, slot );
697 else if ( QSlider *w = qobject_cast<QSlider *>( widget ) )
699 connect( w, SIGNAL( valueChanged(
int ) ),
this, slot );
701 else if ( QGroupBox *w = qobject_cast<QGroupBox *>( widget ) )
703 connect( w, SIGNAL( toggled(
bool ) ),
this, slot );
707 connect( w, SIGNAL( textChanged() ),
this, slot );
711 QgsLogger::warning( QStringLiteral(
"Could not create connection for widget %1" ).arg( widget->objectName() ) );
743 mDirectSymbDDBtn->registerCheckedWidget( mDirectSymbChkBx );
751 mFormatNumDDBtn->registerCheckedWidget( mFormatNumChkBx );
766 mEnableMaskDDBtn->registerCheckedWidget( mEnableMaskChkBx );
774 mShapeDrawDDBtn->registerCheckedWidget( mShapeDrawChkBx );
796 mShadowDrawDDBtn->registerCheckedWidget( mShadowDrawChkBx );
838 updateDataDefinedAlignment();
841 const QString ddScaleVisInfo = tr(
"Value < 0 represents a scale closer than 1:1, e.g. -10 = 10:1<br>"
842 "Value of 0 disables the specific limit." );
844 mScaleBasedVisibilityDDBtn->registerCheckedWidget( mScaleBasedVisibilityChkBx );
846 mScaleBasedVisibilityMinDDBtn->setUsageInfo( ddScaleVisInfo );
848 mScaleBasedVisibilityMaxDDBtn->setUsageInfo( ddScaleVisInfo );
851 mFontLimitPixelDDBtn->registerCheckedWidget( mFontLimitPixelChkBox );
870 if ( !mButtons.contains( key ) )
875 mButtons[key] = button;
892 mBufferDrawChkBx->setChecked( buffer.
enabled() );
893 mBufferFrame->setEnabled( buffer.
enabled() );
894 spinBufferSize->setValue( buffer.
size() );
895 mBufferUnitWidget->setUnit( buffer.
sizeUnit() );
897 btnBufferColor->setColor( buffer.
color() );
898 mBufferOpacityWidget->setOpacity( buffer.
opacity() );
899 mBufferJoinStyleComboBox->setPenJoinStyle( buffer.
joinStyle() );
901 comboBufferBlendMode->setBlendMode( buffer.
blendMode() );
903 mBufferEffect.reset( lPaintEffect->clone() );
907 mBufferEffect->setEnabled(
false );
909 mBufferEffectWidget->setPaintEffect( mBufferEffect.get() );
913 mEnableMaskChkBx->setChecked( mask.
enabled() );
914 mMaskBufferSizeSpinBox->setValue( mask.
size() );
915 mMaskBufferUnitWidget->setUnit( mask.
sizeUnit() );
917 mMaskOpacityWidget->setOpacity( mask.
opacity() );
918 mMaskJoinStyleComboBox->setPenJoinStyle( mask.
joinStyle() );
920 mMaskEffect.reset( lPaintEffect->clone() );
924 mMaskEffect->setEnabled(
false );
926 mMaskEffectWidget->setPaintEffect( mMaskEffect.get() );
936 mTextOrientationComboBox->setCurrentIndex( mTextOrientationComboBox->findData(
static_cast< int >(
format.
orientation() ) ) );
939 mFontWordSpacingSpinBox->setValue(
format.
font().wordSpacing() );
940 mFontLetterSpacingSpinBox->setValue(
format.
font().letterSpacing() );
945 updateFont( mRefFont );
951 const QString missingTxt = tr(
"%1 not found. Default substituted." );
952 QString txtPrepend = tr(
"Chosen font" );
957 mFontMissingLabel->setText( missingTxt.arg( txtPrepend ) );
960 mLabelingOptionsListWidget->setCurrentRow( 0 );
967 mShapeDrawChkBx->setChecked( background.
enabled() );
968 mShapeFrame->setEnabled( background.
enabled() );
969 mShapeTypeCmbBx->blockSignals(
true );
970 mShapeTypeCmbBx->setCurrentIndex( mShapeTypeCmbBx->findData( background.
type() ) );
971 mShapeTypeCmbBx->blockSignals(
false );
972 updateAvailableShadowPositions();
973 mShapeSVGPathLineEdit->setText( background.
svgFile() );
975 mShapeSizeCmbBx->setCurrentIndex( background.
sizeType() );
976 mShapeSizeXSpnBx->setValue( background.
size().width() );
977 mShapeSizeYSpnBx->setValue( background.
size().height() );
978 mShapeSizeUnitWidget->setUnit( background.
sizeUnit() );
980 mShapeRotationCmbBx->setCurrentIndex( background.
rotationType() );
983 mShapeRotationDblSpnBx->setValue( background.
rotation() );
984 mShapeOffsetXSpnBx->setValue( background.
offset().x() );
985 mShapeOffsetYSpnBx->setValue( background.
offset().y() );
986 mShapeOffsetUnitWidget->setUnit( background.
offsetUnit() );
988 mShapeRadiusXDbSpnBx->setValue( background.
radii().width() );
989 mShapeRadiusYDbSpnBx->setValue( background.
radii().height() );
990 mShapeRadiusUnitWidget->setUnit( background.
radiiUnit() );
993 mShapeFillColorBtn->setColor( background.
fillColor() );
994 mShapeStrokeColorBtn->setColor( background.
strokeColor() );
995 mShapeStrokeWidthSpnBx->setValue( background.
strokeWidth() );
999 mBackgroundOpacityWidget->setOpacity( background.
opacity() );
1000 mShapeBlendCmbBx->setBlendMode( background.
blendMode() );
1002 mLoadSvgParams =
false;
1003 mShapeTypeCmbBx_currentIndexChanged( background.
type() );
1005 if (
auto *lPaintEffect = background.
paintEffect() )
1006 mBackgroundEffect.reset( lPaintEffect->clone() );
1010 mBackgroundEffect->setEnabled(
false );
1012 mBackgroundEffectWidget->setPaintEffect( mBackgroundEffect.get() );
1018 mShadowDrawChkBx->setChecked( shadow.
enabled() );
1019 mShadowFrame->setEnabled( shadow.
enabled() );
1020 mShadowUnderCmbBx->setCurrentIndex( mShadowUnderCmbBx->findData( shadow.
shadowPlacement() ) );
1021 mShadowOffsetAngleSpnBx->setValue( shadow.
offsetAngle() );
1023 mShadowOffsetUnitWidget->setUnit( shadow.
offsetUnit() );
1025 mShadowOffsetGlobalChkBx->setChecked( shadow.
offsetGlobal() );
1027 mShadowRadiusDblSpnBx->setValue( shadow.
blurRadius() );
1030 mShadowRadiusAlphaChkBx->setChecked( shadow.
blurAlphaOnly() );
1031 mShadowOpacityWidget->setOpacity( shadow.
opacity() );
1032 mShadowScaleSpnBx->setValue( shadow.
scale() );
1034 mShadowColorBtn->setColor( shadow.
color() );
1035 mShadowBlendCmbBx->setBlendMode( shadow.
blendMode() );
1047 settings.
setValue( QStringLiteral(
"Windows/Labeling/FontPreviewSplitState" ), mFontPreviewSplitter->saveState() );
1048 settings.
setValue( QStringLiteral(
"Windows/Labeling/OptionsSplitState" ), mLabelingOptionsSplitter->saveState() );
1050 int prevIndex = mLabelingOptionsListWidget->currentRow();
1051 if ( mWidgetMode ==
Text )
1053 switch ( prevIndex )
1062 settings.
setValue( QStringLiteral(
"Windows/Labeling/Tab" ), prevIndex );
1077 format.
setLineHeight( mLineHeightUnitWidget->unit() == Qgis::RenderUnit::Percentage ? ( mFontLineHeightSpinBox->value() / 100 ) : mFontLineHeightSpinBox->value() );
1086 buffer.
setEnabled( mBufferDrawChkBx->isChecked() );
1087 buffer.
setSize( spinBufferSize->value() );
1088 buffer.
setColor( btnBufferColor->color() );
1089 buffer.
setOpacity( mBufferOpacityWidget->opacity() );
1092 buffer.
setJoinStyle( mBufferJoinStyleComboBox->penJoinStyle() );
1094 buffer.
setBlendMode( comboBufferBlendMode->blendMode() );
1103 mask.
setEnabled( mEnableMaskChkBx->isChecked() );
1104 mask.
setSize( mMaskBufferSizeSpinBox->value() );
1105 mask.
setOpacity( mMaskOpacityWidget->opacity() );
1106 mask.
setSizeUnit( mMaskBufferUnitWidget->unit() );
1108 mask.
setJoinStyle( mMaskJoinStyleComboBox->penJoinStyle() );
1118 background.
setEnabled( mShapeDrawChkBx->isChecked() );
1120 background.
setSvgFile( mShapeSVGPathLineEdit->text() );
1122 background.
setSize( QSizeF( mShapeSizeXSpnBx->value(), mShapeSizeYSpnBx->value() ) );
1123 background.
setSizeUnit( mShapeSizeUnitWidget->unit() );
1126 background.
setRotation( mShapeRotationDblSpnBx->value() );
1127 background.
setOffset( QPointF( mShapeOffsetXSpnBx->value(), mShapeOffsetYSpnBx->value() ) );
1130 background.
setRadii( QSizeF( mShapeRadiusXDbSpnBx->value(), mShapeRadiusYDbSpnBx->value() ) );
1131 background.
setRadiiUnit( mShapeRadiusUnitWidget->unit() );
1134 background.
setFillColor( mShapeFillColorBtn->color() );
1139 background.
setOpacity( mBackgroundOpacityWidget->opacity() );
1140 background.
setBlendMode( mShapeBlendCmbBx->blendMode() );
1151 shadow.
setEnabled( mShadowDrawChkBx->isChecked() );
1162 shadow.
setOpacity( mShadowOpacityWidget->opacity() );
1163 shadow.
setScale( mShadowScaleSpnBx->value() );
1164 shadow.
setColor( mShadowColorBtn->color() );
1168 if ( includeDataDefinedProperties )
1199 if ( mButtons.contains( key ) )
1208void QgsTextFormatWidget::optionsStackedWidget_CurrentChanged(
int indx )
1210 mLabelingOptionsListWidget->blockSignals(
true );
1211 mLabelingOptionsListWidget->setCurrentRow( indx );
1212 mLabelingOptionsListWidget->blockSignals(
false );
1221 mPreviewExpressionContext = *lExpressionContext;
1226 const auto symbolButtonWidgets = findChildren<QgsSymbolButton *>();
1234void QgsTextFormatWidget::collapseSample(
bool collapse )
1238 QList<int> splitSizes = mFontPreviewSplitter->sizes();
1239 if ( splitSizes[0] > groupBox_mPreview->height() )
1241 const int delta = splitSizes[0] - groupBox_mPreview->height();
1242 splitSizes[0] -= delta;
1243 splitSizes[1] += delta;
1244 mFontPreviewSplitter->setSizes( splitSizes );
1249void QgsTextFormatWidget::changeTextColor(
const QColor &color )
1255void QgsTextFormatWidget::updateFont(
const QFont &font )
1258 if ( font != mRefFont )
1267 mDirectSymbLeftLineEdit->setFont( mRefFont );
1268 mDirectSymbRightLineEdit->setFont( mRefFont );
1270 blockFontChangeSignals(
true );
1271 mFontFamilyCmbBx->setCurrentFont( mRefFont );
1272 populateFontStyleComboBox();
1273 mFontUnderlineBtn->setChecked( mRefFont.underline() );
1274 mFontStrikethroughBtn->setChecked( mRefFont.strikeOut() );
1275 mKerningCheckBox->setChecked( mRefFont.kerning() );
1276 blockFontChangeSignals(
false );
1284void QgsTextFormatWidget::blockFontChangeSignals(
bool blk )
1286 mFontFamilyCmbBx->blockSignals( blk );
1287 mFontStyleComboBox->blockSignals( blk );
1288 mFontCapitalsComboBox->blockSignals( blk );
1289 mFontUnderlineBtn->blockSignals( blk );
1290 mFontStrikethroughBtn->blockSignals( blk );
1291 mFontWordSpacingSpinBox->blockSignals( blk );
1292 mFontLetterSpacingSpinBox->blockSignals( blk );
1293 mKerningCheckBox->blockSignals( blk );
1308 lblFontPreview->setFormat(
format() );
1311void QgsTextFormatWidget::scrollPreview()
1313 scrollArea_mPreview->ensureVisible( 0, 0, 0, 0 );
1318 mPreviewBackgroundColor = color;
1320 scrollArea_mPreview->widget()->setStyleSheet( QStringLiteral(
"background: rgb(%1, %2, %3);" ).arg( QString::number( color.red() ),
1321 QString::number( color.green() ),
1322 QString::number( color.blue() ) ) );
1325void QgsTextFormatWidget::changeBufferColor(
const QColor &color )
1334 bool showLineFrame =
false;
1335 bool showCentroidFrame =
false;
1336 bool showQuadrantFrame =
false;
1337 bool showFixedQuadrantFrame =
false;
1338 bool showPlacementPriorityFrame =
false;
1339 bool showOffsetTypeFrame =
false;
1340 bool showOffsetFrame =
false;
1341 bool showDistanceFrame =
false;
1342 bool showRotationFrame =
false;
1343 bool showMaxCharAngleFrame =
false;
1348 bool enableMultiLinesFrame =
true;
1351 && ( currentGeometryType == Qgis::GeometryType::Point || currentGeometryType == Qgis::GeometryType::Polygon ) )
1353 showCentroidFrame = currentGeometryType == Qgis::GeometryType::Polygon;
1354 showDistanceFrame =
true;
1356 showQuadrantFrame = currentGeometryType == Qgis::GeometryType::Point;
1359 && ( currentGeometryType == Qgis::GeometryType::Point || currentGeometryType == Qgis::GeometryType::Polygon ) )
1361 showCentroidFrame = currentGeometryType == Qgis::GeometryType::Polygon;
1362 showQuadrantFrame =
true;
1363 showFixedQuadrantFrame =
true;
1364 showOffsetFrame =
true;
1365 showRotationFrame =
true;
1369 showDistanceFrame =
true;
1370 showPlacementPriorityFrame =
true;
1371 showOffsetTypeFrame =
true;
1378 showLineFrame =
true;
1379 showDistanceFrame =
true;
1382 const bool offline = chkLineAbove->isChecked() || chkLineBelow->isChecked();
1383 chkLineOrientationDependent->setEnabled( offline );
1384 mPlacementDistanceFrame->setEnabled( offline );
1388 showMaxCharAngleFrame = isCurved;
1390 enableMultiLinesFrame = !isCurved;
1392 else if ( currentGeometryType == Qgis::GeometryType::Polygon
1395 showDistanceFrame =
true;
1398 mPlacementLineFrame->setVisible( showLineFrame );
1399 mPlacementPolygonFrame->setVisible( showPolygonPlacementOptions );
1400 mPlacementCentroidFrame->setVisible( showCentroidFrame );
1401 mPlacementQuadrantFrame->setVisible( showQuadrantFrame );
1402 mPlacementFixedQuadrantFrame->setVisible( showFixedQuadrantFrame );
1403 mPlacementCartographicFrame->setVisible( showPlacementPriorityFrame );
1404 mPlacementOffsetFrame->setVisible( showOffsetFrame );
1405 mPlacementDistanceFrame->setVisible( showDistanceFrame );
1406 mPlacementOffsetTypeFrame->setVisible( showOffsetTypeFrame );
1407 mPlacementRotationFrame->setVisible( showRotationFrame );
1408 mPlacementRepeatGroupBox->setVisible( currentGeometryType == Qgis::GeometryType::Line || ( currentGeometryType == Qgis::GeometryType::Polygon &&
1411 mLineAnchorGroupBox->setVisible( currentGeometryType == Qgis::GeometryType::Line );
1412 mPlacementMaxCharAngleFrame->setVisible( showMaxCharAngleFrame );
1414 mMultiLinesFrame->setEnabled( enableMultiLinesFrame );
1418 switch ( currentPlacement )
1421 if ( currentGeometryType == Qgis::GeometryType::Point )
1422 helperText = tr(
"Arranges label candidates in a clockwise circle around the feature, preferring placements to the top-right of the feature." );
1423 else if ( currentGeometryType == Qgis::GeometryType::Polygon )
1424 helperText = tr(
"Arranges label candidates in a cluster around the feature's centroid, preferring placements directly over the centroid." );
1427 if ( currentGeometryType == Qgis::GeometryType::Point )
1428 helperText = tr(
"Arranges label candidates directly over the feature or at a preset offset from the feature." );
1429 else if ( currentGeometryType == Qgis::GeometryType::Polygon )
1430 helperText = tr(
"Arranges label candidates directly over the feature's centroid, or at a preset offset from the centroid." );
1433 if ( currentGeometryType == Qgis::GeometryType::Line )
1434 helperText = tr(
"Arranges label candidates parallel to a generalised line representing the feature. Placements which fall over straighter portions of the line are preferred." );
1435 else if ( currentGeometryType == Qgis::GeometryType::Polygon )
1436 helperText = tr(
"Arranges label candidates parallel to a generalised line representing the polygon's perimeter. Placements which fall over straighter portions of the perimeter are preferred." );
1439 if ( currentGeometryType == Qgis::GeometryType::Line )
1440 helperText = tr(
"Arranges candidates following the curvature of a line feature. Placements which fall over straighter portions of the line are preferred." );
1443 if ( currentGeometryType == Qgis::GeometryType::Polygon )
1444 helperText = tr(
"Arranges label candidates scattered throughout the polygon. Labels will always be placed horizontally, with placements further from the edges of the polygon preferred." );
1445 else if ( currentGeometryType == Qgis::GeometryType::Line )
1446 helperText = tr(
"Label candidates are arranged horizontally along the length of the feature." );
1449 if ( currentGeometryType == Qgis::GeometryType::Polygon )
1450 helperText = tr(
"Arranges label candidates scattered throughout the polygon. Labels are rotated to respect the polygon's orientation, with placements further from the edges of the polygon preferred." );
1453 if ( currentGeometryType == Qgis::GeometryType::Point )
1454 helperText = tr(
"Label candidates are placed in predefined positions around the features. Preference is given to positions with greatest cartographic appeal, e.g., top right and bottom right of the feature." );
1457 if ( currentGeometryType == Qgis::GeometryType::Polygon )
1458 helperText = tr(
"Arranges candidates following the curvature of the feature's perimeter. Placements which fall over straighter portions of the perimeter are preferred." );
1461 if ( currentGeometryType == Qgis::GeometryType::Polygon )
1462 helperText = tr(
"Label candidates are placed outside of the features, preferring placements which give greatest visual association between the label and the feature." );
1465 mPlacementModeDescriptionLabel->setText( QStringLiteral(
"<i>%1</i>" ).arg( helperText ) );
1468void QgsTextFormatWidget::populateFontCapitalsComboBox()
1473#if defined(HAS_KDE_QT5_SMALL_CAPS_FIX) || QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
1483void QgsTextFormatWidget::populateFontStyleComboBox()
1485 mFontStyleComboBox->clear();
1486 const QStringList styles = mFontDB.styles( mRefFont.family() );
1487 const auto constStyles = styles;
1488 for (
const QString &style : constStyles )
1490 mFontStyleComboBox->addItem( style );
1493 QString targetStyle = mFontDB.styleString( mRefFont );
1494 if ( !styles.contains( targetStyle ) )
1496 const QFont f = QFont( mRefFont.family() );
1497 targetStyle = QFontInfo( f ).styleName();
1498 mRefFont.setStyleName( targetStyle );
1501 const int stylIndx = mFontStyleComboBox->findText( targetStyle );
1502 if ( stylIndx > -1 )
1507 mFontStyleComboBox->setCurrentIndex( curIndx );
1510void QgsTextFormatWidget::mFontSizeSpinBox_valueChanged(
double d )
1512 mRefFont.setPointSizeF( d );
1513 updateFont( mRefFont );
1516void QgsTextFormatWidget::mFontFamilyCmbBx_currentFontChanged(
const QFont &f )
1518 mRefFont.setFamily( f.family() );
1519 updateFont( mRefFont );
1522void QgsTextFormatWidget::mFontStyleComboBox_currentIndexChanged(
const QString &text )
1525 updateFont( mRefFont );
1528void QgsTextFormatWidget::mFontUnderlineBtn_toggled(
bool ckd )
1530 mRefFont.setUnderline( ckd );
1531 updateFont( mRefFont );
1534void QgsTextFormatWidget::mFontStrikethroughBtn_toggled(
bool ckd )
1536 mRefFont.setStrikeOut( ckd );
1537 updateFont( mRefFont );
1540void QgsTextFormatWidget::kerningToggled(
bool checked )
1542 mRefFont.setKerning( checked );
1543 updateFont( mRefFont );
1546void QgsTextFormatWidget::mFontWordSpacingSpinBox_valueChanged(
double spacing )
1548 mRefFont.setWordSpacing( spacing );
1549 updateFont( mRefFont );
1552void QgsTextFormatWidget::mFontLetterSpacingSpinBox_valueChanged(
double spacing )
1554 mRefFont.setLetterSpacing( QFont::AbsoluteSpacing, spacing );
1555 updateFont( mRefFont );
1558void QgsTextFormatWidget::mFontSizeUnitWidget_changed()
1561 if ( mFontSizeUnitWidget->unit() != Qgis::RenderUnit::MapUnits )
1563 mFontLimitPixelChkBox->setChecked(
false );
1569 mFontLimitPixelChkBox->setChecked(
true );
1571 updateFont( mRefFont );
1574void QgsTextFormatWidget::mFontMinPixelSpinBox_valueChanged(
int px )
1577 mFontMaxPixelSpinBox->setMinimum( px );
1578 mFontMaxPixelSpinBox->update();
1581void QgsTextFormatWidget::mFontMaxPixelSpinBox_valueChanged(
int px )
1584 if ( px < mFontMinPixelSpinBox->value() )
1586 mFontMaxPixelSpinBox->blockSignals(
true );
1587 mFontMaxPixelSpinBox->setValue( mFontMinPixelSpinBox->value() );
1588 mFontMaxPixelSpinBox->blockSignals(
false );
1590 mFontMaxPixelSpinBox->setMinimum( mFontMinPixelSpinBox->value() );
1593void QgsTextFormatWidget::mBufferUnitWidget_changed()
1595 updateFont( mRefFont );
1598void QgsTextFormatWidget::mMaskBufferUnitWidget_changed()
1600 updateFont( mRefFont );
1603void QgsTextFormatWidget::mCoordXDDBtn_changed()
1605 updateDataDefinedAlignment();
1608void QgsTextFormatWidget::mCoordXDDBtn_activated(
bool isActive )
1613 mCoordPointDDBtn->setActive(
false );
1616void QgsTextFormatWidget::mCoordYDDBtn_changed()
1618 updateDataDefinedAlignment();
1621void QgsTextFormatWidget::mCoordYDDBtn_activated(
bool isActive )
1626 mCoordPointDDBtn->setActive(
false );
1629void QgsTextFormatWidget::mCoordPointDDBtn_changed()
1631 updateDataDefinedAlignment();
1634void QgsTextFormatWidget::mCoordPointDDBtn_activated(
bool isActive )
1639 mCoordXDDBtn->setActive(
false );
1640 mCoordYDDBtn->setActive(
false );
1643void QgsTextFormatWidget::mShapeTypeCmbBx_currentIndexChanged(
int )
1651 showBackgroundRadius( isRect );
1653 mShapeSVGPathFrame->setVisible( isSVG );
1654 mBackgroundMarkerSymbolButton->setVisible( isMarker );
1655 mBackgroundFillSymbolButton->setVisible( !isSVG && !isMarker );
1659 mShapeSizeYLabel->setVisible( !isSVG && !isMarker );
1660 mShapeSizeYSpnBx->setVisible( !isSVG && !isMarker );
1661 mShapeSizeYDDBtn->setVisible( !isSVG && !isMarker );
1662 mShapeSizeXLabel->setText( tr(
"Size%1" ).arg( !isSVG && !isMarker ? tr(
" X" ) : QString() ) );
1665 mShapeFillColorBtn->setAllowOpacity( !isSVG );
1666 mShapeFillColorBtn->setButtonBackground();
1667 mShapeStrokeColorBtn->setAllowOpacity( !isSVG );
1668 mShapeStrokeColorBtn->setButtonBackground();
1671 mShapeFillColorLabel->setVisible( isSVG );
1672 mShapeFillColorLabel->setEnabled( isSVG );
1673 mShapeFillColorBtn->setVisible( isSVG );
1674 mShapeFillColorBtn->setEnabled( isSVG );
1675 mShapeFillColorDDBtn->setVisible( isSVG );
1676 mShapeFillColorDDBtn->setEnabled( isSVG );
1677 mShapeStrokeColorLabel->setVisible( isSVG );
1678 mShapeStrokeColorLabel->setEnabled( isSVG );
1679 mShapeStrokeColorBtn->setVisible( isSVG );
1680 mShapeStrokeColorBtn->setEnabled( isSVG );
1681 mShapeStrokeColorDDBtn->setVisible( isSVG );
1682 mShapeStrokeColorDDBtn->setEnabled( isSVG );
1683 mShapeStrokeWidthLabel->setVisible( isSVG );
1684 mShapeStrokeWidthLabel->setEnabled( isSVG );
1685 mShapeStrokeWidthSpnBx->setVisible( isSVG );
1686 mShapeStrokeWidthSpnBx->setEnabled( isSVG );
1687 mShapeStrokeWidthDDBtn->setVisible( isSVG );
1688 mShapeStrokeWidthDDBtn->setEnabled( isSVG );
1691 mShapeSVGParamsBtn->setVisible( isSVG );
1694 updateSvgWidgets( mShapeSVGPathLineEdit->text() );
1698 mShapeSVGUnitsLabel->setVisible( isSVG );
1699 mShapeStrokeWidthUnitWidget->setVisible(
false );
1700 mShapeStrokeUnitsDDBtn->setVisible(
false );
1701 mShapeStrokeUnitsDDBtn->setEnabled(
false );
1703 updateAvailableShadowPositions();
1706void QgsTextFormatWidget::mShapeSVGPathLineEdit_textChanged(
const QString &text )
1708 updateSvgWidgets( text );
1713 const int numOptionsChecked = ( chkLineAbove->isChecked() ? 1 : 0 ) +
1714 ( chkLineBelow->isChecked() ? 1 : 0 ) +
1715 ( chkLineOn->isChecked() ? 1 : 0 );
1717 if ( numOptionsChecked == 1 )
1720 chkLineAbove->setEnabled( !chkLineAbove->isChecked() );
1721 chkLineBelow->setEnabled( !chkLineBelow->isChecked() );
1722 chkLineOn->setEnabled( !chkLineOn->isChecked() );
1726 chkLineAbove->setEnabled(
true );
1727 chkLineBelow->setEnabled(
true );
1728 chkLineOn->setEnabled(
true );
1738void QgsTextFormatWidget::previewScaleChanged(
double scale )
1740 lblFontPreview->setScale( scale );
1743void QgsTextFormatWidget::updateSvgWidgets(
const QString &svgPath )
1745 if ( mShapeSVGPathLineEdit->text() != svgPath )
1747 mShapeSVGPathLineEdit->setText( svgPath );
1750 QString resolvedPath;
1751 bool validSVG =
true;
1752 if ( ! svgPath.startsWith( QLatin1String(
"base64:" ), Qt::CaseInsensitive ) )
1755 validSVG = QFileInfo::exists( resolvedPath );
1759 resolvedPath = svgPath;
1764 mShapeSVGPathLineEdit->setStyleSheet( !validSVG ? QStringLiteral(
"QLineEdit{ color: rgb(225, 0, 0); }" ) : QString() );
1765 mShapeSVGPathLineEdit->setToolTip( !validSVG ? tr(
"File not found" ) : resolvedPath );
1767 QColor fill, stroke;
1768 double strokeWidth = 0.0;
1769 bool fillParam =
false, strokeParam =
false, strokeWidthParam =
false;
1775 mShapeSVGParamsBtn->setEnabled( validSVG && ( fillParam || strokeParam || strokeWidthParam ) );
1777 mShapeFillColorLabel->setEnabled( validSVG && fillParam );
1778 mShapeFillColorBtn->setEnabled( validSVG && fillParam );
1779 mShapeFillColorDDBtn->setEnabled( validSVG && fillParam );
1780 if ( mLoadSvgParams && validSVG && fillParam )
1781 mShapeFillColorBtn->setColor( fill );
1783 mShapeStrokeColorLabel->setEnabled( validSVG && strokeParam );
1784 mShapeStrokeColorBtn->setEnabled( validSVG && strokeParam );
1785 mShapeStrokeColorDDBtn->setEnabled( validSVG && strokeParam );
1786 if ( mLoadSvgParams && validSVG && strokeParam )
1787 mShapeStrokeColorBtn->setColor( stroke );
1789 mShapeStrokeWidthLabel->setEnabled( validSVG && strokeWidthParam );
1790 mShapeStrokeWidthSpnBx->setEnabled( validSVG && strokeWidthParam );
1791 mShapeStrokeWidthDDBtn->setEnabled( validSVG && strokeWidthParam );
1792 if ( mLoadSvgParams && validSVG && strokeWidthParam )
1793 mShapeStrokeWidthSpnBx->setValue( strokeWidth );
1799 mShapeSVGUnitsLabel->setEnabled( validSVG && strokeWidthParam );
1802void QgsTextFormatWidget::updateAvailableShadowPositions()
1804 if ( mShadowUnderCmbBx->count() == 0
1810 mShadowUnderCmbBx->clear();
1818 mShadowUnderCmbBx->setCurrentIndex( mShadowUnderCmbBx->findData( currentPlacement ) );
1819 if ( mShadowUnderCmbBx->currentIndex() == -1 )
1820 mShadowUnderCmbBx->setCurrentIndex( 0 );
1824void QgsTextFormatWidget::updateProperty()
1832void QgsTextFormatWidget::createAuxiliaryField()
1859 property.setActive(
true );
1868void QgsTextFormatWidget::updateShapeFrameStatus()
1870 mShapeFrame->setEnabled( mShapeDrawDDBtn->isActive() || mShapeDrawChkBx->isChecked() );
1873void QgsTextFormatWidget::updateBufferFrameStatus()
1875 mBufferFrame->setEnabled( mBufferDrawDDBtn->isActive() || mBufferDrawChkBx->isChecked() );
1878void QgsTextFormatWidget::updateShadowFrameStatus()
1880 mShadowFrame->setEnabled( mShadowDrawDDBtn->isActive() || mShadowDrawChkBx->isChecked() );
1883void QgsTextFormatWidget::updateCalloutFrameStatus()
1885 mCalloutFrame->setEnabled( mCalloutDrawDDBtn->isActive() || mCalloutsDrawCheckBox->isChecked() );
1888void QgsTextFormatWidget::updateDataDefinedAlignment()
1891 mCoordAlignmentFrame->setEnabled( ( mCoordXDDBtn->isActive() && mCoordYDDBtn->isActive() )
1892 || mCoordPointDDBtn->isActive() );
1895void QgsTextFormatWidget::overlapModeChanged()
1897 QString description;
1901 description = tr(
"Overlapping labels will never be placed for the layer, even if it means some labels will be missing. (To see unplaced labels use the \"Show Unplaced Labels\" toolbar action.)" );
1904 description = tr(
"If a label cannot otherwise be placed for a feature then an overlapping label is permitted." );
1907 description = tr(
"Labels from this layer may freely overlap other labels or label obstacles without penalty." );
1911 mOverlapModeDescriptionLabel->setText( QStringLiteral(
"<i>%1</i>" ).arg( description ) );
1916 if ( name.isEmpty() )
1959 saveDlg.
setDefaultTags( mTextFormatsListWidget->currentTagFilter() );
1960 if ( !saveDlg.exec() )
1963 if ( saveDlg.
name().isEmpty() )
1973 const int res = QMessageBox::warning(
this, tr(
"Save Text Format" ),
1974 tr(
"Format with name '%1' already exists. Overwrite?" )
1975 .arg( saveDlg.
name() ),
1976 QMessageBox::Yes | QMessageBox::No );
1977 if ( res != QMessageBox::Yes )
1984 const QStringList symbolTags = saveDlg.
tags().split(
',' );
1991void QgsTextFormatWidget::mShapeSVGSelectorBtn_clicked()
1994 svgDlg.setWindowTitle( tr(
"Select SVG file" ) );
1995 svgDlg.svgSelector()->setSvgPath( mShapeSVGPathLineEdit->text().trimmed() );
1997 if ( svgDlg.exec() == QDialog::Accepted )
1999 const QString svgPath = svgDlg.svgSelector()->currentSvgPath();
2000 if ( !svgPath.isEmpty() )
2002 mShapeSVGPathLineEdit->setText( svgPath );
2008void QgsTextFormatWidget::mShapeSVGParamsBtn_clicked()
2010 const QString svgPath = mShapeSVGPathLineEdit->text();
2011 mLoadSvgParams =
true;
2012 updateSvgWidgets( svgPath );
2013 mLoadSvgParams =
false;
2016void QgsTextFormatWidget::mShapeRotationCmbBx_currentIndexChanged(
int index )
2022void QgsTextFormatWidget::mPreviewTextEdit_textChanged(
const QString &text )
2024 lblFontPreview->setText( text );
2028void QgsTextFormatWidget::mPreviewTextBtn_clicked()
2030 mPreviewTextEdit->setText( QStringLiteral(
"Lorem Ipsum" ) );
2034void QgsTextFormatWidget::mPreviewBackgroundBtn_colorChanged(
const QColor &color )
2039void QgsTextFormatWidget::mDirectSymbLeftToolBtn_clicked()
2041 bool gotChar =
false;
2043 const QChar initial = !mDirectSymbLeftLineEdit->text().isEmpty() ? mDirectSymbLeftLineEdit->text().at( 0 ) : QChar();
2044 const QChar dirSymb = mCharDlg->
selectCharacter( &gotChar, mRefFont, mFontDB.styleString( mRefFont ), initial );
2049 if ( !dirSymb.isNull() )
2050 mDirectSymbLeftLineEdit->setText( QString( dirSymb ) );
2053void QgsTextFormatWidget::mDirectSymbRightToolBtn_clicked()
2055 bool gotChar =
false;
2056 const QChar initial = !mDirectSymbRightLineEdit->text().isEmpty() ? mDirectSymbRightLineEdit->text().at( 0 ) : QChar();
2057 const QChar dirSymb = mCharDlg->
selectCharacter( &gotChar, mRefFont, mFontDB.styleString( mRefFont ), initial );
2062 if ( !dirSymb.isNull() )
2063 mDirectSymbRightLineEdit->setText( QString( dirSymb ) );
2066void QgsTextFormatWidget::chkLineOrientationDependent_toggled(
bool active )
2070 chkLineAbove->setText( tr(
"Left of line" ) );
2071 chkLineBelow->setText( tr(
"Right of line" ) );
2075 chkLineAbove->setText( tr(
"Above line" ) );
2076 chkLineBelow->setText( tr(
"Below line" ) );
2081void QgsTextFormatWidget::mToolButtonConfigureSubstitutes_clicked()
2096 if ( dlg.exec() == QDialog::Accepted )
2103void QgsTextFormatWidget::showBackgroundRadius(
bool show )
2105 mShapeRadiusLabel->setVisible( show );
2106 mShapeRadiusXDbSpnBx->setVisible( show );
2108 mShapeRadiusYDbSpnBx->setVisible( show );
2110 mShapeRadiusUnitWidget->setVisible( show );
2112 mShapeRadiusDDBtn->setVisible( show );
2113 mShapeRadiusUnitsDDBtn->setVisible( show );
2119 return *lExpressionContext;
2140 if ( mGeometryGeneratorGroupBox->isChecked() )
2154 : QDialog( parent, fl )
2156 setWindowTitle( tr(
"Text Settings" ) );
2159 mFormatWidget->layout()->setContentsMargins( 0, 0, 0, 0 );
2161 QVBoxLayout *layout =
new QVBoxLayout(
this );
2162 layout->addWidget( mFormatWidget );
2164 mButtonBox =
new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help, Qt::Horizontal,
this );
2165 layout->addWidget( mButtonBox );
2167 setLayout( layout );
2170 connect( mButtonBox->button( QDialogButtonBox::Ok ), &QAbstractButton::clicked,
this, &QDialog::accept );
2171 connect( mButtonBox->button( QDialogButtonBox::Cancel ), &QAbstractButton::clicked,
this, &QDialog::reject );
2172 connect( mButtonBox->button( QDialogButtonBox::Help ), &QAbstractButton::clicked,
this, &QgsTextFormatDialog::showHelp );
2177 return mFormatWidget->
format();
2180void QgsTextFormatDialog::showHelp()
2182 QgsHelp::openHelp( QStringLiteral(
"style_library/label_settings.html#formatting-the-label-text" ) );
2198 mFormatWidget = qobject_cast< QgsTextFormatWidget * >(
widget() );
2201 if ( !mBlockSignals )
2208 return mFormatWidget->
format();
2213 mBlockSignals =
true;
2215 mBlockSignals =
false;
@ FromPoint
Offset distance applies from point geometry.
@ FromSymbolBounds
Offset distance applies from rendered symbol bounds.
LabelPlacement
Placement modes which determine how label candidates are generated for a feature.
@ OverPoint
Arranges candidates over a point (or centroid of a polygon), or at a preset offset from the point....
@ Curved
Arranges candidates following the curvature of a line feature. Applies to line layers only.
@ AroundPoint
Arranges candidates in a circle around a point (or centroid of a polygon). Applies to point or polygo...
@ Line
Arranges candidates parallel to a generalised line representing the feature or parallel to a polygon'...
@ Free
Arranges candidates scattered throughout a polygon feature. Candidates are rotated to respect the pol...
@ OrderedPositionsAroundPoint
Candidates are placed in predefined positions around a point. Preference is given to positions with g...
@ Horizontal
Arranges horizontal candidates scattered throughout a polygon feature. Applies to polygon layers only...
@ PerimeterCurved
Arranges candidates following the curvature of a polygon's boundary. Applies to polygon layers only.
@ OutsidePolygons
Candidates are placed outside of polygon boundaries. Applies to polygon layers only....
Capitalization
String capitalization options.
@ AllSmallCaps
Force all characters to small caps (since QGIS 3.24)
@ MixedCase
Mixed case, ie no change.
@ AllLowercase
Convert all characters to lowercase.
@ TitleCase
Simple title case conversion - does not fully grammatically parse the text and uses simple rules only...
@ SmallCaps
Mixed case small caps (since QGIS 3.24)
@ ForceFirstLetterToCapital
Convert just the first letter of each word to uppercase, leave the rest untouched.
@ AllUppercase
Convert all characters to uppercase.
TextOrientation
Text orientations.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
LabelOverlapHandling
Label overlap handling.
@ AllowOverlapAtNoCost
Labels may freely overlap other labels, at no cost.
@ AllowOverlapIfRequired
Avoids overlapping labels when possible, but permit overlaps if labels for features cannot otherwise ...
@ PreventOverlap
Do not allow labels to overlap other labels.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
static QString nameFromProperty(const QgsPropertyDefinition &def, bool joined=false)
Returns the name of the auxiliary field for a property definition.
bool addAuxiliaryField(const QgsPropertyDefinition &definition)
Adds an auxiliary field for the given property.
bool exists(const QgsPropertyDefinition &definition) const
Returns true if the property is stored in the layer already, false otherwise.
A dialog for selecting a single character from a single font.
QChar selectCharacter(bool *gotChar, const QFont &font, const QString &style, QChar initialSelection=QChar())
Opens the dialog modally and returns when the user has selected a character.
A QGIS expression editor based on QScintilla2.
void collapsedStateChanged(bool collapsed)
Signal emitted when groupbox collapsed/expanded state is changed, and when first shown.
A groupbox that collapses/expands when toggled and can save its collapsed and checked states.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * atlasScope(const QgsLayoutAtlas *atlas)
Creates a new scope which contains variables and functions relating to a QgsLayoutAtlas.
static QgsExpressionContextScope * mapSettingsScope(const QgsMapSettings &mapSettings)
Creates a new scope which contains variables and functions relating to a QgsMapSettings object.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setOriginalValueVariable(const QVariant &value)
Sets the original value variable value for the context.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void setHighlightedVariables(const QStringList &variableNames)
Sets the list of variable names within the context intended to be highlighted to the user.
static const QString EXPR_ORIGINAL_VALUE
Inbuilt variable name for value original value variable.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
QgsFillSymbol * clone() const override
Returns a deep copy of this symbol.
static bool fontFamilyMatchOnSystem(const QString &family, QString *chosen=nullptr, bool *match=nullptr)
Check whether font family is on system.
static bool updateFontViaStyle(QFont &f, const QString &fontstyle, bool fallback=false)
Updates font with named style and retain all font properties.
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
static QIcon iconForWkbType(Qgis::WkbType type)
Returns the icon for a vector layer whose geometry type is provided.
@ SymbolLeftRight
Place direction symbols on left/right of label.
@ SymbolAbove
Place direction symbols on above label.
@ SymbolBelow
Place direction symbols on below label.
static void warning(const QString &msg)
Goes to qWarning.
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
Qgis::DistanceUnit mapUnits() const
Returns the units of the map's geographical coordinates - used for scale calculation.
double scale() const
Returns the calculated map scale.
A marker symbol type, for rendering Point and MultiPoint geometries.
QgsMarkerSymbol * clone() const override
Returns a deep copy of this symbol.
A dialog to create a new auxiliary layer.
static QgsPaintEffect * defaultStack()
Returns a new effect stack consisting of a sensible selection of default effects.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
Property
Data definable properties.
@ MaskEnabled
Whether the mask is enabled.
@ LabelRotation
Label rotation.
@ PositionY
Y-coordinate data defined label position.
@ OverlapHandling
Overlap handling technique (since QGIS 3.26)
@ OverrunDistance
Distance which labels can extend past either end of linear features.
@ Strikeout
Use strikeout.
@ FontStyle
Font style name.
@ PositionX
X-coordinate data defined label position.
@ CalloutDraw
Show callout.
@ Underline
Use underline.
@ FontLetterSpacing
Letter spacing.
@ MaskJoinStyle
Mask join style.
@ PositionPoint
Point-coordinate data defined label position.
@ Hali
Horizontal alignment for data defined label position (Left, Center, Right)
@ FontStretchFactor
Font stretch factor, since QGIS 3.24.
@ MaskBufferUnit
Mask buffer size unit.
@ LabelAllParts
Whether all parts of multi-part features should be labeled.
@ AllowDegradedPlacement
Allow degraded label placements (since QGIS 3.26)
@ ShadowOpacity
Shadow opacity.
@ BufferOpacity
Buffer opacity.
@ ShapeOpacity
Shape opacity.
@ FontSizeUnit
Font size units.
@ Italic
Use italic style.
@ PredefinedPositionOrder
@ FontWordSpacing
Word spacing.
@ MaskBufferSize
Mask buffer size.
@ MinimumScale
Minimum map scale (ie most "zoomed out")
@ FontBlendMode
Text blend mode.
@ MaximumScale
Maximum map scale (ie most "zoomed in")
@ MaskOpacity
Mask opacity.
@ PolygonLabelOutside
Whether labels outside a polygon feature are permitted, or should be forced (since QGIS 3....
@ FontCase
Label text case.
@ LinePlacementOptions
Line placement flags.
@ Vali
Vertical alignment for data defined label position (Bottom, Base, Half, Cap, Top)
@ FontOpacity
Text opacity.
const QgsTextFormat & format() const
Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
static const QgsPropertiesDefinition & propertyDefinitions()
Returns the labeling property definitions.
QgsStyle * styleAtPath(const QString &path)
Returns a reference to the style database associated with the project with matching file path.
static QgsProject * instance()
Returns the QgsProject singleton instance.
const QgsProjectStyleSettings * styleSettings() const
Returns the project's style settings, which contains settings and properties relating to how a QgsPro...
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
QgsProperty property(int key) const override
Returns a matching property from the collection, if one exists.
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
QSet< int > propertyKeys() const override
Returns a list of property keys contained within the collection.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
Definition for a property.
A store for object properties.
void setField(const QString &field)
Sets the field name the property references.
This class is a composition of two QSettings instances:
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
bool contains(const QString &key, QgsSettings::Section section=QgsSettings::NoSection) const
Returns true if there exists a setting called key; returns false otherwise.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
A collection of string replacements (specified using QgsStringReplacement objects).
a dialog for setting properties of a newly saved style.
bool isFavorite() const
Returns true if the favorite is checked for the symbol.
QString name() const
Returns the entered name for the new symbol.
void setDefaultTags(const QString &tags)
Sets the default tags for the newly created item.
QString tags() const
Returns any tags entered for the new symbol (as a comma separated value list).
QgsStyle * destinationStyle()
Returns the destination style database.
QgsTextFormat textFormat(const QString &name) const
Returns the text format with the specified name.
QStringList textFormatNames() const
Returns a list of names of text formats in the style.
bool removeTextFormat(const QString &name)
Removes a text format from the style.
StyleEntity
Enum for Entities involved in a style.
@ LabelSettingsEntity
Label settings.
@ TextFormatEntity
Text formats.
@ SmartgroupEntity
Smart groups.
@ Symbol3DEntity
3D symbol entity (since QGIS 3.14)
@ ColorrampEntity
Color ramps.
@ LegendPatchShapeEntity
Legend patch shape (since QGIS 3.14)
static QgsStyle * defaultStyle()
Returns default application-wide style.
QStringList labelSettingsNames() const
Returns a list of names of label settings in the style.
static QgsTextFormat defaultTextFormatForProject(QgsProject *project, QgsStyle::TextFormatContext context=QgsStyle::TextFormatContext::Labeling)
Returns the default text format to use for new text based objects for the specified project,...
bool addTextFormat(const QString &name, const QgsTextFormat &format, bool update=false)
Adds a text format with the specified name to the style.
QgsPalLayerSettings labelSettings(const QString &name) const
Returns the label settings with the specified name.
bool saveTextFormat(const QString &name, const QgsTextFormat &format, bool favorite, const QStringList &tags)
Adds a text format to the database.
A dialog which allows users to specify a list of substitutions to apply to a string,...
void containsParams(const QString &path, bool &hasFillParam, QColor &defaultFillColor, bool &hasStrokeParam, QColor &defaultStrokeColor, bool &hasStrokeWidthParam, double &defaultStrokeWidth, bool blocking=false) const
Tests if an SVG file contains parameters for fill, stroke color, stroke width.
static QString svgSymbolNameToPath(const QString &name, const QgsPathResolver &pathResolver)
Determines an SVG symbol's path from its name.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
QgsExpressionContext * expressionContext() const
Returns the expression context used for the widget, if set.
QgsMapCanvas * mapCanvas() const
Returns the map canvas associated with the widget.
QgsMessageBar * messageBar() const
Returns the message bar associated with the widget.
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
Container for settings relating to a text background object.
QgsMapUnitScale strokeWidthMapUnitScale() const
Returns the map unit scale object for the shape stroke width.
void setRadiiUnit(Qgis::RenderUnit units)
Sets the units used for the shape's radii.
void setFillSymbol(QgsFillSymbol *symbol)
Sets the current fill symbol for the background shape.
RotationType rotationType() const
Returns the method used for rotating the background shape.
QString svgFile() const
Returns the absolute path to the background SVG file, if set.
QSizeF size() const
Returns the size of the background shape.
QSizeF radii() const
Returns the radii used for rounding the corners of shapes.
QgsMapUnitScale radiiMapUnitScale() const
Returns the map unit scale object for the shape radii.
void setOpacity(double opacity)
Sets the background shape's opacity.
void setStrokeColor(const QColor &color)
Sets the color used for outlining the background shape.
Qgis::RenderUnit radiiUnit() const
Returns the units used for the shape's radii.
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the shape size.
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the background shape.
SizeType
Methods for determining the background shape size.
bool enabled() const
Returns whether the background is enabled.
double opacity() const
Returns the background shape's opacity.
void setStrokeWidthMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the shape stroke width.
double rotation() const
Returns the rotation for the background shape, in degrees clockwise.
QColor fillColor() const
Returns the color used for filing the background shape.
void setMarkerSymbol(QgsMarkerSymbol *symbol)
Sets the current marker symbol for the background shape.
void setRadii(QSizeF radii)
Sets the radii used for rounding the corners of shapes.
SizeType sizeType() const
Returns the method used to determine the size of the background shape (e.g., fixed size or buffer aro...
Qgis::RenderUnit strokeWidthUnit() const
Returns the units used for the shape's stroke width.
ShapeType type() const
Returns the type of background shape (e.g., square, ellipse, SVG).
double strokeWidth() const
Returns the width of the shape's stroke (stroke).
void setSizeType(SizeType type)
Sets the method used to determine the size of the background shape (e.g., fixed size or buffer around...
ShapeType
Background shape types.
@ ShapeMarkerSymbol
Marker symbol.
@ ShapeSquare
Square - buffered sizes only.
@ ShapeRectangle
Rectangle.
void setFillColor(const QColor &color)
Sets the color used for filing the background shape.
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the background shape.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units used for the shape's size.
Qgis::RenderUnit offsetUnit() const
Returns the units used for the shape's offset.
QColor strokeColor() const
Returns the color used for outlining the background shape.
void setRotationType(RotationType type)
Sets the method used for rotating the background shape.
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the shape offset.
QgsFillSymbol * fillSymbol() const
Returns the fill symbol to be rendered in the background.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the background shape.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the shape size.
void setType(ShapeType type)
Sets the type of background shape to draw (e.g., square, ellipse, SVG).
Qgis::RenderUnit sizeUnit() const
Returns the units used for the shape's size.
RotationType
Methods for determining the rotation of the background shape.
@ RotationSync
Shape rotation is synced with text rotation.
void setEnabled(bool enabled)
Sets whether the text background will be drawn.
QgsMarkerSymbol * markerSymbol() const
Returns the marker symbol to be rendered in the background.
void setRadiiMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the shape radii.
void setRotation(double rotation)
Sets the rotation for the background shape, in degrees clockwise.
void setStrokeWidthUnit(Qgis::RenderUnit units)
Sets the units used for the shape's stroke width.
void setOffsetUnit(Qgis::RenderUnit units)
Sets the units used for the shape's offset.
void setOffset(QPointF offset)
Sets the offset used for drawing the background shape.
void setSize(QSizeF size)
Sets the size of the background shape.
const QgsPaintEffect * paintEffect() const
Returns the current paint effect for the background shape.
void setSvgFile(const QString &file)
Sets the path to the background SVG file.
QgsMapUnitScale offsetMapUnitScale() const
Returns the map unit scale object for the shape offset.
void setStrokeWidth(double width)
Sets the width of the shape's stroke (stroke).
QPointF offset() const
Returns the offset used for drawing the background shape.
Container for settings relating to a text buffer.
void setFillBufferInterior(bool fill)
Sets whether the interior of the buffer will be filled in.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the buffer.
Qgis::RenderUnit sizeUnit() const
Returns the units for the buffer size.
Qt::PenJoinStyle joinStyle() const
Returns the buffer join style.
double size() const
Returns the size of the buffer.
void setColor(const QColor &color)
Sets the color for the buffer.
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the buffer size.
void setOpacity(double opacity)
Sets the buffer opacity.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
bool enabled() const
Returns whether the buffer is enabled.
double opacity() const
Returns the buffer opacity.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units used for the buffer size.
bool fillBufferInterior() const
Returns whether the interior of the buffer will be filled in.
void setEnabled(bool enabled)
Sets whether the text buffer will be drawn.
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the buffer.
const QgsPaintEffect * paintEffect() const
Returns the current paint effect for the buffer.
QColor color() const
Returns the color of the buffer.
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the buffer.
void setJoinStyle(Qt::PenJoinStyle style)
Sets the join style used for drawing the buffer.
void setSize(double size)
Sets the size of the buffer.
QgsTextFormatDialog(const QgsTextFormat &format, QgsMapCanvas *mapCanvas=nullptr, QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags, QgsVectorLayer *layer=nullptr)
Constructor for QgsTextFormatDialog.
QgsTextFormat format() const
Returns the current formatting settings defined by the widget.
QDialogButtonBox * buttonBox() const
Returns a reference to the dialog's button box.
void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the widget is shown, e.g., the associated map canvas and expression context...
void setFormat(const QgsTextFormat &format)
Sets the format to show in the widget.
void setDockMode(bool dockMode) override
Set the widget in dock mode which tells the widget to emit panel widgets and not open dialogs.
QgsTextFormat format() const
Returns the current formatting settings defined by the widget.
void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the widget is shown, e.g., the associated map canvas and expression context...
QgsTextFormatPanelWidget(const QgsTextFormat &format, QgsMapCanvas *mapCanvas=nullptr, QWidget *parent=nullptr, QgsVectorLayer *layer=nullptr)
Constructor for QgsTextFormatPanelWidget.
A widget for customizing text formatting settings.
void updatePlacementWidgets()
Updates label placement options to reflect current state of widget.
QButtonGroup * mUpsidedownBtnGrp
Upside down labels button group.
QgsTextFormatWidget(const QgsTextFormat &format=QgsTextFormat(), QgsMapCanvas *mapCanvas=nullptr, QWidget *parent=nullptr, QgsVectorLayer *layer=nullptr)
Constructor for QgsTextFormatWidget.
int mMinPixelLimit
Pixel size font limit.
void setDockMode(bool enabled)
Sets whether the widget should be shown in a compact dock mode.
QgsMapCanvas * mMapCanvas
Associated map canvas.
QgsSymbolWidgetContext context() const
Returns the context in which the widget is shown, e.g., the associated map canvas and expression cont...
~QgsTextFormatWidget() override
void deactivateField(QgsPalLayerSettings::Property key)
Deactivate a field from data defined properties and update the corresponding button.
void setFormat(const QgsTextFormat &format)
Sets the current formatting settings.
Qgis::GeometryType mGeomType
Geometry type for layer, if known.
QButtonGroup * mDirectSymbBtnGrp
Symbol direction button group.
void updateWidgetForFormat(const QgsTextFormat &format)
Updates the widget's state to reflect the settings in a QgsTextFormat.
QList< QgsSymbolLayerReference > mMaskedSymbolLayers
void widgetChanged()
Emitted when the text format defined by the widget changes.
void setPreviewBackground(const QColor &color)
Sets the background color for the text preview widget.
QButtonGroup * mQuadrantBtnGrp
Quadrant button group.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsSymbolWidgetContext mContext
Context in which widget is shown.
void updateLinePlacementOptions()
Updates line placement options to reflect current state of widget.
void populateDataDefinedButtons()
Sets up connections required for data defined buttons, or updates the existing definition of these bu...
virtual void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the widget is shown, e.g., the associated map canvas and expression context...
void updatePreview()
Updates the text preview.
void auxiliaryFieldCreated()
Emitted when an auxiliary field is created in the widget.
virtual void setFormatFromStyle(const QString &name, QgsStyle::StyleEntity type, const QString &stylePath)
Sets the current text settings from a style entry.
Qgis::GeometryType labelGeometryType() const
Returns the geometry type which will be used by the labeling engine when registering labels for the l...
QgsStringReplacementCollection mSubstitutions
Text substitution list.
@ Text
Default mode, show text formatting settings only.
@ Labeling
Show labeling settings in addition to text formatting settings.
virtual void saveFormat()
Saves the current text settings to a style entry.
QgsPropertyCollection mDataDefinedProperties
Data defined properties as defined in the widget.
QgsVectorLayer * mLayer
Associated vector layer.
Container for all settings relating to text rendering.
void setColor(const QColor &color)
Sets the color that text will be rendered in.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the text.
void setSize(double size)
Sets the size for rendered text.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the size.
void setCapitalization(Qgis::Capitalization capitalization)
Sets the text capitalization style.
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the format's property collection, used for data defined overrides.
void setOrientation(Qgis::TextOrientation orientation)
Sets the orientation for the text.
void setFont(const QFont &font)
Sets the font used for rendering text.
double lineHeight() const
Returns the line height for text.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units for the size of rendered text.
int stretchFactor() const
Returns the text's stretch factor.
QgsPropertyCollection & dataDefinedProperties()
Returns a reference to the format's property collection, used for data defined overrides.
void setStretchFactor(int factor)
Sets the text's stretch factor.
void setShadow(const QgsTextShadowSettings &shadowSettings)
Sets the text's drop shadow settings.
void setMask(const QgsTextMaskSettings &maskSettings)
Sets the text's masking settings.
bool fontFound() const
Returns true if the specified font was found on the system, or false if the font was not found and a ...
void setPreviewBackgroundColor(const QColor &color)
Sets the background color that text will be rendered on for previews.
void setOpacity(double opacity)
Sets the text's opacity.
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the text.
void setAllowHtmlFormatting(bool allow)
Sets whether text should be treated as a HTML document and HTML tags should be used for formatting th...
void setLineHeightUnit(Qgis::RenderUnit unit)
Sets the unit for the line height for text.
Qgis::RenderUnit lineHeightUnit() const
Returns the units for the line height for text.
Qgis::Capitalization capitalization() const
Returns the text capitalization style.
QString resolvedFontFamily() const
Returns the family for the resolved font, ie if the specified font was not found on the system this w...
QgsTextMaskSettings & mask()
Returns a reference to the masking settings.
bool isValid() const
Returns true if the format is valid.
void setBuffer(const QgsTextBufferSettings &bufferSettings)
Sets the text's buffer settings.
QgsTextBackgroundSettings & background()
Returns a reference to the text background settings.
Qgis::RenderUnit sizeUnit() const
Returns the units for the size of rendered text.
bool allowHtmlFormatting() const
Returns true if text should be treated as a HTML document and HTML tags should be used for formatting...
double opacity() const
Returns the text's opacity.
Qgis::TextOrientation orientation() const
Returns the orientation of the text.
QString namedStyle() const
Returns the named style for the font used for rendering text (e.g., "bold").
double size() const
Returns the size for rendered text.
QgsTextShadowSettings & shadow()
Returns a reference to the text drop shadow settings.
void setBackground(const QgsTextBackgroundSettings &backgroundSettings)
Sets the text's background settings.q.
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the size.
void setNamedStyle(const QString &style)
Sets the named style for the font used for rendering text.
QColor color() const
Returns the color that text will be rendered in.
QFont font() const
Returns the font used for rendering text.
QColor previewBackgroundColor() const
Returns the background color for text previews.
QgsTextBufferSettings & buffer()
Returns a reference to the text buffer settings.
void setLineHeight(double height)
Sets the line height for text.
Container for settings relating to a selective masking around a text.
void setEnabled(bool)
Returns whether the mask is enabled.
void setMaskedSymbolLayers(const QList< QgsSymbolLayerReference > &maskedLayers)
Sets the symbol layers that will be masked by this buffer.
Qgis::RenderUnit sizeUnit() const
Returns the units for the buffer size.
QList< QgsSymbolLayerReference > maskedSymbolLayers() const
Returns a list of references to symbol layers that are masked by this buffer.
void setSize(double size)
Sets the size of the buffer.
QgsMapUnitScale sizeMapUnitScale() const
Returns the map unit scale object for the buffer size.
double size() const
Returns the size of the buffer.
void setSizeMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the buffer size.
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the mask.
void setJoinStyle(Qt::PenJoinStyle style)
Sets the join style used for drawing the buffer.
double opacity() const
Returns the mask's opacity.
bool enabled() const
Returns whether the mask is enabled.
void setSizeUnit(Qgis::RenderUnit unit)
Sets the units used for the buffer size.
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the mask.
Qt::PenJoinStyle joinStyle() const
Returns the buffer join style.
void setOpacity(double opacity)
Sets the mask's opacity.
Container for settings relating to a text shadow.
int offsetAngle() const
Returns the angle for offsetting the position of the shadow from the text.
void setBlurRadiusMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the shadow blur radius.
void setBlurRadiusUnit(Qgis::RenderUnit units)
Sets the units used for the shadow's blur radius.
bool enabled() const
Returns whether the shadow is enabled.
void setOffsetUnit(Qgis::RenderUnit units)
Sets the units used for the shadow's offset.
int scale() const
Returns the scaling used for the drop shadow (in percentage of original size).
Qgis::RenderUnit offsetUnit() const
Returns the units used for the shadow's offset.
void setShadowPlacement(QgsTextShadowSettings::ShadowPlacement placement)
Sets the placement for the drop shadow.
double opacity() const
Returns the shadow's opacity.
QgsMapUnitScale blurRadiusMapUnitScale() const
Returns the map unit scale object for the shadow blur radius.
void setOffsetMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale object for the shadow offset distance.
void setBlendMode(QPainter::CompositionMode mode)
Sets the blending mode used for drawing the drop shadow.
void setColor(const QColor &color)
Sets the color for the drop shadow.
QColor color() const
Returns the color of the drop shadow.
void setOffsetGlobal(bool global)
Sets whether the global shadow offset should be used.
ShadowPlacement
Placement positions for text shadow.
@ ShadowBuffer
Draw shadow under buffer.
@ ShadowShape
Draw shadow under background shape.
@ ShadowLowest
Draw shadow below all text components.
@ ShadowText
Draw shadow under text.
void setScale(int scale)
Sets the scaling used for the drop shadow (in percentage of original size).
void setBlurAlphaOnly(bool alphaOnly)
Sets whether only the alpha channel for the shadow should be blurred.
QgsTextShadowSettings::ShadowPlacement shadowPlacement() const
Returns the placement for the drop shadow.
Qgis::RenderUnit blurRadiusUnit() const
Returns the units used for the shadow's blur radius.
double offsetDistance() const
Returns the distance for offsetting the position of the shadow from the text.
QPainter::CompositionMode blendMode() const
Returns the blending mode used for drawing the drop shadow.
void setOffsetDistance(double distance)
Sets the distance for offsetting the position of the shadow from the text.
void setOpacity(double opacity)
Sets the shadow's opacity.
QgsMapUnitScale offsetMapUnitScale() const
Returns the map unit scale object for the shadow offset distance.
bool blurAlphaOnly() const
Returns whether only the alpha channel for the shadow will be blurred.
bool offsetGlobal() const
Returns true if the global shadow offset will be used.
void setOffsetAngle(int angle)
Sets the angle for offsetting the position of the shadow from the text.
double blurRadius() const
Returns the blur radius for the shadow.
void setBlurRadius(double blurRadius)
Sets the blur radius for the shadow.
void setEnabled(bool enabled)
Sets whether the text shadow will be drawn.
QList< Qgis::RenderUnit > RenderUnitList
List of render units.
Represents a vector layer which manages a vector based data sets.
QgsAuxiliaryLayer * auxiliaryLayer()
Returns the current auxiliary layer.
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
int scaleIconSize(int standardSize)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.