Skip to content

Commit 61a5022

Browse files
committed
Add quadrant, offset, rotation for points/centroids in adv labeling
- Possible fix for #4634, #5256, #6162 - Uses GEOS to convert centroids to points before PAL solution - Implements #3492, #6285 - Convert PAL layer types 'over point/centroid' to 'offset from point/centroid' - Add quadrant offsets (above/below/right, etc. like in old labeling) - Add x and y offset, in mm or map unit, in addition to quadrant - Default for offset is set to map units (mm scales oddly with zoom) - Implements #4517, #6118; updates fix for #4317 - Rotation is independent of data defined columns - Rotation bounding box included in offset calculation - GUI spin box range set from -360 to +360 for initial dev testing - Keep from scaling letter/word spacing if set to 0
1 parent 5a0d2f5 commit 61a5022

File tree

5 files changed

+456
-20
lines changed

5 files changed

+456
-20
lines changed

src/app/qgslabelinggui.cpp

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,36 @@ QgsLabelingGui::QgsLabelingGui( QgsPalLabeling* lbl, QgsVectorLayer* layer, QgsM
9797

9898
// placement
9999
int distUnitIndex = lyr.distInMapUnits ? 1 : 0;
100+
mXQuadOffset = lyr.xQuadOffset;
101+
mYQuadOffset = lyr.yQuadOffset;
100102
switch ( lyr.placement )
101103
{
102104
case QgsPalLayerSettings::AroundPoint:
103105
radAroundPoint->setChecked( true );
104106
radAroundCentroid->setChecked( true );
105107
spinDistPoint->setValue( lyr.dist );
106108
mPointDistanceUnitComboBox->setCurrentIndex( distUnitIndex );
107-
//spinAngle->setValue(lyr.angle);
109+
//spinAngle->setValue( lyr.angle );
108110
break;
109111
case QgsPalLayerSettings::OverPoint:
110112
radOverPoint->setChecked( true );
111113
radOverCentroid->setChecked( true );
114+
115+
mPointOffsetRadioAboveLeft->setChecked( mXQuadOffset == -1 && mYQuadOffset == 1 );
116+
mPointOffsetRadioAbove->setChecked( mXQuadOffset == 0 && mYQuadOffset == 1 );
117+
mPointOffsetRadioAboveRight->setChecked( mXQuadOffset == 1 && mYQuadOffset == 1 );
118+
mPointOffsetRadioLeft->setChecked( mXQuadOffset == -1 && mYQuadOffset == 0 );
119+
mPointOffsetRadioOver->setChecked( mXQuadOffset == 0 && mYQuadOffset == 0 );
120+
mPointOffsetRadioRight->setChecked( mXQuadOffset == 1 && mYQuadOffset == 0 );
121+
mPointOffsetRadioBelowLeft->setChecked( mXQuadOffset == -1 && mYQuadOffset == -1 );
122+
mPointOffsetRadioBelow->setChecked( mXQuadOffset == 0 && mYQuadOffset == -1 );
123+
mPointOffsetRadioBelowRight->setChecked( mXQuadOffset == 1 && mYQuadOffset == -1 );
124+
125+
mPointOffsetXOffsetSpinBox->setValue( lyr.xOffset );
126+
mPointOffsetYOffsetSpinBox->setValue( lyr.yOffset );
127+
mPointOffsetUnitsComboBox->setCurrentIndex( lyr.labelOffsetInMapUnits ? 1 : 0 );
128+
mPointOffsetAngleSpinBox->setValue( lyr.angleOffset );
129+
112130
break;
113131
case QgsPalLayerSettings::Line:
114132
radLineParallel->setChecked( true );
@@ -231,6 +249,18 @@ QgsLabelingGui::QgsLabelingGui( QgsPalLabeling* lbl, QgsVectorLayer* layer, QgsM
231249
{
232250
connect( placementRadios[i], SIGNAL( toggled( bool ) ), this, SLOT( updateOptions() ) );
233251
}
252+
253+
// setup connections for label quadrant offsets
254+
QRadioButton* quadrantRadios[] =
255+
{
256+
mPointOffsetRadioAboveLeft, mPointOffsetRadioAbove, mPointOffsetRadioAboveRight,
257+
mPointOffsetRadioLeft, mPointOffsetRadioOver, mPointOffsetRadioRight,
258+
mPointOffsetRadioBelowLeft, mPointOffsetRadioBelow, mPointOffsetRadioBelowRight
259+
};
260+
for ( unsigned int i = 0; i < sizeof( quadrantRadios ) / sizeof( QRadioButton* ); i++ )
261+
{
262+
connect( quadrantRadios[i], SIGNAL( toggled( bool ) ), this, SLOT( updateQuadrant() ) );
263+
}
234264
}
235265

236266
QgsLabelingGui::~QgsLabelingGui()
@@ -270,6 +300,13 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
270300
|| ( stackedPlacement->currentWidget() == pagePolygon && radOverCentroid->isChecked() ) )
271301
{
272302
lyr.placement = QgsPalLayerSettings::OverPoint;
303+
304+
lyr.xQuadOffset = mXQuadOffset;
305+
lyr.yQuadOffset = mYQuadOffset;
306+
lyr.xOffset = mPointOffsetXOffsetSpinBox->value();
307+
lyr.yOffset = mPointOffsetYOffsetSpinBox->value();
308+
lyr.labelOffsetInMapUnits = ( mPointOffsetUnitsComboBox->currentIndex() == 1 );
309+
lyr.angleOffset = mPointOffsetAngleSpinBox->value();
273310
}
274311
else if (( stackedPlacement->currentWidget() == pageLine && radLineParallel->isChecked() )
275312
|| ( stackedPlacement->currentWidget() == pagePolygon && radPolygonPerimeter->isChecked() )
@@ -779,6 +816,11 @@ void QgsLabelingGui::updateOptions()
779816
{
780817
stackedOptions->setCurrentWidget( pageOptionsPoint );
781818
}
819+
else if (( stackedPlacement->currentWidget() == pagePoint && radOverPoint->isChecked() )
820+
|| ( stackedPlacement->currentWidget() == pagePolygon && radOverCentroid->isChecked() ) )
821+
{
822+
stackedOptions->setCurrentWidget( pageOptionsPointOffset );
823+
}
782824
else if (( stackedPlacement->currentWidget() == pageLine && radLineParallel->isChecked() )
783825
|| ( stackedPlacement->currentWidget() == pagePolygon && radPolygonPerimeter->isChecked() )
784826
|| ( stackedPlacement->currentWidget() == pageLine && radLineCurved->isChecked() ) )
@@ -791,6 +833,21 @@ void QgsLabelingGui::updateOptions()
791833
}
792834
}
793835

