36#include <QButtonGroup> 
   75  if ( !abstractMetadata )
 
   77    QgsDebugError( QStringLiteral( 
"Failed to find callout entry in registry: %1" ).arg( name ) );
 
   83    QgsDebugError( QStringLiteral( 
"Failed to cast callout's metadata: " ) .arg( name ) );
 
   90void QgsLabelingGui::initCalloutWidgets()
 
   92  _initCalloutWidgetFunction( QStringLiteral( 
"simple" ), QgsSimpleLineCalloutWidget::create );
 
   93  _initCalloutWidgetFunction( QStringLiteral( 
"manhattan" ), QgsManhattanLineCalloutWidget::create );
 
   94  _initCalloutWidgetFunction( QStringLiteral( 
"curved" ), QgsCurvedLineCalloutWidget::create );
 
   95  _initCalloutWidgetFunction( QStringLiteral( 
"balloon" ), QgsBalloonCalloutWidget::create );
 
   98void QgsLabelingGui::updateCalloutWidget( 
QgsCallout *callout )
 
  102    mCalloutStackedWidget->setCurrentWidget( pageDummy );
 
  106  QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( mLayer );
 
  109    mCalloutStackedWidget->setCurrentWidget( pageDummy );
 
  113  if ( mCalloutStackedWidget->currentWidget() != pageDummy )
 
  116    if ( 
QgsCalloutWidget *pew = qobject_cast< QgsCalloutWidget * >( mCalloutStackedWidget->currentWidget() ) )
 
  127      if ( mGeometryGeneratorGroupBox->isChecked() )
 
  131      w->setGeometryType( geometryType );
 
  132      w->setCallout( callout );
 
  134      w->setContext( context() );
 
  135      mCalloutStackedWidget->addWidget( w );
 
  136      mCalloutStackedWidget->setCurrentWidget( w );
 
  143  mCalloutStackedWidget->setCurrentWidget( pageDummy );
 
  146void QgsLabelingGui::showObstacleSettings()
 
  148  QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( mLayer );
 
  166  auto applySettings = [ = ]
 
  168    mObstacleSettings = widget->
