Skip to content

Commit b8305c0

Browse files
committedMar 10, 2019
Make geometry generator configuration gui respect geometry type
1 parent cc08771 commit b8305c0

File tree

1 file changed

+66
-42
lines changed

1 file changed

+66
-42
lines changed
 

‎src/app/qgslabelinggui.cpp

Lines changed: 66 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ void QgsLabelingGui::registerDataDefinedButton( QgsPropertyOverrideButton *butto
5757
mButtons[key] = button;
5858
}
5959

60+
void QgsLabelingGui::setupWidget()
61+
{
62+
connect( mGeometryGeneratorGroupBox, &QGroupBox::toggled, this, &QgsLabelingGui::updateGeometryTypeBasedWidgets );
63+
connect( mGeometryGeneratorType, qgis::overload<int>::of( &QComboBox::currentIndexChanged ), this, &QgsLabelingGui::updateGeometryTypeBasedWidgets );
64+
}
65+
6066
void QgsLabelingGui::updateProperty()
6167
{
6268
QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() );
@@ -96,61 +102,23 @@ void QgsLabelingGui::setLayer( QgsMapLayer *mapLayer )
96102
setEnabled( false );
97103
return;
98104
}
99-
else
100-
{
101-
setEnabled( true );
102-
}
103105

104-
QgsVectorLayer *layer = qobject_cast<QgsVectorLayer *>( mapLayer );
106+
setEnabled( true );
107+
108+
QgsVectorLayer *layer = static_cast<QgsVectorLayer *>( mapLayer );
105109
mLayer = layer;
106110

107111
// load labeling settings from layer
108112
const QgsPalLayerSettings &lyr = mSettings;
109113

110-
// show/hide options based upon geometry type
111-
chkMergeLines->setVisible( mLayer->geometryType() == QgsWkbTypes::LineGeometry );
112-
mDirectSymbolsFrame->setVisible( mLayer->geometryType() == QgsWkbTypes::LineGeometry );
113-
mMinSizeFrame->setVisible( mLayer->geometryType() != QgsWkbTypes::PointGeometry );
114-
mPolygonObstacleTypeFrame->setVisible( mLayer->geometryType() == QgsWkbTypes::PolygonGeometry );
115-
mPolygonFeatureOptionsFrame->setVisible( mLayer->geometryType() == QgsWkbTypes::PolygonGeometry );
114+
updateGeometryTypeBasedWidgets();
116115

117116
mFieldExpressionWidget->setLayer( mLayer );
118117
QgsDistanceArea da;
119118
da.setSourceCrs( mLayer->crs(), QgsProject::instance()->transformContext() );
120119
da.setEllipsoid( QgsProject::instance()->ellipsoid() );
121120
mFieldExpressionWidget->setGeomCalculator( da );
122121

123-
// set placement methods page based on geometry type
124-
switch ( mLayer->geometryType() )
125-
{
126-
case QgsWkbTypes::PointGeometry:
127-
stackedPlacement->setCurrentWidget( pagePoint );
128-
break;
129-
case QgsWkbTypes::LineGeometry:
130-
stackedPlacement->setCurrentWidget( pageLine );
131-
break;
132-
case QgsWkbTypes::PolygonGeometry:
133-
stackedPlacement->setCurrentWidget( pagePolygon );
134-
break;
135-
case QgsWkbTypes::NullGeometry:
136-
break;
137-
case QgsWkbTypes::UnknownGeometry:
138-
qFatal( "unknown geometry type unexpected" );
139-
}
140-
141-
if ( mLayer->geometryType() == QgsWkbTypes::PointGeometry )
142-
{
143-
// follow placement alignment is only valid for point layers
144-
if ( mFontMultiLineAlignComboBox->findText( tr( "Follow label placement" ) ) == -1 )
145-
mFontMultiLineAlignComboBox->addItem( tr( "Follow label placement" ) );
146-
}
147-
else
148-
{
149-
int idx = mFontMultiLineAlignComboBox->findText( tr( "Follow label placement" ) );
150-
if ( idx >= 0 )
151-
mFontMultiLineAlignComboBox->removeItem( idx );
152-
}
153-
154122
mFieldExpressionWidget->setEnabled( mMode == Labels );
155123
mLabelingFrame->setEnabled( mMode == Labels );
156124

