Skip to content

Commit d4ca4a1

Browse files
committedAug 18, 2020
[labeling][ui] Change placement mode selection widget from radio
buttons to combo box The radio buttons don't work well here -- they cause a massive gap in the placement UI layout for anything but polygon layers. Using a combobox is also much more compact, giving us some extra space to use for more helpful explanatory text
1 parent 6712278 commit d4ca4a1

File tree

6 files changed

+103
-423
lines changed

6 files changed

+103
-423
lines changed
 

‎python/gui/auto_generated/qgstextformatwidget.sip.in

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,15 @@ Controls whether data defined alignment buttons are enabled.
155155
virtual QgsExpressionContext createExpressionContext() const;
156156

157157

158+
QgsWkbTypes::GeometryType labelGeometryType() const;
159+
%Docstring
160+
Returns the geometry type which will be used by the labeling engine
161+
when registering labels for the labeling settings currently defined by the widget.
162+
163+
.. versionadded:: 3.16
164+
%End
165+
166+
158167

159168

160169

‎src/gui/labeling/qgslabelinggui.cpp

Lines changed: 28 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,11 @@ void QgsLabelingGui::showLineAnchorSettings()
223223

224224
QgsLabelingGui::QgsLabelingGui( QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsPalLayerSettings &layerSettings, QWidget *parent, QgsWkbTypes::GeometryType geomType )
225225
: QgsTextFormatWidget( mapCanvas, parent, QgsTextFormatWidget::Labeling, layer )
226-
, mGeomType( geomType )
227226
, mSettings( layerSettings )
228227
, mMode( NoLabels )
229228
, mCanvas( mapCanvas )
230229
{
230+
mGeomType = geomType;
231231
static std::once_flag initialized;
232232
std::call_once( initialized, [ = ]( )
233233
{
@@ -350,41 +350,7 @@ void QgsLabelingGui::setLayer( QgsMapLayer *mapLayer )
350350

351351
mCheckAllowLabelsOutsidePolygons->setChecked( mSettings.polygonPlacementFlags() & QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon );
352352

353-
switch ( mSettings.placement )
354-
{
355-
case QgsPalLayerSettings::AroundPoint:
356-
radAroundPoint->setChecked( true );
357-
radAroundCentroid->setChecked( true );
358-
//spinAngle->setValue( lyr.angle ); // TODO: uncomment when supported
359-
break;
360-
case QgsPalLayerSettings::OverPoint:
361-
radOverPoint->setChecked( true );
362-
radOverCentroid->setChecked( true );
363-
break;
364-
case QgsPalLayerSettings::OrderedPositionsAroundPoint:
365-
radPredefinedOrder->setChecked( true );
366-
break;
367-
case QgsPalLayerSettings::Line:
368-
radLineParallel->setChecked( true );
369-
radPolygonPerimeter->setChecked( true );
370-
break;
371-
case QgsPalLayerSettings::Curved:
372-
radLineCurved->setChecked( true );
373-
break;
374-
case QgsPalLayerSettings::Horizontal:
375-
radPolygonHorizontal->setChecked( true );
376-
radLineHorizontal->setChecked( true );
377-
break;
378-
case QgsPalLayerSettings::Free:
379-
radPolygonFree->setChecked( true );
380-
break;
381-
case QgsPalLayerSettings::PerimeterCurved:
382-
radPolygonPerimeterCurved->setChecked( true );
383-
break;
384-
case QgsPalLayerSettings::OutsidePolygons:
385-
radPolygonOutside->setChecked( true );
386-
break;
387-
}
353+
mPlacementModeComboBox->setCurrentIndex( mPlacementModeComboBox->findData( mSettings.placement ) );
388354

389355
// Label repeat distance
390356
mRepeatDistanceSpinBox->setValue( mSettings.repeatDistance );
@@ -497,9 +463,7 @@ void QgsLabelingGui::blockInitSignals( bool block )
497463
{
498464
chkLineAbove->blockSignals( block );
499465
chkLineBelow->blockSignals( block );
500-
mPlacePointBtnGrp->blockSignals( block );
501-
mPlaceLineBtnGrp->blockSignals( block );
502-
mPlacePolygonBtnGrp->blockSignals( block );
466+
mPlacementModeComboBox->blockSignals( block );
503467
}
504468

505469
void QgsLabelingGui::setLabelMode( LabelMode mode )
@@ -526,7 +490,6 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
526490
polygonPlacementFlags |= QgsLabeling::PolygonPlacementFlag::AllowPlacementOutsideOfPolygon;
527491
lyr.setPolygonPlacementFlags( polygonPlacementFlags );
528492

529-
QWidget *curPlacementWdgt = stackedPlacement->currentWidget();
530493
lyr.centroidWhole = mCentroidRadioWhole->isChecked();
531494
lyr.centroidInside = mCentroidInsideCheckBox->isChecked();
532495
lyr.fitInPolygonOnly = mFitInsidePolygonCheckBox->isChecked();
@@ -555,50 +518,7 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
555518
linePlacementFlags |= QgsLabeling::LinePlacementFlag::MapOrientation;
556519
lyr.lineSettings().setPlacementFlags( linePlacementFlags );
557520

558-
if ( ( curPlacementWdgt == pagePoint && radAroundPoint->isChecked() )
559-
|| ( curPlacementWdgt == pagePolygon && radAroundCentroid->isChecked() ) )
560-
{
561-
lyr.placement = QgsPalLayerSettings::AroundPoint;
562-
}
563-
else if ( ( curPlacementWdgt == pagePoint && radOverPoint->isChecked() )
564-
|| ( curPlacementWdgt == pagePolygon && radOverCentroid->isChecked() ) )
565-
{
566-
lyr.placement = QgsPalLayerSettings::OverPoint;
567-
}
568-
else if ( curPlacementWdgt == pagePoint && radPredefinedOrder->isChecked() )
569-
{
570-
lyr.placement = QgsPalLayerSettings::OrderedPositionsAroundPoint;
571-
}
572-
else if ( ( curPlacementWdgt == pageLine && radLineParallel->isChecked() )
573-
|| ( curPlacementWdgt == pagePolygon && radPolygonPerimeter->isChecked() ) )
574-
{
575-
lyr.placement = QgsPalLayerSettings::Line;
576-
}
577-
else if ( curPlacementWdgt == pageLine && radLineCurved->isChecked() )
578-
{
579-
lyr.placement = QgsPalLayerSettings::Curved;
580-
}
581-
else if ( curPlacementWdgt == pagePolygon && radPolygonPerimeterCurved->isChecked() )
582-
{
583-
lyr.placement = QgsPalLayerSettings::PerimeterCurved;
584-
}
585-
else if ( ( curPlacementWdgt == pageLine && radLineHorizontal->isChecked() )
586-
|| ( curPlacementWdgt == pagePolygon && radPolygonHorizontal->isChecked() ) )
587-
{
588-
lyr.placement = QgsPalLayerSettings::Horizontal;
589-
}
590-
else if ( radPolygonFree->isChecked() )
591-
{
592-
lyr.placement = QgsPalLayerSettings::Free;
593-
}
594-
else if ( radPolygonOutside->isChecked() )
595-
{
596-
lyr.placement = QgsPalLayerSettings::OutsidePolygons;
597-
}
598-
else
599-
{
600-
qFatal( "Invalid settings" );
601-
}
521+
lyr.placement = static_cast< QgsPalLayerSettings::Placement >( mPlacementModeComboBox->currentData().toInt() );
602522

603523
lyr.repeatDistance = mRepeatDistanceSpinBox->value();
604524
lyr.repeatDistanceUnit = mRepeatDistanceUnitWidget->unit();
@@ -855,24 +775,44 @@ void QgsLabelingGui::updateGeometryTypeBasedWidgets()
855775
mPolygonFeatureOptionsFrame->setVisible( geometryType == QgsWkbTypes::PolygonGeometry );
856776

857777

858-
// set placement methods page based on geometry type
778+
const QgsPalLayerSettings::Placement prevPlacement = static_cast< QgsPalLayerSettings::Placement >( mPlacementModeComboBox->currentData().toInt() );
779+
mPlacementModeComboBox->clear();
780+
859781
switch ( geometryType )
860782
{
861783
case QgsWkbTypes::PointGeometry:
862-
stackedPlacement->setCurrentWidget( pagePoint );
784+
mPlacementModeComboBox->addItem( tr( "Cartographic" ), QgsPalLayerSettings::OrderedPositionsAroundPoint );
785+
mPlacementModeComboBox->addItem( tr( "Around Point" ), QgsPalLayerSettings::AroundPoint );
786+
mPlacementModeComboBox->addItem( tr( "Offset from Point" ), QgsPalLayerSettings::OverPoint );
863787
break;
788+
864789
case QgsWkbTypes::LineGeometry:
865-
stackedPlacement->setCurrentWidget( pageLine );
790+
mPlacementModeComboBox->addItem( tr( "Parallel" ), QgsPalLayerSettings::Line );
791+
mPlacementModeComboBox->addItem( tr( "Curved" ), QgsPalLayerSettings::Curved );
792+
mPlacementModeComboBox->addItem( tr( "Horizontal" ), QgsPalLayerSettings::Horizontal );
866793
break;
794+
867795
case QgsWkbTypes::PolygonGeometry:
868-
stackedPlacement->setCurrentWidget( pagePolygon );
796+
mPlacementModeComboBox->addItem( tr( "Offset from Centroid" ), QgsPalLayerSettings::OverPoint );
797+
mPlacementModeComboBox->addItem( tr( "Around Centroid" ), QgsPalLayerSettings::AroundPoint );
798+
mPlacementModeComboBox->addItem( tr( "Horizontal" ), QgsPalLayerSettings::Horizontal );
799+
mPlacementModeComboBox->addItem( tr( "Free (Angled)" ), QgsPalLayerSettings::Free );
800+
mPlacementModeComboBox->addItem( tr( "Using Perimeter" ), QgsPalLayerSettings::Line );
801+
mPlacementModeComboBox->addItem( tr( "Using Perimeter (Curved)" ), QgsPalLayerSettings::PerimeterCurved );
802+
mPlacementModeComboBox->addItem( tr( "Outside Polygons" ), QgsPalLayerSettings::OutsidePolygons );
869803
break;
804+
870805
case QgsWkbTypes::NullGeometry:
871806
break;
872807
case QgsWkbTypes::UnknownGeometry:
873808
qFatal( "unknown geometry type unexpected" );
874809
}
875810

811+
if ( mPlacementModeComboBox->findData( prevPlacement ) != -1 )
812+
{
813+
mPlacementModeComboBox->setCurrentIndex( mPlacementModeComboBox->findData( prevPlacement ) );
814+
}
815+
876816
if ( geometryType == QgsWkbTypes::PointGeometry || geometryType == QgsWkbTypes::PolygonGeometry )
877817
{
878818
// follow placement alignment is only valid for point or polygon layers

‎src/gui/labeling/qgslabelinggui.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ class GUI_EXPORT QgsLabelingGui : public QgsTextFormatWidget
8585

8686
private:
8787

88-
QgsWkbTypes::GeometryType mGeomType = QgsWkbTypes::UnknownGeometry;
8988
QgsPalLayerSettings mSettings;
9089
LabelMode mMode;
9190
QgsFeature mPreviewFeature;

‎src/gui/qgstextformatwidget.cpp

Lines changed: 36 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -268,33 +268,7 @@ void QgsTextFormatWidget::initWidget()
268268
connect( mCheckAllowLabelsOutsidePolygons, &QAbstractButton::toggled, this, &QgsTextFormatWidget::updatePlacementWidgets );
269269
connect( mAllowOutsidePolygonsDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsTextFormatWidget::updatePlacementWidgets );
270270

271-
// setup point placement button group
272-
mPlacePointBtnGrp = new QButtonGroup( this );
273-
mPlacePointBtnGrp->addButton( radPredefinedOrder, static_cast<int>( QgsPalLayerSettings::OrderedPositionsAroundPoint ) );
274-
mPlacePointBtnGrp->addButton( radAroundPoint, static_cast<int>( QgsPalLayerSettings::AroundPoint ) );
275-
mPlacePointBtnGrp->addButton( radOverPoint, static_cast<int>( QgsPalLayerSettings::OverPoint ) );
276-
mPlacePointBtnGrp->setExclusive( true );
277-
connect( mPlacePointBtnGrp, static_cast<void ( QButtonGroup::* )( int )>( &QButtonGroup::buttonClicked ), this, &QgsTextFormatWidget::updatePlacementWidgets );
278-
279-
// setup line placement button group (assigned enum id currently unused)
280-
mPlaceLineBtnGrp = new QButtonGroup( this );
281-
mPlaceLineBtnGrp->addButton( radLineParallel, static_cast<int>( QgsPalLayerSettings::Line ) );
282-
mPlaceLineBtnGrp->addButton( radLineCurved, static_cast<int>( QgsPalLayerSettings::Curved ) );
283-
mPlaceLineBtnGrp->addButton( radLineHorizontal, static_cast<int>( QgsPalLayerSettings::Horizontal ) );
284-
mPlaceLineBtnGrp->setExclusive( true );
285-
connect( mPlaceLineBtnGrp, static_cast<void ( QButtonGroup::* )( int )>( &QButtonGroup::buttonClicked ), this, &QgsTextFormatWidget::updatePlacementWidgets );
286-
287-
// setup polygon placement button group (assigned enum id currently unused)
288-
mPlacePolygonBtnGrp = new QButtonGroup( this );
289-
mPlacePolygonBtnGrp->addButton( radOverCentroid, static_cast<int>( QgsPalLayerSettings::OverPoint ) );
290-
mPlacePolygonBtnGrp->addButton( radAroundCentroid, static_cast<int>( QgsPalLayerSettings::AroundPoint ) );
291-
mPlacePolygonBtnGrp->addButton( radPolygonHorizontal, static_cast<int>( QgsPalLayerSettings::Horizontal ) );
292-
mPlacePolygonBtnGrp->addButton( radPolygonFree, static_cast<int>( QgsPalLayerSettings::Free ) );
293-
mPlacePolygonBtnGrp->addButton( radPolygonPerimeter, static_cast<int>( QgsPalLayerSettings::Line ) );
294-
mPlacePolygonBtnGrp->addButton( radPolygonPerimeterCurved, static_cast<int>( QgsPalLayerSettings::PerimeterCurved ) );
295-
mPlacePolygonBtnGrp->addButton( radPolygonOutside, static_cast<int>( QgsPalLayerSettings::OutsidePolygons ) );
296-
mPlacePolygonBtnGrp->setExclusive( true );
297-
connect( mPlacePolygonBtnGrp, static_cast<void ( QButtonGroup::* )( int )>( &QButtonGroup::buttonClicked ), this, &QgsTextFormatWidget::updatePlacementWidgets );
271+
connect( mPlacementModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsTextFormatWidget::updatePlacementWidgets );
298272

299273
// Global settings group for groupboxes' saved/restored collapsed state
300274
// maintains state across different dialogs
@@ -455,19 +429,7 @@ void QgsTextFormatWidget::initWidget()
455429
<< mUpsidedownRadioAll
456430
<< mUpsidedownRadioDefined
457431
<< mUpsidedownRadioOff
458-
<< radAroundCentroid
459-
<< radAroundPoint
460-
<< radLineCurved
461-
<< radLineHorizontal
462-
<< radLineParallel
463-
<< radOverCentroid
464-
<< radOverPoint
465-
<< radPolygonFree
466-
<< radPolygonHorizontal
467-
<< radPolygonPerimeter
468-
<< radPolygonPerimeterCurved
469-
<< radPolygonOutside
470-
<< radPredefinedOrder
432+
<< mPlacementModeComboBox
471433
<< mFieldExpressionWidget
472434
<< mCheckBoxSubstituteText
473435
<< mGeometryGeneratorGroupBox
@@ -1314,8 +1276,7 @@ void QgsTextFormatWidget::changeBufferColor( const QColor &color )
13141276

13151277
void QgsTextFormatWidget::updatePlacementWidgets()
13161278
{
1317-
QWidget *curWdgt = stackedPlacement->currentWidget();
1318-
1279+
const QgsWkbTypes::GeometryType currentGeometryType = labelGeometryType();
13191280
bool showLineFrame = false;
13201281
bool showCentroidFrame = false;
13211282
bool showQuadrantFrame = false;
@@ -1326,40 +1287,39 @@ void QgsTextFormatWidget::updatePlacementWidgets()
13261287
bool showDistanceFrame = false;
13271288
bool showRotationFrame = false;
13281289
bool showMaxCharAngleFrame = false;
1329-
bool showPolygonPlacementOptions = ( curWdgt == pagePolygon && !radPolygonPerimeter->isChecked() && !radPolygonPerimeterCurved->isChecked() && !radPolygonOutside->isChecked() );
1290+
1291+
const QgsPalLayerSettings::Placement currentPlacement = static_cast< QgsPalLayerSettings::Placement >( mPlacementModeComboBox->currentData().toInt() );
1292+
bool showPolygonPlacementOptions = ( currentGeometryType == QgsWkbTypes::PolygonGeometry && currentPlacement != QgsPalLayerSettings::Line && currentPlacement != QgsPalLayerSettings::PerimeterCurved && currentPlacement != QgsPalLayerSettings::OutsidePolygons );
13301293

13311294
bool enableMultiLinesFrame = true;
13321295

1333-
if ( ( curWdgt == pagePoint && radAroundPoint->isChecked() )
1334-
|| ( curWdgt == pagePolygon && radAroundCentroid->isChecked() ) )
1296+
if ( currentPlacement == QgsPalLayerSettings::AroundPoint
1297+
&& ( currentGeometryType == QgsWkbTypes::PointGeometry || currentGeometryType == QgsWkbTypes::PolygonGeometry ) )
13351298
{
1336-
showCentroidFrame = ( curWdgt == pagePolygon && radAroundCentroid->isChecked() );
1299+
showCentroidFrame = currentGeometryType == QgsWkbTypes::PolygonGeometry;
13371300
showDistanceFrame = true;
13381301
//showRotationFrame = true; // TODO: uncomment when supported
1339-
if ( curWdgt == pagePoint )
1340-
{
1341-
showQuadrantFrame = true;
1342-
}
1302+
showQuadrantFrame = currentGeometryType == QgsWkbTypes::PointGeometry;
13431303
}
1344-
else if ( ( curWdgt == pagePoint && radOverPoint->isChecked() )
1345-
|| ( curWdgt == pagePolygon && radOverCentroid->isChecked() ) )
1304+
else if ( currentPlacement == QgsPalLayerSettings::OverPoint
1305+
&& ( currentGeometryType == QgsWkbTypes::PointGeometry || currentGeometryType == QgsWkbTypes::PolygonGeometry ) )
13461306
{
1347-
showCentroidFrame = ( curWdgt == pagePolygon && radOverCentroid->isChecked() );
1307+
showCentroidFrame = currentGeometryType == QgsWkbTypes::PolygonGeometry;
13481308
showQuadrantFrame = true;
13491309
showFixedQuadrantFrame = true;
13501310
showOffsetFrame = true;
13511311
showRotationFrame = true;
13521312
}
1353-
else if ( curWdgt == pagePoint && radPredefinedOrder->isChecked() )
1313+
else if ( currentGeometryType == QgsWkbTypes::PointGeometry && currentPlacement == QgsPalLayerSettings::OrderedPositionsAroundPoint )
13541314
{
13551315
showDistanceFrame = true;
13561316
showPlacementPriorityFrame = true;
13571317
showOffsetTypeFrame = true;
13581318
}
1359-
else if ( ( curWdgt == pageLine && radLineParallel->isChecked() )
1360-
|| ( curWdgt == pagePolygon && radPolygonPerimeter->isChecked() )
1361-
|| ( curWdgt == pageLine && radLineCurved->isChecked() )
1362-
|| ( curWdgt == pagePolygon && radPolygonPerimeterCurved->isChecked() ) )
1319+
else if ( ( currentGeometryType == QgsWkbTypes::LineGeometry && currentPlacement == QgsPalLayerSettings::Line )
1320+
|| ( currentGeometryType == QgsWkbTypes::PolygonGeometry && currentPlacement == QgsPalLayerSettings::Line )
1321+
|| ( currentGeometryType == QgsWkbTypes::LineGeometry && currentPlacement == QgsPalLayerSettings::Curved )
1322+
|| ( currentGeometryType == QgsWkbTypes::PolygonGeometry && currentPlacement == QgsPalLayerSettings::PerimeterCurved ) )
13631323
{
13641324
showLineFrame = true;
13651325
showDistanceFrame = true;
@@ -1369,13 +1329,14 @@ void QgsTextFormatWidget::updatePlacementWidgets()
13691329
chkLineOrientationDependent->setEnabled( offline );
13701330
mPlacementDistanceFrame->setEnabled( offline );
13711331

1372-
bool isCurved = ( curWdgt == pageLine && radLineCurved->isChecked() )
1373-
|| ( curWdgt == pagePolygon && radPolygonPerimeterCurved->isChecked() );
1332+
bool isCurved = ( currentGeometryType == QgsWkbTypes::LineGeometry && currentPlacement == QgsPalLayerSettings::Curved )
1333+
|| ( currentGeometryType == QgsWkbTypes::PolygonGeometry && currentPlacement == QgsPalLayerSettings::PerimeterCurved );
13741334
showMaxCharAngleFrame = isCurved;
13751335
// TODO: enable mMultiLinesFrame when supported for curved labels
13761336
enableMultiLinesFrame = !isCurved;
13771337
}
1378-
else if ( curWdgt == pagePolygon && ( radPolygonOutside->isChecked() || mCheckAllowLabelsOutsidePolygons->isChecked() || mAllowOutsidePolygonsDDBtn->isActive() ) )
1338+
else if ( currentGeometryType == QgsWkbTypes::PolygonGeometry
1339+
&& ( currentPlacement == QgsPalLayerSettings::OutsidePolygons || mCheckAllowLabelsOutsidePolygons->isChecked() || mAllowOutsidePolygonsDDBtn->isActive() ) )
13791340
{
13801341
showDistanceFrame = true;
13811342
}
@@ -1390,10 +1351,10 @@ void QgsTextFormatWidget::updatePlacementWidgets()
13901351
mPlacementDistanceFrame->setVisible( showDistanceFrame );
13911352
mPlacementOffsetTypeFrame->setVisible( showOffsetTypeFrame );
13921353
mPlacementRotationFrame->setVisible( showRotationFrame );
1393-
mPlacementRepeatDistanceFrame->setVisible( curWdgt == pageLine || ( curWdgt == pagePolygon &&
1394-
( radPolygonPerimeter->isChecked() || radPolygonPerimeterCurved->isChecked() ) ) );
1395-
mPlacementOverrunDistanceFrame->setVisible( curWdgt == pageLine );
1396-
mLineAnchorGroupBox->setVisible( curWdgt == pageLine );
1354+
mPlacementRepeatDistanceFrame->setVisible( currentGeometryType == QgsWkbTypes::LineGeometry || ( currentGeometryType == QgsWkbTypes::PolygonGeometry &&
1355+
( currentPlacement == QgsPalLayerSettings::Line || currentPlacement == QgsPalLayerSettings::PerimeterCurved ) ) );
1356+
mPlacementOverrunDistanceFrame->setVisible( currentGeometryType == QgsWkbTypes::LineGeometry );
1357+
mLineAnchorGroupBox->setVisible( currentGeometryType == QgsWkbTypes::LineGeometry );
13971358
mPlacementMaxCharAngleFrame->setVisible( showMaxCharAngleFrame );
13981359

13991360
mMultiLinesFrame->setEnabled( enableMultiLinesFrame );
@@ -2035,6 +1996,16 @@ QgsExpressionContext QgsTextFormatWidget::createExpressionContext() const
20351996
return expContext;
20361997
}
20371998

1999+
QgsWkbTypes::GeometryType QgsTextFormatWidget::labelGeometryType() const
2000+
{
2001+
if ( mGeometryGeneratorGroupBox->isChecked() )
2002+
return mGeometryGeneratorType->currentData().value<QgsWkbTypes::GeometryType>();
2003+
else if ( mLayer )
2004+
return mLayer->geometryType();
2005+
else
2006+
return mGeomType;
2007+
}
2008+
20382009

20392010
//
20402011
// QgsTextFormatDialog

‎src/gui/qgstextformatwidget.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,14 @@ class GUI_EXPORT QgsTextFormatWidget : public QWidget, public QgsExpressionConte
161161

162162
QgsExpressionContext createExpressionContext() const override;
163163

164+
/**
165+
* Returns the geometry type which will be used by the labeling engine
166+
* when registering labels for the labeling settings currently defined by the widget.
167+
*
168+
* \since QGIS 3.16
169+
*/
170+
QgsWkbTypes::GeometryType labelGeometryType() const;
171+
164172
//! Text substitution list
165173
QgsStringReplacementCollection mSubstitutions;
166174
//! Quadrant button group
@@ -169,12 +177,6 @@ class GUI_EXPORT QgsTextFormatWidget : public QWidget, public QgsExpressionConte
169177
QButtonGroup *mDirectSymbBtnGrp = nullptr;
170178
//! Upside down labels button group
171179
QButtonGroup *mUpsidedownBtnGrp = nullptr;
172-
//! Point placement button group
173-
QButtonGroup *mPlacePointBtnGrp = nullptr;
174-
//! Line placement button group
175-
QButtonGroup *mPlaceLineBtnGrp = nullptr;
176-
//! Polygon placement button group
177-
QButtonGroup *mPlacePolygonBtnGrp = nullptr;
178180
//! Pixel size font limit
179181
int mMinPixelLimit = 0;
180182

@@ -192,6 +194,9 @@ class GUI_EXPORT QgsTextFormatWidget : public QWidget, public QgsExpressionConte
192194

193195
QgsSymbolLayerReferenceList mMaskedSymbolLayers;
194196

197+
//! Geometry type for layer, if known
198+
QgsWkbTypes::GeometryType mGeomType = QgsWkbTypes::UnknownGeometry;
199+
195200
protected slots:
196201

197202
//! Updates line placement options to reflect current state of widget

‎src/ui/qgstextformatwidgetbase.ui

Lines changed: 19 additions & 263 deletions
Original file line numberDiff line numberDiff line change
@@ -4126,9 +4126,9 @@ font-style: italic;</string>
41264126
<property name="geometry">
41274127
<rect>
41284128
<x>0</x>
4129-
<y>-601</y>
4129+
<y>0</y>
41304130
<width>471</width>
4131-
<height>1459</height>
4131+
<height>1352</height>
41324132
</rect>
41334133
</property>
41344134
<layout class="QVBoxLayout" name="verticalLayout_11">
@@ -4145,254 +4145,21 @@ font-style: italic;</string>
41454145
<number>0</number>
41464146
</property>
41474147
<item>
4148-
<widget class="QFrame" name="mPlacementTypeFrame">
4149-
<property name="sizePolicy">
4150-
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
4151-
<horstretch>0</horstretch>
4152-
<verstretch>0</verstretch>
4153-
</sizepolicy>
4154-
</property>
4155-
<property name="frameShape">
4156-
<enum>QFrame::NoFrame</enum>
4157-
</property>
4158-
<property name="frameShadow">
4159-
<enum>QFrame::Sunken</enum>
4148+
<layout class="QHBoxLayout" name="horizontalLayout_14" stretch="0,1">
4149+
<property name="topMargin">
4150+
<number>0</number>
41604151
</property>
4161-
<layout class="QVBoxLayout" name="verticalLayout_9">
4162-
<property name="leftMargin">
4163-
<number>0</number>
4164-
</property>
4165-
<property name="topMargin">
4166-
<number>0</number>
4167-
</property>
4168-
<property name="rightMargin">
4169-
<number>0</number>
4170-
</property>
4171-
<property name="bottomMargin">
4172-
<number>0</number>
4173-
</property>
4174-
<item>
4175-
<widget class="QStackedWidget" name="stackedPlacement">
4176-
<property name="frameShape">
4177-
<enum>QFrame::NoFrame</enum>
4178-
</property>
4179-
<property name="frameShadow">
4180-
<enum>QFrame::Sunken</enum>
4181-
</property>
4182-
<property name="currentIndex">
4183-
<number>2</number>
4184-
</property>
4185-
<widget class="QWidget" name="pagePoint">
4186-
<layout class="QGridLayout" name="gridLayout_13" columnstretch="0,0,0,0">
4187-
<property name="leftMargin">
4188-
<number>0</number>
4189-
</property>
4190-
<property name="topMargin">
4191-
<number>0</number>
4192-
</property>
4193-
<property name="rightMargin">
4194-
<number>0</number>
4195-
</property>
4196-
<property name="bottomMargin">
4197-
<number>0</number>
4198-
</property>
4199-
<item row="0" column="1">
4200-
<widget class="QRadioButton" name="radAroundPoint">
4201-
<property name="toolTip">
4202-
<string>Labels are placed in an equal radius circle around point features.</string>
4203-
</property>
4204-
<property name="text">
4205-
<string>Around point</string>
4206-
</property>
4207-
<property name="checked">
4208-
<bool>true</bool>
4209-
</property>
4210-
</widget>
4211-
</item>
4212-
<item row="0" column="2">
4213-
<widget class="QRadioButton" name="radOverPoint">
4214-
<property name="toolTip">
4215-
<string>Labels are placed at a fixed offset from the point.</string>
4216-
</property>
4217-
<property name="text">
4218-
<string>Offset from point</string>
4219-
</property>
4220-
</widget>
4221-
</item>
4222-
<item row="0" column="0">
4223-
<widget class="QRadioButton" name="radPredefinedOrder">
4224-
<property name="toolTip">
4225-
<string>Uses 'ideal' cartographic placements, prioritizing label placement with best visual relationship with the point feature</string>
4226-
</property>
4227-
<property name="text">
4228-
<string>Cartographic</string>
4229-
</property>
4230-
</widget>
4231-
</item>
4232-
<item row="0" column="3">
4233-
<spacer name="horizontalSpacer_25">
4234-
<property name="orientation">
4235-
<enum>Qt::Horizontal</enum>
4236-
</property>
4237-
<property name="sizeHint" stdset="0">
4238-
<size>
4239-
<width>40</width>
4240-
<height>20</height>
4241-
</size>
4242-
</property>
4243-
</spacer>
4244-
</item>
4245-
</layout>
4246-
</widget>
4247-
<widget class="QWidget" name="pageLine">
4248-
<layout class="QGridLayout" name="gridLayout_14">
4249-
<property name="leftMargin">
4250-
<number>0</number>
4251-
</property>
4252-
<property name="topMargin">
4253-
<number>0</number>
4254-
</property>
4255-
<property name="rightMargin">
4256-
<number>0</number>
4257-
</property>
4258-
<property name="bottomMargin">
4259-
<number>0</number>
4260-
</property>
4261-
<item row="0" column="1">
4262-
<widget class="QRadioButton" name="radLineCurved">
4263-
<property name="sizePolicy">
4264-
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
4265-
<horstretch>0</horstretch>
4266-
<verstretch>0</verstretch>
4267-
</sizepolicy>
4268-
</property>
4269-
<property name="text">
4270-
<string>Curved</string>
4271-
</property>
4272-
</widget>
4273-
</item>
4274-
<item row="0" column="0">
4275-
<widget class="QRadioButton" name="radLineParallel">
4276-
<property name="sizePolicy">
4277-
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
4278-
<horstretch>0</horstretch>
4279-
<verstretch>0</verstretch>
4280-
</sizepolicy>
4281-
</property>
4282-
<property name="text">
4283-
<string>Parallel</string>
4284-
</property>
4285-
<property name="checked">
4286-
<bool>true</bool>
4287-
</property>
4288-
</widget>
4289-
</item>
4290-
<item row="0" column="2">
4291-
<widget class="QRadioButton" name="radLineHorizontal">
4292-
<property name="text">
4293-
<string>Horizontal</string>
4294-
</property>
4295-
</widget>
4296-
</item>
4297-
</layout>
4298-
</widget>
4299-
<widget class="QWidget" name="pagePolygon">
4300-
<layout class="QGridLayout" name="gridLayout_18">
4301-
<item row="0" column="0">
4302-
<widget class="QRadioButton" name="radOverCentroid">
4303-
<property name="sizePolicy">
4304-
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
4305-
<horstretch>0</horstretch>
4306-
<verstretch>0</verstretch>
4307-
</sizepolicy>
4308-
</property>
4309-
<property name="text">
4310-
<string>Offset from centroid</string>
4311-
</property>
4312-
<property name="checked">
4313-
<bool>true</bool>
4314-
</property>
4315-
</widget>
4316-
</item>
4317-
<item row="0" column="1">
4318-
<widget class="QRadioButton" name="radPolygonHorizontal">
4319-
<property name="text">
4320-
<string>Horizontal</string>
4321-
</property>
4322-
</widget>
4323-
</item>
4324-
<item row="1" column="1">
4325-
<widget class="QRadioButton" name="radPolygonFree">
4326-
<property name="text">
4327-
<string>Free (angled)</string>
4328-
</property>
4329-
</widget>
4330-
</item>
4331-
<item row="1" column="0">
4332-
<widget class="QRadioButton" name="radAroundCentroid">
4333-
<property name="sizePolicy">
4334-
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
4335-
<horstretch>0</horstretch>
4336-
<verstretch>0</verstretch>
4337-
</sizepolicy>
4338-
</property>
4339-
<property name="text">
4340-
<string>Around centroid</string>
4341-
</property>
4342-
</widget>
4343-
</item>
4344-
<item row="2" column="0">
4345-
<widget class="QRadioButton" name="radPolygonPerimeter">
4346-
<property name="sizePolicy">
4347-
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
4348-
<horstretch>0</horstretch>
4349-
<verstretch>0</verstretch>
4350-
</sizepolicy>
4351-
</property>
4352-
<property name="text">
4353-
<string>Using perimeter</string>
4354-
</property>
4355-
</widget>
4356-
</item>
4357-
<item row="1" column="3">
4358-
<spacer name="horizontalSpacer_26">
4359-
<property name="orientation">
4360-
<enum>Qt::Horizontal</enum>
4361-
</property>
4362-
<property name="sizeHint" stdset="0">
4363-
<size>
4364-
<width>40</width>
4365-
<height>20</height>
4366-
</size>
4367-
</property>
4368-
</spacer>
4369-
</item>
4370-
<item row="2" column="1">
4371-
<widget class="QRadioButton" name="radPolygonPerimeterCurved">
4372-
<property name="sizePolicy">
4373-
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
4374-
<horstretch>0</horstretch>
4375-
<verstretch>0</verstretch>
4376-
</sizepolicy>
4377-
</property>
4378-
<property name="text">
4379-
<string>Using perimeter (curved)</string>
4380-
</property>
4381-
</widget>
4382-
</item>
4383-
<item row="3" column="0">
4384-
<widget class="QRadioButton" name="radPolygonOutside">
4385-
<property name="text">
4386-
<string>Outside polygons</string>
4387-
</property>
4388-
</widget>
4389-
</item>
4390-
</layout>
4391-
</widget>
4392-
</widget>
4393-
</item>
4394-
</layout>
4395-
</widget>
4152+
<item>
4153+
<widget class="QLabel" name="label_2">
4154+
<property name="text">
4155+
<string>Placement</string>
4156+
</property>
4157+
</widget>
4158+
</item>
4159+
<item>
4160+
<widget class="QComboBox" name="mPlacementModeComboBox"/>
4161+
</item>
4162+
</layout>
43964163
</item>
43974164
<item>
43984165
<widget class="QFrame" name="mPlacementLineFrame">
@@ -6053,7 +5820,7 @@ font-style: italic;</string>
60535820
<rect>
60545821
<x>0</x>
60555822
<y>0</y>
6056-
<width>430</width>
5823+
<width>471</width>
60575824
<height>708</height>
60585825
</rect>
60595826
</property>
@@ -7047,19 +6814,7 @@ font-style: italic;</string>
70476814
<tabstop>mShadowBlendCmbBx</tabstop>
70486815
<tabstop>mShadowBlendDDBtn</tabstop>
70496816
<tabstop>scrollArea_3</tabstop>
7050-
<tabstop>radOverCentroid</tabstop>
7051-
<tabstop>radPolygonHorizontal</tabstop>
7052-
<tabstop>radAroundCentroid</tabstop>
7053-
<tabstop>radPolygonFree</tabstop>
7054-
<tabstop>radPolygonPerimeter</tabstop>
7055-
<tabstop>radPolygonPerimeterCurved</tabstop>
7056-
<tabstop>radPolygonOutside</tabstop>
7057-
<tabstop>radPredefinedOrder</tabstop>
7058-
<tabstop>radAroundPoint</tabstop>
7059-
<tabstop>radOverPoint</tabstop>
7060-
<tabstop>radLineParallel</tabstop>
7061-
<tabstop>radLineCurved</tabstop>
7062-
<tabstop>radLineHorizontal</tabstop>
6817+
<tabstop>mPlacementModeComboBox</tabstop>
70636818
<tabstop>chkLineAbove</tabstop>
70646819
<tabstop>chkLineOn</tabstop>
70656820
<tabstop>chkLineBelow</tabstop>
@@ -7174,6 +6929,7 @@ font-style: italic;</string>
71746929
<tabstop>mChkNoObstacle</tabstop>
71756930
<tabstop>mIsObstacleDDBtn</tabstop>
71766931
<tabstop>mObstacleSettingsButton</tabstop>
6932+
<tabstop>mLineAnchorSettingsButton</tabstop>
71776933
</tabstops>
71786934
<resources>
71796935
<include location="../../images/images.qrc"/>

0 commit comments

Comments
 (0)
Please sign in to comment.