@@ -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
236266QgsLabelingGui::~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+
794851void 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+
880944void QgsLabelingGui::on_mXCoordinateComboBox_currentIndexChanged ( const QString & text )
881945{
882946 if ( text.isEmpty () ) // no data defined alignment without data defined position
0 commit comments