@@ -274,6 +242,10 @@ void QgsLabelingGui::setLayer( QgsMapLayer *mapLayer )
274242

275243
mZIndexSpinBox->setValue( lyr.zIndex );
276244

245+
mGeometryGenerator->setText( lyr.geometryGenerator );
246+
mGeometryGeneratorGroupBox->setChecked( lyr.geometryGeneratorEnabled );
247+
mGeometryGeneratorType->setCurrentIndex( mGeometryGeneratorType->findData( lyr.geometryGeneratorType ) );
248+
277249
mDataDefinedProperties = lyr.dataDefinedProperties();
278250

279251
updatePlacementWidgets();
@@ -442,6 +414,9 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
442414
lyr.useMaxLineLengthForAutoWrap = mAutoWrapTypeComboBox->currentIndex() == 0;
443415
lyr.multilineAlign = ( QgsPalLayerSettings::MultiLineAlign ) mFontMultiLineAlignComboBox->currentIndex();
444416
lyr.preserveRotation = chkPreserveRotation->isChecked();
417+
lyr.geometryGenerator = mGeometryGenerator->text();
418+
lyr.geometryGeneratorType = mGeometryGeneratorType->currentData().value<QgsWkbTypes::GeometryType>();
419+
lyr.geometryGeneratorEnabled = mGeometryGeneratorGroupBox->isChecked();
445420

446421
lyr.zIndex = mZIndexSpinBox->value();
447422

@@ -668,3 +643,52 @@ void QgsLabelingGui::deactivateField( QgsPalLayerSettings::Property key )
668643
mDataDefinedProperties.setProperty( key, p );
669644
}
670645
}
646+
647+
void QgsLabelingGui::updateGeometryTypeBasedWidgets()
648+
{
649+
QgsWkbTypes::GeometryType geometryType;
650+
651+
if ( mGeometryGeneratorGroupBox->isChecked() )
652+
geometryType = mGeometryGeneratorType->currentData().value<QgsWkbTypes::GeometryType>();
653+
else
654+
geometryType = mLayer->geometryType();
655+
656+
// show/hide options based upon geometry type
657+
chkMergeLines->setVisible( geometryType == QgsWkbTypes::LineGeometry );
658+
mDirectSymbolsFrame->setVisible( geometryType == QgsWkbTypes::LineGeometry );
659+
mMinSizeFrame->setVisible( geometryType != QgsWkbTypes::PointGeometry );
660+
mPolygonObstacleTypeFrame->setVisible( geometryType == QgsWkbTypes::PolygonGeometry );
661+
mPolygonFeatureOptionsFrame->setVisible( geometryType == QgsWkbTypes::PolygonGeometry );
662+
663+
664+
// set placement methods page based on geometry type
665+
switch ( geometryType )
666+
{
667+
case QgsWkbTypes::PointGeometry:
668+
stackedPlacement->setCurrentWidget( pagePoint );
669+
break;
670+
case QgsWkbTypes::LineGeometry:
671+
stackedPlacement->setCurrentWidget( pageLine );
672+
break;
673+
case QgsWkbTypes::PolygonGeometry:
674+
stackedPlacement->setCurrentWidget( pagePolygon );
675+
break;
676+
case QgsWkbTypes::NullGeometry:
677+
break;
678+
case QgsWkbTypes::UnknownGeometry:
679+
qFatal( "unknown geometry type unexpected" );
680+
}
681+
682+
if ( geometryType == QgsWkbTypes::PointGeometry )
683+
{
684+
// follow placement alignment is only valid for point layers
685+
if ( mFontMultiLineAlignComboBox->findText( tr( "Follow label placement" ) ) == -1 )
686+
mFontMultiLineAlignComboBox->addItem( tr( "Follow label placement" ) );
687+
}
688+
else
689+
{
690+
int idx = mFontMultiLineAlignComboBox->findText( tr( "Follow label placement" ) );
691+
if ( idx >= 0 )
692+
mFontMultiLineAlignComboBox->removeItem( idx );
693+
}
694+
}

0 commit comments

Comments
 (0)
Please sign in to comment.