settings();
 
  171    emit widgetChanged();
 
  187    dialog.buttonBox()->addButton( QDialogButtonBox::Help );
 
  188    connect( dialog.buttonBox(), &QDialogButtonBox::helpRequested, 
this, [ = ]
 
  190      QgsHelp::openHelp( QStringLiteral( 
"style_library/label_settings.html#obstacles" ) );
 
  202void QgsLabelingGui::showLineAnchorSettings()
 
  204  QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( mLayer );
 
  222  auto applySettings = [ = ]
 
  226    mLineSettings.setAnchorType( widgetSettings.
anchorType() );
 
  227    mLineSettings.setAnchorClipping( widgetSettings.
anchorClipping() );
 
  231    emit widgetChanged();
 
  247    dialog.buttonBox()->addButton( QDialogButtonBox::Help );
 
  248    connect( dialog.buttonBox(), &QDialogButtonBox::helpRequested, 
this, [ = ]
 
  250      QgsHelp::openHelp( QStringLiteral( 
"style_library/label_settings.html#placement-for-line-layers" ) );
 
  264  , mSettings( layerSettings )
 
  266  , mCanvas( mapCanvas )
 
  268  mGeomType = geomType;
 
  269  static std::once_flag initialized;
 
  270  std::call_once( initialized, [ = ]( )
 
  272    initCalloutWidgets();
 
  290  connect( mBufferDrawChkBx, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  292  connect( mEnableMaskChkBx, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  293  connect( mShapeDrawChkBx, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  294  connect( mCalloutsDrawCheckBox, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  295  connect( mShadowDrawChkBx, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  296  connect( mDirectSymbChkBx, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  297  connect( mFormatNumChkBx, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  298  connect( mScaleBasedVisibilityChkBx, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  299  connect( mFontLimitPixelChkBox, &QAbstractButton::toggled, 
this, &QgsLabelingGui::updateUi );
 
  300  connect( mGeometryGeneratorGroupBox, &QGroupBox::toggled, 
this, &QgsLabelingGui::updateGeometryTypeBasedWidgets );
 
  301  connect( mGeometryGeneratorType, qOverload<int>( &QComboBox::currentIndexChanged ), 
this, &QgsLabelingGui::updateGeometryTypeBasedWidgets );
 
  302  connect( mGeometryGeneratorExpressionButton, &QToolButton::clicked, 
this, &QgsLabelingGui::showGeometryGeneratorExpressionBuilder );
 
  303  connect( mGeometryGeneratorGroupBox, &QGroupBox::toggled, 
this, &QgsLabelingGui::validateGeometryGeneratorExpression );
 
  304  connect( mGeometryGenerator, &QgsCodeEditorExpression::textChanged, 
this, &QgsLabelingGui::validateGeometryGeneratorExpression );
 
  305  connect( mGeometryGeneratorType, qOverload<int>( &QComboBox::currentIndexChanged ), 
this, &QgsLabelingGui::validateGeometryGeneratorExpression );
 
  306  connect( mObstacleSettingsButton, &QAbstractButton::clicked, 
this, &QgsLabelingGui::showObstacleSettings );
 
  307  connect( mLineAnchorSettingsButton, &QAbstractButton::clicked, 
this, &QgsLabelingGui::showLineAnchorSettings );
 
  309  mFieldExpressionWidget->registerExpressionContextGenerator( 
this );
 
  311  mMinScaleWidget->setMapCanvas( mCanvas );
 
  312  mMinScaleWidget->setShowCurrentScaleButton( 
true );
 
  313  mMaxScaleWidget->setMapCanvas( mCanvas );
 
  314  mMaxScaleWidget->setShowCurrentScaleButton( 
true );
 
  317  for ( 
const QString &type : calloutTypes )
 
  323  mGeometryGeneratorWarningLabel->setStyleSheet( QStringLiteral( 
"color: #FFC107;" ) );
 
  324  mGeometryGeneratorWarningLabel->setTextInteractionFlags( Qt::TextBrowserInteraction );
 
  325  connect( mGeometryGeneratorWarningLabel, &QLabel::linkActivated, 
this, [
this]( 
const QString & link )
 
  327    if ( link == QLatin1String( 
"#determineGeometryGeneratorType" ) )
 
  328      determineGeometryGeneratorType();
 
  331  connect( mCalloutStyleComboBox, 
static_cast<void ( QComboBox::* )( 
int )
>( &QComboBox::currentIndexChanged ), 
this, &QgsLabelingGui::calloutTypeChanged );
 
  333  mLblNoObstacle1->installEventFilter( 
this );
 
  338void QgsLabelingGui::setLayer( 
QgsMapLayer *mapLayer )
 
  351  QgsVectorLayer *vLayer = qobject_cast<QgsVectorLayer *>( mapLayer );
 
  353  mTextFormatsListWidget->setLayerType( vLayer ? vLayer->
geometryType() : mGeomType );
 
  354  mBackgroundMarkerSymbolButton->setLayer( vLayer );
 
  355  mBackgroundFillSymbolButton->setLayer( vLayer );
 
  358  updateGeometryTypeBasedWidgets();
 
  360  mFieldExpressionWidget->setLayer( mapLayer );
 
  365  mFieldExpressionWidget->setGeomCalculator( da );
 
  367  mFieldExpressionWidget->setEnabled( mMode == Labels || !mLayer );
 
  368  mLabelingFrame->setEnabled( mMode == Labels || !mLayer );
 
  370  blockInitSignals( 
true );
 
  372  mGeometryGenerator->setText( mSettings.geometryGenerator );
 
  373  mGeometryGeneratorGroupBox->setChecked( mSettings.geometryGeneratorEnabled );
 
  374  if ( !mSettings.geometryGeneratorEnabled )
 
  375    mGeometryGeneratorGroupBox->setCollapsed( 
true );
 
  376  mGeometryGeneratorType->setCurrentIndex( mGeometryGeneratorType->findData( QVariant::fromValue( mSettings.geometryGeneratorType ) ) );
 
  378  updateWidgetForFormat( mSettings.format().isValid() ? mSettings.format() : 
QgsStyle::defaultTextFormatForProject( 
QgsProject::instance(), 
QgsStyle::TextFormatContext::Labeling ) );
 
  380  mFieldExpressionWidget->setRow( -1 );
 
  381  mFieldExpressionWidget->setField( mSettings.fieldName );
 
  382  mCheckBoxSubstituteText->setChecked( mSettings.useSubstitutions );
 
  383  mSubstitutions = mSettings.substitutions;
 
  386  mCentroidRadioWhole->setChecked( mSettings.centroidWhole );
 
  387  mCentroidInsideCheckBox->setChecked( mSettings.centroidInside );
 
  388  mFitInsidePolygonCheckBox->setChecked( mSettings.fitInPolygonOnly );
 
  389  mLineDistanceSpnBx->setValue( mSettings.dist );
 
  390  mLineDistanceUnitWidget->setUnit( mSettings.distUnits );
 
  391  mLineDistanceUnitWidget->setMapUnitScale( mSettings.distMapUnitScale );
 
  393  mMaximumDistanceSpnBx->setValue( mSettings.pointSettings().maximumDistance() );
 
  394  mMaximumDistanceUnitWidget->setUnit( mSettings.pointSettings().maximumDistanceUnit() );
 
  395  mMaximumDistanceUnitWidget->setMapUnitScale( mSettings.pointSettings().maximumDistanceMapUnitScale() );
 
  397  mOffsetTypeComboBox->setCurrentIndex( mOffsetTypeComboBox->findData( 
static_cast< int >( mSettings.offsetType ) ) );
 
  398  mQuadrantBtnGrp->button( 
static_cast<int>( mSettings.pointSettings().quadrant() ) )->setChecked( 
true );
 
  399  mPointOffsetXSpinBox->setValue( mSettings.xOffset );
 
  400  mPointOffsetYSpinBox->setValue( mSettings.yOffset );
 
  401  mPointOffsetUnitWidget->setUnit( mSettings.offsetUnits );
 
  402  mPointOffsetUnitWidget->setMapUnitScale( mSettings.labelOffsetMapUnitScale );
 
  403  mPointAngleSpinBox->setValue( mSettings.angleOffset );
 
  411  const int placementIndex = mPlacementModeComboBox->findData( 
static_cast< int >( mSettings.placement ) );
 
  412  if ( placementIndex >= 0 )
 
  414    mPlacementModeComboBox->setCurrentIndex( placementIndex );
 
  419    mPlacementModeComboBox->setCurrentIndex( 0 );
 
  423  mRepeatDistanceSpinBox->setValue( mSettings.repeatDistance );
 
  424  mRepeatDistanceUnitWidget->setUnit( mSettings.repeatDistanceUnit );
 
  425  mRepeatDistanceUnitWidget->setMapUnitScale( mSettings.repeatDistanceMapUnitScale );
 
  427  mOverrunDistanceSpinBox->setValue( mSettings.lineSettings().overrunDistance() );
 
  428  mOverrunDistanceUnitWidget->setUnit( mSettings.lineSettings().overrunDistanceUnit() );
 
  429  mOverrunDistanceUnitWidget->setMapUnitScale( mSettings.lineSettings().overrunDistanceMapUnitScale() );
 
  431  mPrioritySlider->setValue( mSettings.priority );
 
  432  mChkNoObstacle->setChecked( mSettings.obstacleSettings().isObstacle() );
 
  434  mObstacleSettings = mSettings.obstacleSettings();
 
  435  mLineSettings = mSettings.lineSettings();
 
  437  chkLabelPerFeaturePart->setChecked( mSettings.labelPerPart );
 
  439  mComboOverlapHandling->setCurrentIndex( mComboOverlapHandling->findData( 
static_cast< int >( mSettings.placementSettings().overlapHandling() ) ) );
 
  440  mCheckAllowDegradedPlacement->setChecked( mSettings.placementSettings().allowDegradedPlacement() );
 
  441  mPrioritizationComboBox->setCurrentIndex( mPrioritizationComboBox->findData( QVariant::fromValue( mSettings.placementSettings().prioritization() ) ) );
 
  443  chkMergeLines->setChecked( mSettings.lineSettings().mergeLines() );
 
  444  mMinSizeSpinBox->setValue( mSettings.thinningSettings().minimumFeatureSize() );
 
  445  mLimitLabelChkBox->setChecked( mSettings.thinningSettings().limitNumberOfLabelsEnabled() );
 
  446  mLimitLabelSpinBox->setValue( mSettings.thinningSettings().maximumNumberLabels() );
 
  449  mDirectSymbChkBx->setChecked( mSettings.lineSettings().addDirectionSymbol() );
 
  450  mDirectSymbLeftLineEdit->setText( mSettings.lineSettings().leftDirectionSymbol() );
 
  451  mDirectSymbRightLineEdit->setText( mSettings.lineSettings().rightDirectionSymbol() );
 
  452  mDirectSymbRevChkBx->setChecked( mSettings.lineSettings().reverseDirectionSymbol() );
 
  454  mDirectSymbBtnGrp->button( 
static_cast<int>( mSettings.lineSettings().directionSymbolPlacement() ) )->setChecked( 
true );
 
  455  mUpsidedownBtnGrp->button( 
static_cast<int>( mSettings.upsidedownLabels ) )->setChecked( 
true );
 
  458  mMaxCharAngleInDSpinBox->setValue( mSettings.maxCurvedCharAngleIn );
 
  460  mMaxCharAngleOutDSpinBox->setValue( std::fabs( mSettings.maxCurvedCharAngleOut ) );
 
  462  wrapCharacterEdit->setText( mSettings.wrapChar );
 
  463  mAutoWrapLengthSpinBox->setValue( mSettings.autoWrapLength );
 
  464  mAutoWrapTypeComboBox->setCurrentIndex( mSettings.useMaxLineLengthForAutoWrap ? 0 : 1 );
 
  466  if ( mFontMultiLineAlignComboBox->findData( 
static_cast< int >( mSettings.multilineAlign ) ) != -1 )
 
  468    mFontMultiLineAlignComboBox->setCurrentIndex( mFontMultiLineAlignComboBox->findData( 
static_cast< int >( mSettings.multilineAlign ) ) );
 
  474    mFontMultiLineAlignComboBox->setCurrentIndex( 0 );
 
  477  chkPreserveRotation->setChecked( mSettings.preserveRotation );
 
  479  mCoordRotationUnitComboBox->setCurrentIndex( 0 );
 
  480  if ( mCoordRotationUnitComboBox->findData( 
static_cast< unsigned int >( mSettings.rotationUnit() ) ) >= 0 )
 
  481    mCoordRotationUnitComboBox->setCurrentIndex( mCoordRotationUnitComboBox->findData( 
static_cast< unsigned int >( mSettings.rotationUnit() ) ) );
 
  483  mScaleBasedVisibilityChkBx->setChecked( mSettings.scaleVisibility );
 
  484  mMinScaleWidget->setScale( mSettings.minimumScale );
 
  485  mMaxScaleWidget->setScale( mSettings.maximumScale );
 
  487  mFormatNumChkBx->setChecked( mSettings.formatNumbers );
 
  488  mFormatNumDecimalsSpnBx->setValue( mSettings.decimals );
 
  489  mFormatNumPlusSignChkBx->setChecked( mSettings.plusSign );
 
  493  mFontLimitPixelChkBox->setChecked( mSettings.fontLimitPixelSize );
 
  494  mMinPixelLimit = mSettings.fontMinPixelSize; 
 
  495  mFontMinPixelSpinBox->setValue( mSettings.fontMinPixelSize == 0 ? 3 : mSettings.fontMinPixelSize );
 
  496  mFontMaxPixelSpinBox->setValue( mSettings.fontMaxPixelSize );
 
  498  mZIndexSpinBox->setValue( mSettings.zIndex );
 
  500  mDataDefinedProperties = mSettings.dataDefinedProperties();
 
  503  if ( 
auto *lCallout = mSettings.callout() )
 
  505    whileBlocking( mCalloutsDrawCheckBox )->setChecked( lCallout->enabled() );
 
  506    whileBlocking( mCalloutStyleComboBox )->setCurrentIndex( mCalloutStyleComboBox->findData( lCallout->type() ) );
 
  507    updateCalloutWidget( lCallout );
 
  512    whileBlocking( mCalloutStyleComboBox )->setCurrentIndex( mCalloutStyleComboBox->findData( defaultCallout->type() ) );
 
  514    updateCalloutWidget( defaultCallout.get() );
 
  517  updatePlacementWidgets();
 
  518  updateLinePlacementOptions();
 
  521  blockInitSignals( 
false );
 
  525  populateDataDefinedButtons();
 
  532  mSettings = settings;
 
  536void QgsLabelingGui::blockInitSignals( 
bool block )
 
  538  chkLineAbove->blockSignals( block );
 
  539  chkLineBelow->blockSignals( block );
 
  540  mPlacementModeComboBox->blockSignals( block );
 
  543void QgsLabelingGui::setLabelMode( LabelMode mode )
 
  546  mFieldExpressionWidget->setEnabled( mMode == Labels );
 
  547  mLabelingFrame->setEnabled( mMode == Labels );
 
  557  lyr.
drawLabels = ( mMode == Labels ) || !mLayer;
 
  560  lyr.
fieldName = mFieldExpressionWidget->currentField( &isExpression );
 
  566  if ( mCheckAllowLabelsOutsidePolygons->isChecked() )
 
  573  lyr.
dist = mLineDistanceSpnBx->value();
 
  574  lyr.
distUnits = mLineDistanceUnitWidget->unit();
 
  582  if ( mQuadrantBtnGrp )
 
  586  lyr.
xOffset = mPointOffsetXSpinBox->value();
 
  587  lyr.
yOffset = mPointOffsetYSpinBox->value();
 
  593  if ( chkLineAbove->isChecked() )
 
  595  if ( chkLineBelow->isChecked() )
 
  597  if ( chkLineOn->isChecked() )
 
  599  if ( ! chkLineOrientationDependent->isChecked() )
 
  613  lyr.
priority = mPrioritySlider->value();
 
  615  mObstacleSettings.setIsObstacle( mChkNoObstacle->isChecked() || mMode == ObstaclesOnly );
 
  640  lyr.
decimals = mFormatNumDecimalsSpnBx->value();
 
  641  lyr.
plusSign = mFormatNumPlusSignChkBx->isChecked();
 
  648  if ( mDirectSymbBtnGrp )
 
  652  if ( mUpsidedownBtnGrp )
 
  668  lyr.
wrapChar = wrapCharacterEdit->text();
 
  678  QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( mLayer );
 
  681  lyr.
zIndex = mZIndexSpinBox->value();
 
  686  const QString calloutType = mCalloutStyleComboBox->currentData().toString();
 
  687  std::unique_ptr< QgsCallout > callout;
 
  688  if ( 
QgsCalloutWidget *pew = qobject_cast< QgsCalloutWidget * >( mCalloutStackedWidget->currentWidget() ) )
 
  690    callout.reset( pew->callout()->clone() );
 
  695  callout->
setEnabled( mCalloutsDrawCheckBox->isChecked() );
 
  703  f->setEnabled( chkBx->isChecked() || ddBtn->
isActive() );
 
  706bool QgsLabelingGui::eventFilter( QObject *
object, QEvent *event )
 
  708  if ( 
object == mLblNoObstacle1 )
 
  710    if ( event->type() == QEvent::MouseButtonPress && qgis::down_cast< QMouseEvent * >( event )->button() == Qt::LeftButton )
 
  713      mChkNoObstacle->setChecked( !mChkNoObstacle->isChecked() );
 
  718  return QgsTextFormatWidget::eventFilter( 
object, event );
 
  721void QgsLabelingGui::updateUi()
 
  725  syncDefinedCheckboxFrame( mBufferDrawDDBtn, mBufferDrawChkBx, mBufferFrame );
 
  726  syncDefinedCheckboxFrame( mEnableMaskDDBtn, mEnableMaskChkBx, mMaskFrame );
 
  727  syncDefinedCheckboxFrame( mShapeDrawDDBtn, mShapeDrawChkBx, mShapeFrame );
 
  728  syncDefinedCheckboxFrame( mShadowDrawDDBtn, mShadowDrawChkBx, mShadowFrame );
 
  729  syncDefinedCheckboxFrame( mCalloutDrawDDBtn, mCalloutsDrawCheckBox, mCalloutFrame );
 
  731  syncDefinedCheckboxFrame( mDirectSymbDDBtn, mDirectSymbChkBx, mDirectSymbFrame );
 
  732  syncDefinedCheckboxFrame( mFormatNumDDBtn, mFormatNumChkBx, mFormatNumFrame );
 
  733  syncDefinedCheckboxFrame( mScaleBasedVisibilityDDBtn, mScaleBasedVisibilityChkBx, mScaleBasedVisibilityFrame );
 
  734  syncDefinedCheckboxFrame( mFontLimitPixelDDBtn, mFontLimitPixelChkBox, mFontLimitPixelFrame );
 
  736  chkMergeLines->setEnabled( !mDirectSymbChkBx->isChecked() );
 
  737  if ( mDirectSymbChkBx->isChecked() )
 
  739    chkMergeLines->setToolTip( tr( 
"This option is not compatible with line direction symbols." ) );
 
  743    chkMergeLines->setToolTip( QString() );
 
  747void QgsLabelingGui::setFormatFromStyle( 
const QString &name, 
QgsStyle::StyleEntity type, 
const QString &stylePath )
 
  778        settings.
fieldName = mFieldExpressionWidget->currentField( &isExpression );
 
  781      setSettings( settings );
 
  789  if ( 
QgsCalloutWidget *cw = qobject_cast< QgsCalloutWidget * >( mCalloutStackedWidget->currentWidget() ) )
 
  791    cw->setContext( context );
 
  796void QgsLabelingGui::saveFormat()
 
  799  saveDlg.setDefaultTags( mTextFormatsListWidget->currentTagFilter() );
 
  800  if ( !saveDlg.exec() )
 
  803  if ( saveDlg.name().isEmpty() )
 
  806  QgsStyle *style = saveDlg.destinationStyle();
 
  810  switch ( saveDlg.selectedType() )
 
  817        const int res = QMessageBox::warning( 
this, tr( 
"Save Text Format" ),
 
  818                                              tr( 
"Format with name '%1' already exists. Overwrite?" )
 
  819                                              .arg( saveDlg.name() ),
 
  820                                              QMessageBox::Yes | QMessageBox::No );
 
  821        if ( res != QMessageBox::Yes )
 
  827      const QStringList symbolTags = saveDlg.tags().split( 
',' );
 
  831      style->
saveTextFormat( saveDlg.name(), newFormat, saveDlg.isFavorite(), symbolTags );
 
  840        const int res = QMessageBox::warning( 
this, tr( 
"Save Label Settings" ),
 
  841                                              tr( 
"Label settings with the name '%1' already exist. Overwrite?" )
 
  842                                              .arg( saveDlg.name() ),
 
  843                                              QMessageBox::Yes | QMessageBox::No );
 
  844        if ( res != QMessageBox::Yes )
 
  850      const QStringList symbolTags = saveDlg.tags().split( 
',' );
 
  854      style->
saveLabelSettings( saveDlg.name(), newSettings, saveDlg.isFavorite(), symbolTags );
 
  868void QgsLabelingGui::updateGeometryTypeBasedWidgets()
 
  872  QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( mLayer );
 
  874  if ( mGeometryGeneratorGroupBox->isChecked() )
 
  887  mPlacementModeComboBox->clear();
 
  889  switch ( geometryType )
 
  916      qFatal( 
"unknown geometry type unexpected" );
 
  919  if ( mPlacementModeComboBox->findData( 
static_cast< int >( prevPlacement ) ) != -1 )
 
  921    mPlacementModeComboBox->setCurrentIndex( mPlacementModeComboBox->findData( 
static_cast< int >( prevPlacement ) ) );
 
  934      mFontMultiLineAlignComboBox->removeItem( idx );
 
  937  updatePlacementWidgets();
 
  938  updateLinePlacementOptions();
 
  941void QgsLabelingGui::showGeometryGeneratorExpressionBuilder()
 
  943  QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( mLayer );
 
  946  expressionBuilder.setExpressionText( mGeometryGenerator->text() );
 
  947  expressionBuilder.setExpressionContext( createExpressionContext() );
 
  949  if ( expressionBuilder.exec() )
 
  951    mGeometryGenerator->setText( expressionBuilder.expressionText() );
 
  955void QgsLabelingGui::validateGeometryGeneratorExpression()
 
  959  QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( mLayer );
 
  961  if ( mGeometryGeneratorGroupBox->isChecked() )
 
  963    if ( !mPreviewFeature.isValid() && vLayer )
 
  970    expression.prepare( &context );
 
  972    if ( expression.hasParserError() )
 
  974      mGeometryGeneratorWarningLabel->setText( expression.parserErrorString() );
 
  979      const QVariant result = expression.evaluate( &context );
 
  984        mGeometryGeneratorWarningLabel->setText( tr( 
"Result of the expression is not a geometry" ) );
 
  987      else if ( geometry.
type() != configuredGeometryType )
 
  989        mGeometryGeneratorWarningLabel->setText( QStringLiteral( 
"<p>%1</p><p><a href=\"#determineGeometryGeneratorType\">%2</a></p>" ).arg(
 
  990              tr( 
"Result of the expression does not match configured geometry type." ),
 
  999  QTimer *timer = 
new QTimer();
 
 1000  connect( timer, &QTimer::timeout, 
this, [
this, valid]()
 
 1002    mGeometryGeneratorWarningLabel->setVisible( !valid );
 
 1004  connect( timer, &QTimer::timeout, timer, &QTimer::deleteLater );
 
 1008void QgsLabelingGui::determineGeometryGeneratorType()
 
 1010  QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( mLayer );
 
 1011  if ( !mPreviewFeature.isValid() && vLayer )
 
 1018  expression.prepare( &context );
 
 1021  mGeometryGeneratorType->setCurrentIndex( mGeometryGeneratorType->findData( QVariant::fromValue( geometry.
type() ) ) );
 
 1024void QgsLabelingGui::calloutTypeChanged()
 
 1026  const QString newCalloutType = mCalloutStyleComboBox->currentData().toString();
 
 1027  QgsCalloutWidget *pew = qobject_cast< QgsCalloutWidget * >( mCalloutStackedWidget->currentWidget() );
 
 1046  updateCalloutWidget( newCallout.get() );
 
 1059  QVBoxLayout *vLayout = 
new QVBoxLayout();
 
 1060  mWidget = 
new QgsLabelingGui( layer, mapCanvas, settings, 
nullptr, geomType );
 
 1061  vLayout->addWidget( mWidget );
 
 1062  mButtonBox = 
new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok, Qt::Horizontal );
 
 1063  connect( mButtonBox, &QDialogButtonBox::accepted, 
this, &QDialog::accept );
 
 1064  connect( mButtonBox, &QDialogButtonBox::rejected, 
this, &QDialog::reject );
 
 1065  connect( mButtonBox, &QDialogButtonBox::helpRequested, 
this, &QgsLabelSettingsDialog::showHelp );
 
 1066  vLayout->addWidget( mButtonBox );
 
 1067  setLayout( vLayout );
 
 1068  setWindowTitle( tr( 
"Label Settings" ) );
 
 1071QDialogButtonBox *QgsLabelSettingsDialog::buttonBox()
 const 
 1076void QgsLabelSettingsDialog::showHelp()
 
The Qgis class provides global constants for use throughout the application.
 
@ BelowLine
Labels can be placed below a line feature. Unless MapOrientation is also specified this mode respects...
 
@ MapOrientation
Signifies that the AboveLine and BelowLine flags should respect the map's orientation rather than the...
 
@ OnLine
Labels can be placed directly over a line feature.
 
@ AboveLine
Labels can be placed above a line feature. Unless MapOrientation is also specified this mode respects...
 
AngleUnit
Units of angles.
 
@ SecondsOfArc
Seconds of arc.
 
@ Radians
Square kilometers.
 
@ MinutesOfArc
Minutes of arc.
 
@ MilliradiansSI
Angular milliradians (SI definition, 1/1000 of radian)
 
@ MilNATO
Angular mil (NATO definition, 6400 mil = 2PI radians)
 
LabelOffsetType
Behavior modifier for label offset and distance, only applies in some label placement modes.
 
LabelPrioritization
Label prioritization.
 
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....
 
@ AllowPlacementInsideOfPolygon
Labels can be placed inside a polygon feature.
 
@ AllowPlacementOutsideOfPolygon
Labels can be placed outside of a polygon feature.
 
QFlags< LabelLinePlacementFlag > LabelLinePlacementFlags
Line placement flags, which control how candidates are generated for a linear feature.
 
QFlags< LabelPolygonPlacementFlag > LabelPolygonPlacementFlags
Polygon placement flags, which control how candidates are generated for a polygon feature.
 
LabelQuadrantPosition
Label quadrant positions.
 
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
 
LabelMultiLineAlignment
Text alignment for multi-line labels.
 
@ FollowPlacement
Alignment follows placement of label, e.g., labels to the left of a feature will be drawn with right ...
 
@ Mesh
Mesh layer. Added in QGIS 3.2.
 
LabelOverlapHandling
Label overlap handling.
 
UpsideDownLabelHandling
Handling techniques for upside down labels.
 
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.
 
static QgsCallout * defaultCallout()
Create a new instance of a callout with default settings.
 
QStringList calloutTypes() const
Returns a list of all available callout types.
 
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 * meshExpressionScope(QgsMesh::ElementType elementType)
Creates a new scope which contains functions relating to mesh layer element elementType.
 
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").
 
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
 
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 unique ID, geometry and a list of field...
 
A geometry is the spatial representation of a feature.
 
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(Qgis::LabelLinePlacementFlags 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 setAnchorTextPoint(AnchorTextPoint point)
Sets the line anchor text point, which dictates which part of the label text should be placed at the ...
 
void setLeftDirectionSymbol(const QString &symbol)
Sets the string to use for left direction arrows.
 
AnchorTextPoint anchorTextPoint() const
Returns the line anchor text point, which dictates which part of the label text should be placed at t...
 
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 setAnchorClipping(AnchorClipping clipping)
Sets the line anchor clipping mode, which dictates how line strings are clipped before calculating th...
 
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 setOverrunDistanceUnit(const Qgis::RenderUnit &unit)
Sets the unit for label overrun distance.
 
void setOverrunDistance(double distance)
Sets the distance which labels are allowed to overrun past the start or end of line features.
 
AnchorClipping anchorClipping() const
Returns the line anchor clipping mode, which dictates how line strings are clipped before calculating...
 
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 setOverlapHandling(Qgis::LabelOverlapHandling handling)
Sets the technique used to handle overlapping labels.
 
void setPrioritization(Qgis::LabelPrioritization prioritization)
Sets the technique used to prioritize labels.
 
void setAllowDegradedPlacement(bool allow)
Sets whether labels can be placed in inferior fallback positions if they cannot otherwise be placed.
 
void setMaximumDistance(double distance)
Sets the maximum distance which labels are allowed to be from their corresponding points.
 
void setMaximumDistanceMapUnitScale(const QgsMapUnitScale &scale)
Sets the map unit scale for label maximum distance.
 
void setQuadrant(Qgis::LabelQuadrantPosition quadrant)
Sets the quadrant in which to offset labels from the point.
 
void setMaximumDistanceUnit(Qgis::RenderUnit unit)
Sets the unit for label maximum distance.
 
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.
 
const QgsLabelPlacementSettings & placementSettings() const
Returns the label placement 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...
 
void setPolygonPlacementFlags(Qgis::LabelPolygonPlacementFlags flags)
Sets the polygon placement flags, which dictate how polygon labels can be placed.
 
QString wrapChar
Wrapping character string.
 
Qgis::LabelOffsetType offsetType
Offset type for layer (only applies in certain placement modes)
 
double xOffset
Horizontal offset of label.
 
Qgis::LabelPlacement placement
Label placement mode.
 
bool drawLabels
Whether to draw labels for this layer.
 
bool fontLimitPixelSize
true if label sizes should be limited by pixel size.
 
double minimumScale
The minimum map scale (i.e.
 
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...
 
Qgis::LabelMultiLineAlignment multilineAlign
Horizontal alignment of multi-line labels.
 
bool centroidInside
true if centroid positioned labels must be placed inside their corresponding feature polygon,...
 
int priority
Label priority.
 
Qgis::GeometryType geometryGeneratorType
The type of the result geometry of the geometry generator.
 
bool labelPerPart
true if every part of a multi-part feature should be labeled.
 
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 QgsLabelThinningSettings & thinningSettings() const
Returns the label thinning settings.
 
Qgis::GeometryType layerType
Geometry type of layers associated with these settings.
 
Qgis::RenderUnit offsetUnits
Units for offsets of label.
 
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.
 
const QgsLabelLineSettings & lineSettings() const
Returns the label line settings, which contain settings related to how the label engine places and fo...
 
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.
 
void setRotationUnit(Qgis::AngleUnit angleUnit)
Set unit for rotation of labels.
 
QgsMapUnitScale repeatDistanceMapUnitScale
Map unit scale for repeating labels for a single feature.
 
Qgis::RenderUnit distUnits
Units the distance from feature to the label.
 
bool centroidWhole
true if feature centroid should be calculated from the whole feature, or false if only the visible pa...
 
Qgis::RenderUnit repeatDistanceUnit
Units for repeating labels for a single feature.
 
Qgis::UpsideDownLabelHandling 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.
 
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...
 
void setUnplacedVisibility(Qgis::UnplacedLabelVisibility visibility)
Sets the layer's unplaced label visibility.
 
const QgsLabelPointSettings & pointSettings() const
Returns the label point settings, which contain settings related to how the label engine places and f...
 
bool useSubstitutions
True if substitutions should be applied.
 
QgsStyle * styleAtPath(const QString &path)
Returns a reference to the style database associated with the project with matching file path.
 
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
 
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...
 
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(bool initialize=true)
Returns the 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 setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the widget is shown, e.g., the associated map canvas and expression context...
 
virtual void setFormatFromStyle(const QString &name, QgsStyle::StyleEntity type, const QString &stylePath)
Sets the current text settings from a style entry.
 
Container for all settings relating to text rendering.
 
static Q_INVOKABLE QString toString(Qgis::DistanceUnit unit)
Returns a translated string representing a distance unit.
 
Represents a vector layer which manages a vector based data sets.
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
 
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
 
static QString geometryDisplayString(Qgis::GeometryType type)
Returns a display string for a geometry type.
 
@ Unknown
Unknown/invalid format.
 
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
 
QgsCalloutWidget *(* QgsCalloutWidgetFunc)(QgsVectorLayer *)
 
#define QgsDebugError(str)