37 #include <QButtonGroup>
38 #include <QMessageBox>
68 if ( !abstractMetadata )
70 QgsDebugMsg( QStringLiteral(
"Failed to find callout entry in registry: %1" ).arg( name ) );
76 QgsDebugMsg( QStringLiteral(
"Failed to cast callout's metadata: " ) .arg( name ) );
83 void QgsLabelingGui::initCalloutWidgets()
85 _initCalloutWidgetFunction( QStringLiteral(
"simple" ), QgsSimpleLineCalloutWidget::create );
86 _initCalloutWidgetFunction( QStringLiteral(
"manhattan" ), QgsManhattanLineCalloutWidget::create );
89 void QgsLabelingGui::updateCalloutWidget(
QgsCallout *callout )
93 mCalloutStackedWidget->setCurrentWidget( pageDummy );
97 if ( mCalloutStackedWidget->currentWidget() != pageDummy )
100 if (
QgsCalloutWidget *pew = qobject_cast< QgsCalloutWidget * >( mCalloutStackedWidget->currentWidget() ) )
111 if ( mGeometryGeneratorGroupBox->isChecked() )
114 geometryType = mLayer->geometryType();
115 w->setGeometryType( geometryType );
116 w->setCallout( callout );
118 w->setContext( context() );
119 mCalloutStackedWidget->addWidget( w );
120 mCalloutStackedWidget->setCurrentWidget( w );
127 mCalloutStackedWidget->setCurrentWidget( pageDummy );
130 void QgsLabelingGui::showObstacleSettings()
144 auto applySettings = [ = ]
146 mObstacleSettings = widget->
settings();
149 emit widgetChanged();
165 dialog.buttonBox()->addButton( QDialogButtonBox::Help );
166 connect( dialog.buttonBox(), &QDialogButtonBox::helpRequested,
this, [ = ]
168 QgsHelp::openHelp( QStringLiteral(
"style_library/label_settings.html#obstacles" ) );
180 void QgsLabelingGui::showLineAnchorSettings()
194 auto applySettings = [ = ]
198 mLineSettings.setAnchorType( widgetSettings.
anchorType() );
201 emit widgetChanged();
227 , mSettings( layerSettings )
229 , mCanvas( mapCanvas )
231 mGeomType = geomType;
232 static std::once_flag initialized;
233 std::call_once( initialized, [ = ]( )
235 initCalloutWidgets();
244 connect( mBufferDrawChkBx, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
245 connect( mEnableMaskChkBx, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
246 connect( mShapeDrawChkBx, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
247 connect( mCalloutsDrawCheckBox, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
248 connect( mShadowDrawChkBx, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
249 connect( mDirectSymbChkBx, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
250 connect( mFormatNumChkBx, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
251 connect( mScaleBasedVisibilityChkBx, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
252 connect( mFontLimitPixelChkBox, &QAbstractButton::toggled,
this, &QgsLabelingGui::updateUi );
253 connect( mGeometryGeneratorGroupBox, &QGroupBox::toggled,
this, &QgsLabelingGui::updateGeometryTypeBasedWidgets );
254 connect( mGeometryGeneratorType, qgis::overload<int>::of( &QComboBox::currentIndexChanged ),
this, &QgsLabelingGui::updateGeometryTypeBasedWidgets );
255 connect( mGeometryGeneratorExpressionButton, &QToolButton::clicked,
this, &QgsLabelingGui::showGeometryGeneratorExpressionBuilder );
256 connect( mGeometryGeneratorGroupBox, &QGroupBox::toggled,
this, &QgsLabelingGui::validateGeometryGeneratorExpression );
257 connect( mGeometryGenerator, &QgsCodeEditorExpression::textChanged,
this, &QgsLabelingGui::validateGeometryGeneratorExpression );
258 connect( mGeometryGeneratorType, qgis::overload<int>::of( &QComboBox::currentIndexChanged ),
this, &QgsLabelingGui::validateGeometryGeneratorExpression );
259 connect( mObstacleSettingsButton, &QAbstractButton::clicked,
this, &QgsLabelingGui::showObstacleSettings );
260 connect( mLineAnchorSettingsButton, &QAbstractButton::clicked,
this, &QgsLabelingGui::showLineAnchorSettings );
262 mFieldExpressionWidget->registerExpressionContextGenerator(
this );
264 mMinScaleWidget->setMapCanvas( mCanvas );
265 mMinScaleWidget->setShowCurrentScaleButton(
true );
266 mMaxScaleWidget->setMapCanvas( mCanvas );
267 mMaxScaleWidget->setShowCurrentScaleButton(
true );
270 for (
const QString &type : calloutTypes )
276 mGeometryGeneratorWarningLabel->setStyleSheet( QStringLiteral(
"color: #FFC107;" ) );
277 mGeometryGeneratorWarningLabel->setTextInteractionFlags( Qt::TextBrowserInteraction );
278 connect( mGeometryGeneratorWarningLabel, &QLabel::linkActivated,
this, [
this](
const QString & link )
280 if ( link == QLatin1String(
"#determineGeometryGeneratorType" ) )
281 determineGeometryGeneratorType();
284 connect( mCalloutStyleComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsLabelingGui::calloutTypeChanged );
286 mLblNoObstacle1->installEventFilter(
this );
291 void QgsLabelingGui::setLayer(
QgsMapLayer *mapLayer )
306 mTextFormatsListWidget->setLayerType( mLayer ? mLayer->geometryType() : mGeomType );
307 mBackgroundSymbolButton->setLayer( mLayer );
310 updateGeometryTypeBasedWidgets();
312 mFieldExpressionWidget->setLayer( mLayer );
317 mFieldExpressionWidget->setGeomCalculator( da );
319 mFieldExpressionWidget->setEnabled( mMode == Labels || !mLayer );
320 mLabelingFrame->setEnabled( mMode == Labels || !mLayer );
322 blockInitSignals(
true );
324 mGeometryGenerator->setText( mSettings.geometryGenerator );
325 mGeometryGeneratorGroupBox->setChecked( mSettings.geometryGeneratorEnabled );
326 if ( !mSettings.geometryGeneratorEnabled )
327 mGeometryGeneratorGroupBox->setCollapsed(
true );
328 mGeometryGeneratorType->setCurrentIndex( mGeometryGeneratorType->findData( mSettings.geometryGeneratorType ) );
330 updateWidgetForFormat( mSettings.format() );
332 mFieldExpressionWidget->setRow( -1 );
333 mFieldExpressionWidget->setField( mSettings.fieldName );
334 mCheckBoxSubstituteText->setChecked( mSettings.useSubstitutions );
335 mSubstitutions = mSettings.substitutions;
338 mCentroidRadioWhole->setChecked( mSettings.centroidWhole );
339 mCentroidInsideCheckBox->setChecked( mSettings.centroidInside );
340 mFitInsidePolygonCheckBox->setChecked( mSettings.fitInPolygonOnly );
341 mLineDistanceSpnBx->setValue( mSettings.dist );
342 mLineDistanceUnitWidget->setUnit( mSettings.distUnits );
343 mLineDistanceUnitWidget->setMapUnitScale( mSettings.distMapUnitScale );
344 mOffsetTypeComboBox->setCurrentIndex( mOffsetTypeComboBox->findData( mSettings.offsetType ) );
345 mQuadrantBtnGrp->button(
static_cast<int>( mSettings.quadOffset ) )->setChecked(
true );
346 mPointOffsetXSpinBox->setValue( mSettings.xOffset );
347 mPointOffsetYSpinBox->setValue( mSettings.yOffset );
348 mPointOffsetUnitWidget->setUnit( mSettings.offsetUnits );
349 mPointOffsetUnitWidget->setMapUnitScale( mSettings.labelOffsetMapUnitScale );
350 mPointAngleSpinBox->setValue( mSettings.angleOffset );
351 chkLineAbove->setChecked( mSettings.lineSettings().placementFlags() & QgsLabeling::LinePlacementFlag::AboveLine );
352 chkLineBelow->setChecked( mSettings.lineSettings().placementFlags() & QgsLabeling::LinePlacementFlag::BelowLine );
353 chkLineOn->setChecked( mSettings.lineSettings().placementFlags() & QgsLabeling::LinePlacementFlag::OnLine );
354 chkLineOrientationDependent->setChecked( !( mSettings.lineSettings().placementFlags() & QgsLabeling::LinePlacementFlag::MapOrientation ) );
356 mCheckAllowLabelsOutsidePolygons->setChecked( mSettings.polygonPlacementFlags() & QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon );
358 const int placementIndex = mPlacementModeComboBox->findData( mSettings.placement );
359 if ( placementIndex >= 0 )
361 mPlacementModeComboBox->setCurrentIndex( placementIndex );
366 mPlacementModeComboBox->setCurrentIndex( 0 );
370 mRepeatDistanceSpinBox->setValue( mSettings.repeatDistance );
371 mRepeatDistanceUnitWidget->setUnit( mSettings.repeatDistanceUnit );
372 mRepeatDistanceUnitWidget->setMapUnitScale( mSettings.repeatDistanceMapUnitScale );
374 mOverrunDistanceSpinBox->setValue( mSettings.lineSettings().overrunDistance() );
375 mOverrunDistanceUnitWidget->setUnit( mSettings.lineSettings().overrunDistanceUnit() );
376 mOverrunDistanceUnitWidget->setMapUnitScale( mSettings.lineSettings().overrunDistanceMapUnitScale() );
378 mPrioritySlider->setValue( mSettings.priority );
379 mChkNoObstacle->setChecked( mSettings.obstacleSettings().isObstacle() );
381 mObstacleSettings = mSettings.obstacleSettings();
382 mLineSettings = mSettings.lineSettings();
384 chkLabelPerFeaturePart->setChecked( mSettings.labelPerPart );
385 mPalShowAllLabelsForLayerChkBx->setChecked( mSettings.displayAll );
386 chkMergeLines->setChecked( mSettings.lineSettings().mergeLines() );
387 mMinSizeSpinBox->setValue( mSettings.thinningSettings().minimumFeatureSize() );
388 mLimitLabelChkBox->setChecked( mSettings.thinningSettings().limitNumberOfLabelsEnabled() );
389 mLimitLabelSpinBox->setValue( mSettings.thinningSettings().maximumNumberLabels() );
392 mDirectSymbChkBx->setChecked( mSettings.lineSettings().addDirectionSymbol() );
393 mDirectSymbLeftLineEdit->setText( mSettings.lineSettings().leftDirectionSymbol() );
394 mDirectSymbRightLineEdit->setText( mSettings.lineSettings().rightDirectionSymbol() );
395 mDirectSymbRevChkBx->setChecked( mSettings.lineSettings().reverseDirectionSymbol() );
397 mDirectSymbBtnGrp->button(
static_cast<int>( mSettings.lineSettings().directionSymbolPlacement() ) )->setChecked(
true );
398 mUpsidedownBtnGrp->button(
static_cast<int>( mSettings.upsidedownLabels ) )->setChecked(
true );
401 mMaxCharAngleInDSpinBox->setValue( mSettings.maxCurvedCharAngleIn );
403 mMaxCharAngleOutDSpinBox->setValue( std::fabs( mSettings.maxCurvedCharAngleOut ) );
405 wrapCharacterEdit->setText( mSettings.wrapChar );
406 mAutoWrapLengthSpinBox->setValue( mSettings.autoWrapLength );
407 mAutoWrapTypeComboBox->setCurrentIndex( mSettings.useMaxLineLengthForAutoWrap ? 0 : 1 );
409 if ( mFontMultiLineAlignComboBox->findData( mSettings.multilineAlign ) != -1 )
411 mFontMultiLineAlignComboBox->setCurrentIndex( mFontMultiLineAlignComboBox->findData( mSettings.multilineAlign ) );
417 mFontMultiLineAlignComboBox->setCurrentIndex( 0 );
420 chkPreserveRotation->setChecked( mSettings.preserveRotation );
422 mScaleBasedVisibilityChkBx->setChecked( mSettings.scaleVisibility );
423 mMinScaleWidget->setScale( mSettings.minimumScale );
424 mMaxScaleWidget->setScale( mSettings.maximumScale );
426 mFormatNumChkBx->setChecked( mSettings.formatNumbers );
427 mFormatNumDecimalsSpnBx->setValue( mSettings.decimals );
428 mFormatNumPlusSignChkBx->setChecked( mSettings.plusSign );
432 mFontLimitPixelChkBox->setChecked( mSettings.fontLimitPixelSize );
433 mMinPixelLimit = mSettings.fontMinPixelSize;
434 mFontMinPixelSpinBox->setValue( mSettings.fontMinPixelSize == 0 ? 3 : mSettings.fontMinPixelSize );
435 mFontMaxPixelSpinBox->setValue( mSettings.fontMaxPixelSize );
437 mZIndexSpinBox->setValue( mSettings.zIndex );
439 mDataDefinedProperties = mSettings.dataDefinedProperties();
442 if (
auto *lCallout = mSettings.callout() )
444 whileBlocking( mCalloutsDrawCheckBox )->setChecked( lCallout->enabled() );
445 whileBlocking( mCalloutStyleComboBox )->setCurrentIndex( mCalloutStyleComboBox->findData( lCallout->type() ) );
446 updateCalloutWidget( lCallout );
451 whileBlocking( mCalloutStyleComboBox )->setCurrentIndex( mCalloutStyleComboBox->findData( defaultCallout->type() ) );
453 updateCalloutWidget( defaultCallout.get() );
456 updatePlacementWidgets();
457 updateLinePlacementOptions();
460 blockInitSignals(
false );
464 populateDataDefinedButtons();
466 enableDataDefinedAlignment( mCoordXDDBtn->isActive() && mCoordYDDBtn->isActive() );
472 mSettings = settings;
476 void QgsLabelingGui::blockInitSignals(
bool block )
478 chkLineAbove->blockSignals( block );
479 chkLineBelow->blockSignals( block );
480 mPlacementModeComboBox->blockSignals( block );
483 void QgsLabelingGui::setLabelMode( LabelMode mode )
486 mFieldExpressionWidget->setEnabled( mMode == Labels );
487 mLabelingFrame->setEnabled( mMode == Labels );
494 lyr.
drawLabels = ( mMode == Labels ) || !mLayer;
497 lyr.
fieldName = mFieldExpressionWidget->currentField( &isExpression );
502 QgsLabeling::PolygonPlacementFlags polygonPlacementFlags = QgsLabeling::PolygonPlacementFlag::AllowPlacementInsideOfPolygon;
503 if ( mCheckAllowLabelsOutsidePolygons->isChecked() )
504 polygonPlacementFlags |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
510 lyr.
dist = mLineDistanceSpnBx->value();
511 lyr.
distUnits = mLineDistanceUnitWidget->unit();
514 if ( mQuadrantBtnGrp )
518 lyr.
xOffset = mPointOffsetXSpinBox->value();
519 lyr.
yOffset = mPointOffsetYSpinBox->value();
524 QgsLabeling::LinePlacementFlags linePlacementFlags = QgsLabeling::LinePlacementFlags();
525 if ( chkLineAbove->isChecked() )
526 linePlacementFlags |= QgsLabeling::LinePlacementFlag::AboveLine;
527 if ( chkLineBelow->isChecked() )
528 linePlacementFlags |= QgsLabeling::LinePlacementFlag::BelowLine;
529 if ( chkLineOn->isChecked() )
530 linePlacementFlags |= QgsLabeling::LinePlacementFlag::OnLine;
531 if ( ! chkLineOrientationDependent->isChecked() )
532 linePlacementFlags |= QgsLabeling::LinePlacementFlag::MapOrientation;
545 lyr.
priority = mPrioritySlider->value();
547 mObstacleSettings.setIsObstacle( mChkNoObstacle->isChecked() || mMode == ObstaclesOnly );
554 lyr.
displayAll = mPalShowAllLabelsForLayerChkBx->isChecked();
567 lyr.
decimals = mFormatNumDecimalsSpnBx->value();
568 lyr.
plusSign = mFormatNumPlusSignChkBx->isChecked();
575 if ( mDirectSymbBtnGrp )
579 if ( mUpsidedownBtnGrp )
595 lyr.
wrapChar = wrapCharacterEdit->text();
604 lyr.
layerType = mLayer ? mLayer->geometryType() : mGeomType;
606 lyr.
zIndex = mZIndexSpinBox->value();
611 const QString calloutType = mCalloutStyleComboBox->currentData().toString();
612 std::unique_ptr< QgsCallout > callout;
613 if (
QgsCalloutWidget *pew = qobject_cast< QgsCalloutWidget * >( mCalloutStackedWidget->currentWidget() ) )
615 callout.reset( pew->callout()->clone() );
620 callout->
setEnabled( mCalloutsDrawCheckBox->isChecked() );
628 if ( ddBtn->
isActive() && !chkBx->isChecked() )
630 chkBx->setChecked(
true );
632 f->setEnabled( chkBx->isChecked() );
635 bool QgsLabelingGui::eventFilter( QObject *
object, QEvent *event )
637 if (
object == mLblNoObstacle1 )
639 if ( event->type() == QEvent::MouseButtonPress &&
dynamic_cast< QMouseEvent *
>( event )->button() == Qt::LeftButton )
642 mChkNoObstacle->setChecked( !mChkNoObstacle->isChecked() );
647 return QgsTextFormatWidget::eventFilter(
object, event );
650 void QgsLabelingGui::updateUi()
654 syncDefinedCheckboxFrame( mBufferDrawDDBtn, mBufferDrawChkBx, mBufferFrame );
655 syncDefinedCheckboxFrame( mEnableMaskDDBtn, mEnableMaskChkBx, mMaskFrame );
656 syncDefinedCheckboxFrame( mShapeDrawDDBtn, mShapeDrawChkBx, mShapeFrame );
657 syncDefinedCheckboxFrame( mShadowDrawDDBtn, mShadowDrawChkBx, mShadowFrame );
658 syncDefinedCheckboxFrame( mCalloutDrawDDBtn, mCalloutsDrawCheckBox, mCalloutFrame );
660 syncDefinedCheckboxFrame( mDirectSymbDDBtn, mDirectSymbChkBx, mDirectSymbFrame );
661 syncDefinedCheckboxFrame( mFormatNumDDBtn, mFormatNumChkBx, mFormatNumFrame );
662 syncDefinedCheckboxFrame( mScaleBasedVisibilityDDBtn, mScaleBasedVisibilityChkBx, mScaleBasedVisibilityFrame );
663 syncDefinedCheckboxFrame( mFontLimitPixelDDBtn, mFontLimitPixelChkBox, mFontLimitPixelFrame );
665 chkMergeLines->setEnabled( !mDirectSymbChkBx->isChecked() );
666 if ( mDirectSymbChkBx->isChecked() )
668 chkMergeLines->setToolTip( tr(
"This option is not compatible with line direction symbols." ) );
672 chkMergeLines->setToolTip( QString() );
702 settings.
fieldName = mFieldExpressionWidget->currentField( &isExpression );
705 setSettings( settings );
713 if (
QgsCalloutWidget *cw = qobject_cast< QgsCalloutWidget * >( mCalloutStackedWidget->currentWidget() ) )
715 cw->setContext( context );
720 void QgsLabelingGui::saveFormat()
727 saveDlg.setDefaultTags( mTextFormatsListWidget->currentTagFilter() );
728 if ( !saveDlg.exec() )
731 if ( saveDlg.name().isEmpty() )
734 switch ( saveDlg.selectedType() )
741 int res = QMessageBox::warning(
this, tr(
"Save Text Format" ),
742 tr(
"Format with name '%1' already exists. Overwrite?" )
743 .arg( saveDlg.name() ),
744 QMessageBox::Yes | QMessageBox::No );
745 if ( res != QMessageBox::Yes )
751 QStringList symbolTags = saveDlg.tags().split(
',' );
755 style->
saveTextFormat( saveDlg.name(), newFormat, saveDlg.isFavorite(), symbolTags );
764 int res = QMessageBox::warning(
this, tr(
"Save Label Settings" ),
765 tr(
"Label settings with the name '%1' already exist. Overwrite?" )
766 .arg( saveDlg.name() ),
767 QMessageBox::Yes | QMessageBox::No );
768 if ( res != QMessageBox::Yes )
774 QStringList symbolTags = saveDlg.tags().split(
',' );
778 style->
saveLabelSettings( saveDlg.name(), newSettings, saveDlg.isFavorite(), symbolTags );
792 void QgsLabelingGui::updateGeometryTypeBasedWidgets()
796 if ( mGeometryGeneratorGroupBox->isChecked() )
799 geometryType = mLayer->geometryType();
809 mPlacementModeComboBox->clear();
811 switch ( geometryType )
838 qFatal(
"unknown geometry type unexpected" );
841 if ( mPlacementModeComboBox->findData( prevPlacement ) != -1 )
843 mPlacementModeComboBox->setCurrentIndex( mPlacementModeComboBox->findData( prevPlacement ) );
856 mFontMultiLineAlignComboBox->removeItem( idx );
859 updatePlacementWidgets();
860 updateLinePlacementOptions();
863 void QgsLabelingGui::showGeometryGeneratorExpressionBuilder()
867 expressionBuilder.setExpressionText( mGeometryGenerator->text() );
868 expressionBuilder.setExpressionContext( createExpressionContext() );
870 if ( expressionBuilder.exec() )
872 mGeometryGenerator->setText( expressionBuilder.expressionText() );
876 void QgsLabelingGui::validateGeometryGeneratorExpression()
880 if ( mGeometryGeneratorGroupBox->isChecked() )
882 if ( !mPreviewFeature.isValid() && mLayer )
883 mLayer->getFeatures(
QgsFeatureRequest().setLimit( 1 ) ).nextFeature( mPreviewFeature );
889 expression.prepare( &context );
891 if ( expression.hasParserError() )
893 mGeometryGeneratorWarningLabel->setText( expression.parserErrorString() );
898 const QVariant result = expression.evaluate( &context );
903 mGeometryGeneratorWarningLabel->setText( tr(
"Result of the expression is not a geometry" ) );
906 else if ( geometry.
type() != configuredGeometryType )
908 mGeometryGeneratorWarningLabel->setText( QStringLiteral(
"<p>%1</p><p><a href=\"#determineGeometryGeneratorType\">%2</a></p>" ).arg(
909 tr(
"Result of the expression does not match configured geometry type." ),
918 QTimer *timer =
new QTimer();
919 connect( timer, &QTimer::timeout,
this, [
this, valid]()
921 mGeometryGeneratorWarningLabel->setVisible( !valid );
923 connect( timer, &QTimer::timeout, timer, &QTimer::deleteLater );
927 void QgsLabelingGui::determineGeometryGeneratorType()
929 if ( !mPreviewFeature.isValid() && mLayer )
930 mLayer->getFeatures(
QgsFeatureRequest().setLimit( 1 ) ).nextFeature( mPreviewFeature );
936 expression.prepare( &context );
939 mGeometryGeneratorType->setCurrentIndex( mGeometryGeneratorType->findData( geometry.
type() ) );
942 void QgsLabelingGui::calloutTypeChanged()
944 QString newCalloutType = mCalloutStyleComboBox->currentData().toString();
945 QgsCalloutWidget *pew = qobject_cast< QgsCalloutWidget * >( mCalloutStackedWidget->currentWidget() );
964 updateCalloutWidget( newCallout.get() );
977 QVBoxLayout *vLayout =
new QVBoxLayout();
978 mWidget =
new QgsLabelingGui( layer, mapCanvas, settings,
nullptr, geomType );
979 vLayout->addWidget( mWidget );
980 mButtonBox =
new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok, Qt::Horizontal );
981 connect( mButtonBox, &QDialogButtonBox::accepted,
this, &QDialog::accept );
982 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QDialog::reject );
983 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsLabelSettingsDialog::showHelp );
984 vLayout->addWidget( mButtonBox );
985 setLayout( vLayout );
986 setWindowTitle( tr(
"Label Settings" ) );
989 QDialogButtonBox *QgsLabelSettingsDialog::buttonBox()
const
994 void QgsLabelSettingsDialog::showHelp()
static QgsCalloutRegistry * calloutRegistry()
Returns the application's callout registry, used for managing callout types.
Registry of available callout classes.
QgsCalloutAbstractMetadata * calloutMetadata(const QString &type) const
Returns the metadata for specified the specified callout type.
QStringList calloutTypes() const
Returns a list of all available callout types.
QgsCallout * createCallout(const QString &type, const QVariantMap &properties=QVariantMap(), const QgsReadWriteContext &context=QgsReadWriteContext()) const
Creates a new instance of a callout, given the callout type and properties.
Abstract base class for callout renderers.
void setEnabled(bool enabled)
Sets whether the callout is enabled.
virtual QString type() const =0
Returns a unique string representing the callout type.
virtual QVariantMap properties(const QgsReadWriteContext &context) const
Returns the properties describing the callout encoded in a string format.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
A generic dialog for building expression strings.
Single scope for storing variables and functions for use within a QgsExpressionContext.
static QgsExpressionContextScope * updateSymbolScope(const QgsSymbol *symbol, QgsExpressionContextScope *symbolScope=nullptr)
Updates a symbol scope related to a QgsSymbol to an expression context.
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.
static const QString EXPR_SYMBOL_COLOR
Inbuilt variable name for symbol color variable.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for 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.
Class for parsing and evaluation of expressions (formerly called "search strings").
This class wraps a request for features to a vector layer (or directly its vector data provider).
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
A geometry is the spatial representation of a feature.
QgsWkbTypes::GeometryType type
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Contains settings related to how the label engine places and formats labels for line features (or pol...
void setPlacementFlags(QgsLabeling::LinePlacementFlags flags)
Returns the line placement flags, which dictate how line labels can be placed above or below the line...
void setLineAnchorPercent(double percent)
Sets the percent along the line at which labels should be placed.
void setDirectionSymbolPlacement(DirectionSymbolPlacement placement)
Sets the placement for direction symbols.
AnchorType anchorType() const
Returns the line anchor type, which dictates how the lineAnchorPercent() setting is handled.
void setLeftDirectionSymbol(const QString &symbol)
Sets the string to use for left direction arrows.
void setMergeLines(bool merge)
Sets whether connected line features with identical label text should be merged prior to generating l...
DirectionSymbolPlacement
Placement options for direction symbols.
void setRightDirectionSymbol(const QString &symbol)
Sets the string to use for right direction arrows.
void setOverrunDistanceMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for label overrun distance.
double lineAnchorPercent() const
Returns the percent along the line at which labels should be placed.
void setAnchorType(AnchorType type)
Sets the line anchor type, which dictates how the lineAnchorPercent() setting is handled.
void setOverrunDistance(double distance)
Sets the distance which labels are allowed to overrun past the start or end of line features.
void setOverrunDistanceUnit(const QgsUnitTypes::RenderUnit &unit)
Sets the unit for label overrun distance.
void setReverseDirectionSymbol(bool reversed)
Sets whether the direction symbols should be reversed.
void setAddDirectionSymbol(bool enabled)
Sets whether '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) will...
void setMaximumNumberLabels(int number)
Sets the maximum number of labels which should be drawn for this layer.
void setLimitNumberLabelsEnabled(bool enabled)
Sets whether the the number of labels drawn for the layer should be limited.
void setMinimumFeatureSize(double size)
Sets the minimum feature size (in millimeters) for a feature to be labelled.
Map canvas is a class for displaying all GIS data types on a canvas.
Base class for all map layer types.
Contains settings for how a map layer will be labeled.
bool fitInPolygonOnly
true if only labels which completely fit within a polygon are allowed.
double yOffset
Vertical offset of label.
QgsMapUnitScale labelOffsetMapUnitScale
Map unit scale for label offset.
int fontMaxPixelSize
Maximum pixel size for showing rendered map unit labels (1 - 10000).
void setObstacleSettings(const QgsLabelObstacleSettings &settings)
Sets the label obstacle settings.
double maxCurvedCharAngleIn
Maximum angle between inside curved label characters (valid range 20.0 to 60.0).
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
double zIndex
Z-Index of label, where labels with a higher z-index are rendered on top of labels with a lower z-ind...
bool displayAll
If true, all features will be labelled even when overlaps occur.
QString wrapChar
Wrapping character string.
double xOffset
Horizontal offset of label.
bool drawLabels
Whether to draw labels for this layer.
bool fontLimitPixelSize
true if label sizes should be limited by pixel size.
QuadrantPosition quadOffset
Sets the quadrant in which to offset labels from feature.
double minimumScale
The minimum map scale (i.e.
QgsWkbTypes::GeometryType geometryGeneratorType
The type of the result geometry of the geometry generator.
QgsUnitTypes::RenderUnit offsetUnits
Units for offsets of label.
bool scaleVisibility
Set to true to limit label visibility to a range of scales.
double repeatDistance
Distance for repeating labels for a single feature.
bool geometryGeneratorEnabled
Defines if the geometry generator is enabled or not. If disabled, the standard geometry will be taken...
Placement
Placement modes which determine how label candidates are generated for a feature.
@ PerimeterCurved
Arranges candidates following the curvature of a polygon's boundary. Applies to polygon layers only.
@ Curved
Arranges candidates following the curvature of a line feature. Applies to line layers only.
@ Horizontal
Arranges horizontal candidates scattered throughout a polygon feature. Applies to polygon layers only...
@ Free
Arranges candidates scattered throughout a polygon feature. Candidates are rotated to respect the pol...
@ OverPoint
Arranges candidates over a point (or centroid of a polygon), or at a preset offset from the point....
@ 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'...
@ OrderedPositionsAroundPoint
Candidates are placed in predefined positions around a point. Preference is given to positions with g...
@ OutsidePolygons
Candidates are placed outside of polygon boundaries. Applies to polygon layers only....
bool centroidInside
true if centroid positioned labels must be placed inside their corresponding feature polygon,...
int priority
Label priority.
bool labelPerPart
true if every part of a multi-part feature should be labeled.
QgsUnitTypes::RenderUnit distUnits
Units the distance from feature to the label.
QgsUnitTypes::RenderUnit repeatDistanceUnit
Units for repeating labels for a single feature.
OffsetType offsetType
Offset type for layer (only applies in certain placement modes)
MultiLineAlign multilineAlign
Horizontal alignment of multi-line labels.
int fontMinPixelSize
Minimum pixel size for showing rendered map unit labels (1 - 1000).
double angleOffset
Label rotation, in degrees clockwise.
double maxCurvedCharAngleOut
Maximum angle between outside curved label characters (valid range -20.0 to -95.0)
const QgsLabelLineSettings & lineSettings() const
Returns the label line settings, which contain settings related to how the label engine places and fo...
void setPolygonPlacementFlags(QgsLabeling::PolygonPlacementFlags flags)
Sets the polygon placement flags, which dictate how polygon labels can be placed.
OffsetType
Behavior modifier for label offset and distance, only applies in some label placement modes.
void setDataDefinedProperties(const QgsPropertyCollection &collection)
Sets the label's property collection, used for data defined overrides.
bool isExpression
true if this label is made from a expression string, e.g., FieldName || 'mm'
bool preserveRotation
True if label rotation should be preserved during label pin/unpin operations.
bool plusSign
Whether '+' signs should be prepended to positive numeric labels.
QString geometryGenerator
The geometry generator expression. Null if disabled.
QgsMapUnitScale distMapUnitScale
Map unit scale for label feature distance.
QgsStringReplacementCollection substitutions
Substitution collection for automatic text substitution with labels.
int decimals
Number of decimal places to show for numeric labels.
double dist
Distance from feature to the label.
QgsMapUnitScale repeatDistanceMapUnitScale
Map unit scale for repeating labels for a single feature.
bool centroidWhole
true if feature centroid should be calculated from the whole feature, or false if only the visible pa...
UpsideDownLabels upsidedownLabels
Controls whether upside down labels are displayed and how they are handled.
QString fieldName
Name of field (or an expression) to use for label text.
bool formatNumbers
Set to true to format numeric label text as numbers (e.g.
QgsWkbTypes::GeometryType layerType
Geometry type of layers associated with these settings.
void setCallout(QgsCallout *callout)
Sets the label callout renderer, responsible for drawing label callouts.
double maximumScale
The maximum map scale (i.e.
int autoWrapLength
If non-zero, indicates that label text should be automatically wrapped to (ideally) the specified num...
bool useMaxLineLengthForAutoWrap
If true, indicates that when auto wrapping label text the autoWrapLength length indicates the maximum...
const QgsLabelThinningSettings & thinningSettings() const
Returns the label thinning settings.
bool useSubstitutions
True if substitutions should be applied.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsCoordinateTransformContext transformContext
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
The class is used as a container of context for various read/write operations on other objects.
a dialog for setting properties of a newly saved style.
bool removeLabelSettings(const QString &name)
Removes label settings from the style.
bool saveLabelSettings(const QString &name, const QgsPalLayerSettings &settings, bool favorite, const QStringList &tags)
Adds label settings to the database.
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.
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.
bool addLabelSettings(const QString &name, const QgsPalLayerSettings &settings, bool update=false)
Adds label settings with the specified name to the style.
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the widget.
void setExpressionContext(QgsExpressionContext *context)
Sets the optional expression context used for the widget.
A widget for customizing text formatting settings.
virtual void setFormatFromStyle(const QString &name, QgsStyle::StyleEntity type)
Sets the current text settings from a style entry.
virtual void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the widget is shown, e.g., the associated map canvas and expression context...
Container for all settings relating to text rendering.
Represents a vector layer which manages a vector based data sets.
static QString geometryDisplayString(GeometryType type) SIP_HOLDGIL
Returns a display string for a geometry type.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
QgsCalloutWidget *(* QgsCalloutWidgetFunc)(QgsVectorLayer *)