@@ -57,6 +57,12 @@ void QgsLabelingGui::registerDataDefinedButton( QgsPropertyOverrideButton *butto
57
57
mButtons [key] = button;
58
58
}
59
59
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
+
60
66
void QgsLabelingGui::updateProperty ()
61
67
{
62
68
QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender () );
@@ -96,61 +102,23 @@ void QgsLabelingGui::setLayer( QgsMapLayer *mapLayer )
96
102
setEnabled ( false );
97
103
return ;
98
104
}
99
- else
100
- {
101
- setEnabled ( true );
102
- }
103
105
104
- QgsVectorLayer *layer = qobject_cast<QgsVectorLayer *>( mapLayer );
106
+ setEnabled ( true );
107
+
108
+ QgsVectorLayer *layer = static_cast <QgsVectorLayer *>( mapLayer );
105
109
mLayer = layer;
106
110
107
111
// load labeling settings from layer
108
112
const QgsPalLayerSettings &lyr = mSettings ;
109
113
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 ();
116
115
117
116
mFieldExpressionWidget ->setLayer ( mLayer );
118
117
QgsDistanceArea da;
119
118
da.setSourceCrs ( mLayer ->crs (), QgsProject::instance ()->transformContext () );
120
119
da.setEllipsoid ( QgsProject::instance ()->ellipsoid () );
121
120
mFieldExpressionWidget ->setGeomCalculator ( da );
122
121
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
-
154
122
mFieldExpressionWidget ->setEnabled ( mMode == Labels );
155
123
mLabelingFrame ->setEnabled ( mMode == Labels );
156
124
@@ -274,6 +242,10 @@ void QgsLabelingGui::setLayer( QgsMapLayer *mapLayer )
274
242
275
243
mZIndexSpinBox ->setValue ( lyr.zIndex );
276
244
245
+ mGeometryGenerator ->setText ( lyr.geometryGenerator );
246
+ mGeometryGeneratorGroupBox ->setChecked ( lyr.geometryGeneratorEnabled );
247
+ mGeometryGeneratorType ->setCurrentIndex ( mGeometryGeneratorType ->findData ( lyr.geometryGeneratorType ) );
248
+
277
249
mDataDefinedProperties = lyr.dataDefinedProperties ();
278
250
279
251
updatePlacementWidgets ();
@@ -442,6 +414,9 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
442
414
lyr.useMaxLineLengthForAutoWrap = mAutoWrapTypeComboBox ->currentIndex () == 0 ;
443
415
lyr.multilineAlign = ( QgsPalLayerSettings::MultiLineAlign ) mFontMultiLineAlignComboBox ->currentIndex ();
444
416
lyr.preserveRotation = chkPreserveRotation->isChecked ();
417
+ lyr.geometryGenerator = mGeometryGenerator ->text ();
418
+ lyr.geometryGeneratorType = mGeometryGeneratorType ->currentData ().value <QgsWkbTypes::GeometryType>();
419
+ lyr.geometryGeneratorEnabled = mGeometryGeneratorGroupBox ->isChecked ();
445
420
446
421
lyr.zIndex = mZIndexSpinBox ->value ();
447
422
@@ -668,3 +643,52 @@ void QgsLabelingGui::deactivateField( QgsPalLayerSettings::Property key )
668
643
mDataDefinedProperties .setProperty ( key, p );
669
644
}
670
645
}
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