836+
void QgsLabelingGui::updateQuadrant()
837+
{
838+
if ( mPointOffsetRadioAboveLeft->isChecked() ) { mXQuadOffset = -1; mYQuadOffset = 1; };
839+
if ( mPointOffsetRadioAbove->isChecked() ) { mXQuadOffset = 0; mYQuadOffset = 1; };
840+
if ( mPointOffsetRadioAboveRight->isChecked() ) { mXQuadOffset = 1; mYQuadOffset = 1; };
841+
842+
if ( mPointOffsetRadioLeft->isChecked() ) { mXQuadOffset = -1; mYQuadOffset = 0; };
843+
if ( mPointOffsetRadioOver->isChecked() ) { mXQuadOffset = 0; mYQuadOffset = 0; };
844+
if ( mPointOffsetRadioRight->isChecked() ) { mXQuadOffset = 1; mYQuadOffset = 0; };
845+
846+
if ( mPointOffsetRadioBelowLeft->isChecked() ) { mXQuadOffset = -1; mYQuadOffset = -1; };
847+
if ( mPointOffsetRadioBelow->isChecked() ) { mXQuadOffset = 0; mYQuadOffset = -1; };
848+
if ( mPointOffsetRadioBelowRight->isChecked() ) { mXQuadOffset = 1; mYQuadOffset = -1; };
849+
}
850+
794851
void QgsLabelingGui::populateFontCapitalsComboBox()
795852
{
796853
mFontCapitalsComboBox->addItem( tr( "Mixed Case" ), QVariant( 0 ) );
@@ -877,6 +934,13 @@ void QgsLabelingGui::on_mBufferUnitComboBox_currentIndexChanged( int index )
877934
updateFont( mRefFont );
878935
}
879936

937+
void QgsLabelingGui::on_mPointOffsetUnitsComboBox_currentIndexChanged( int index )
938+
{
939+
double singleStep = ( index == 1 ) ? 1.0 : 0.1 ; //1.0 for map units, 0.1 for mm
940+
mPointOffsetXOffsetSpinBox->setSingleStep( singleStep );
941+
mPointOffsetYOffsetSpinBox->setSingleStep( singleStep );
942+
}
943+
880944
void QgsLabelingGui::on_mXCoordinateComboBox_currentIndexChanged( const QString & text )
881945
{
882946
if ( text.isEmpty() ) //no data defined alignment without data defined position

src/app/qgslabelinggui.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class QgsLabelingGui : public QWidget, private Ui::QgsLabelingGuiBase
4949
void updatePreview();
5050
void scrollPreview();
5151
void updateOptions();
52+
void updateQuadrant();
5253

5354
void on_mPreviewSizeSlider_valueChanged( int i );
5455
void on_mFontSizeSpinBox_valueChanged( double d );
@@ -60,6 +61,7 @@ class QgsLabelingGui : public QWidget, private Ui::QgsLabelingGuiBase
6061
void on_mFontLetterSpacingSpinBox_valueChanged( double spacing );
6162
void on_mFontSizeUnitComboBox_currentIndexChanged( int index );
6263
void on_mBufferUnitComboBox_currentIndexChanged( int index );
64+
void on_mPointOffsetUnitsComboBox_currentIndexChanged( int index );
6365
void on_mXCoordinateComboBox_currentIndexChanged( const QString & text );
6466
void on_mYCoordinateComboBox_currentIndexChanged( const QString & text );
6567

@@ -91,6 +93,9 @@ class QgsLabelingGui : public QWidget, private Ui::QgsLabelingGuiBase
9193
QFont mRefFont;
9294
int mPreviewSize;
9395

96+
int mXQuadOffset;
97+
int mYQuadOffset;
98+
9499
void disableDataDefinedAlignment();
95100
void enableDataDefinedAlignment();
96101
};

0 commit comments

Comments
 (0)