@@ -215,6 +215,9 @@ QgsPalLayerSettings::QgsPalLayerSettings()
215
215
addDirectionSymbol = false ;
216
216
upsidedownLabels = Upright;
217
217
fontSizeInMapUnits = false ;
218
+ fontLimitPixelSize = false ;
219
+ fontMinPixelSize = 0 ; // trigger to turn it on by default for map unit labels
220
+ fontMaxPixelSize = 10000 ;
218
221
bufferSizeInMapUnits = false ;
219
222
labelOffsetInMapUnits = true ;
220
223
distInMapUnits = false ;
@@ -265,6 +268,9 @@ QgsPalLayerSettings::QgsPalLayerSettings( const QgsPalLayerSettings& s )
265
268
addDirectionSymbol = s.addDirectionSymbol ;
266
269
upsidedownLabels = s.upsidedownLabels ;
267
270
fontSizeInMapUnits = s.fontSizeInMapUnits ;
271
+ fontLimitPixelSize = s.fontLimitPixelSize ;
272
+ fontMinPixelSize = s.fontMinPixelSize ;
273
+ fontMaxPixelSize = s.fontMaxPixelSize ;
268
274
bufferSizeInMapUnits = s.bufferSizeInMapUnits ;
269
275
distInMapUnits = s.distInMapUnits ;
270
276
labelOffsetInMapUnits = s.labelOffsetInMapUnits ;
@@ -448,6 +454,9 @@ void QgsPalLayerSettings::readFromLayer( QgsVectorLayer* layer )
448
454
upsidedownLabels = ( UpsideDownLabels ) layer->customProperty ( " labeling/upsidedownLabels" , QVariant ( Upright ) ).toUInt ();
449
455
minFeatureSize = layer->customProperty ( " labeling/minFeatureSize" ).toDouble ();
450
456
fontSizeInMapUnits = layer->customProperty ( " labeling/fontSizeInMapUnits" ).toBool ();
457
+ fontLimitPixelSize = layer->customProperty ( " labeling/fontLimitPixelSize" , QVariant ( false ) ).toBool ();
458
+ fontMinPixelSize = layer->customProperty ( " labeling/fontMinPixelSize" , QVariant ( 0 ) ).toInt ();
459
+ fontMaxPixelSize = layer->customProperty ( " labeling/fontMaxPixelSize" , QVariant ( 10000 ) ).toInt ();
451
460
bufferSizeInMapUnits = layer->customProperty ( " labeling/bufferSizeInMapUnits" ).toBool ();
452
461
distInMapUnits = layer->customProperty ( " labeling/distInMapUnits" ).toBool ();
453
462
labelOffsetInMapUnits = layer->customProperty ( " labeling/labelOffsetInMapUnits" , QVariant ( true ) ).toBool ();
@@ -509,6 +518,9 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer )
509
518
layer->setCustomProperty ( " labeling/upsidedownLabels" , ( unsigned int )upsidedownLabels );
510
519
layer->setCustomProperty ( " labeling/minFeatureSize" , minFeatureSize );
511
520
layer->setCustomProperty ( " labeling/fontSizeInMapUnits" , fontSizeInMapUnits );
521
+ layer->setCustomProperty ( " labeling/fontLimitPixelSize" , fontLimitPixelSize );
522
+ layer->setCustomProperty ( " labeling/fontMinPixelSize" , fontMinPixelSize );
523
+ layer->setCustomProperty ( " labeling/fontMaxPixelSize" , fontMaxPixelSize );
512
524
layer->setCustomProperty ( " labeling/bufferSizeInMapUnits" , bufferSizeInMapUnits );
513
525
layer->setCustomProperty ( " labeling/distInMapUnits" , distInMapUnits );
514
526
layer->setCustomProperty ( " labeling/labelOffsetInMapUnits" , labelOffsetInMapUnits );
@@ -658,6 +670,33 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
658
670
}
659
671
}
660
672
673
+ QFont labelFont = textFont;
674
+
675
+ // data defined label size?
676
+ QMap< DataDefinedProperties, int >::const_iterator it = dataDefinedProperties.find ( QgsPalLayerSettings::Size );
677
+ if ( it != dataDefinedProperties.constEnd () )
678
+ {
679
+ // find out size
680
+ QVariant size = f.attributeMap ().value ( *it );
681
+ if ( size.isValid () )
682
+ {
683
+ double sizeDouble = size.toDouble ();
684
+ if ( sizeDouble <= 0.0 || sizeToPixel ( sizeDouble, context ) < 1 )
685
+ {
686
+ return ;
687
+ }
688
+ labelFont.setPixelSize ( sizeToPixel ( sizeDouble, context ) );
689
+ }
690
+ }
691
+
692
+ // defined 'minimum/maximum pixel font size' option
693
+ // TODO: add any data defined setting to override fontMinPixelSize/fontMaxPixelSize
694
+ if ( fontLimitPixelSize && fontSizeInMapUnits &&
695
+ ( fontMinPixelSize > labelFont.pixelSize () || labelFont.pixelSize () > fontMaxPixelSize ) )
696
+ {
697
+ return ;
698
+ }
699
+
661
700
QString labelText;
662
701
663
702
// Check to see if we are a expression string.
@@ -695,28 +734,9 @@ void QgsPalLayerSettings::registerFeature( QgsVectorLayer* layer, QgsFeature& f
695
734
labelText = f.attributeMap ()[fieldIndex].toString ();
696
735
}
697
736
698
- double labelX, labelY; // will receive label size
699
- QFont labelFont = textFont;
700
-
701
- // data defined label size?
702
- QMap< DataDefinedProperties, int >::const_iterator it = dataDefinedProperties.find ( QgsPalLayerSettings::Size );
703
- if ( it != dataDefinedProperties.constEnd () )
704
- {
705
- // find out size
706
- QVariant size = f.attributeMap ().value ( *it );
707
- if ( size.isValid () )
708
- {
709
- double sizeDouble = size.toDouble ();
710
- if ( sizeDouble <= 0.0 || sizeToPixel ( sizeDouble, context ) < 1 )
711
- {
712
- return ;
713
- }
714
- labelFont.setPixelSize ( sizeToPixel ( sizeDouble, context ) );
715
- }
716
- }
717
-
718
- // this should come after any data defined option that affects font metrics
737
+ // this should come AFTER any data defined option that affects font metrics
719
738
QFontMetricsF* labelFontMetrics = new QFontMetricsF ( labelFont );
739
+ double labelX, labelY; // will receive label size
720
740
calculateLabelSize ( labelFontMetrics, labelText, labelX, labelY );
721
741
722
742
QgsGeometry* geom = f.geometry ();
0 commit comments