@@ -135,13 +135,26 @@ void QgsLabel::renderLabel( QPainter * painter, QgsRect &viewExtent,
135135 {
136136 size = value.toDouble ();
137137 }
138- if ( mLabelAttributes ->sizeType () == QgsLabelAttributes::MapUnits )
138+ int sizeType;
139+ value = fieldValue ( SizeType, feature );
140+ if ( value.isEmpty () )
141+ sizeType = mLabelAttributes ->sizeType ();
142+ else
143+ {
144+ value = value.lower ();
145+ if ( value.compare (" mapunits" ) == 0 )
146+ sizeType = QgsLabelAttributes::MapUnits;
147+ else
148+ sizeType = QgsLabelAttributes::PointUnits;
149+ }
150+ if ( sizeType == QgsLabelAttributes::MapUnits )
139151 {
140152 size *= scale;
141153 } else {
142154 size *= sizeScale;
143155 }
144- font.setPointSizeFloat ( size );
156+ if (size>0.0 )
157+ font.setPointSizeFloat ( size );
145158
146159 value = fieldValue ( Color, feature );
147160 if ( value.isEmpty () )
@@ -215,23 +228,22 @@ void QgsLabel::renderLabel( QPainter * painter, QgsRect &viewExtent,
215228 else
216229 {
217230 value = value.lower ();
218- alignment = Qt::AlignCenter;
219- if ( value.compare (" left" ) == 0 )
220- {
221- alignment = Qt::AlignLeft | Qt::AlignVCenter;
222- }
223- else if ( value.compare (" right" ) == 0 )
224- {
225- alignment = Qt::AlignRight | Qt::AlignVCenter;
226- }
227- else if ( value.compare (" bottom" ) == 0 )
228- {
229- alignment = Qt::AlignBottom | Qt::AlignHCenter;
230- }
231- else if ( value.compare (" top" ) == 0 )
232- {
233- alignment = Qt::AlignTop | Qt::AlignHCenter;
234- }
231+
232+ alignment=0 ;
233+
234+ if ( value.contains (" left" ) )
235+ alignment |= Qt::AlignLeft;
236+ else if ( value.contains (" right" ) )
237+ alignment |= Qt::AlignRight;
238+ else
239+ alignment |= Qt::AlignHCenter;
240+
241+ if ( value.contains (" bottom" ) )
242+ alignment |= Qt::AlignBottom;
243+ else if ( value.contains (" top" ) )
244+ alignment |= Qt::AlignTop;
245+ else
246+ alignment |= Qt::AlignVCenter;
235247 }
236248
237249 if ( alignment & Qt::AlignLeft )
@@ -689,14 +701,22 @@ void QgsLabel::readXML( const QDomNode& node )
689701
690702 if ( scratchNode.isNull () )
691703 {
692- QgsDebugMsg (" couldn't find QgsLabel ``size'' attribute" );
704+ QgsDebugMsg (" couldn't find QgsLabel ``size'' attribute" );
693705 }
694706 else
695707 {
696- el = scratchNode.toElement ();
697- type = QgsLabelAttributes::unitsCode ( el.attribute (" units" ," " ) );
698- mLabelAttributes ->setSize ( el.attribute (" value" , " 0.0" ).toDouble (), type );
699- setLabelField ( Size, _elementFieldIndex (el) );
708+ el = scratchNode.toElement ();
709+ if ( !el.hasAttribute (" unitfield" ) )
710+ {
711+ type = QgsLabelAttributes::unitsCode ( el.attribute (" units" ," " ) );
712+ mLabelAttributes ->setSize ( el.attribute (" value" , " 0.0" ).toDouble (), type );
713+ }
714+ else
715+ {
716+ QString str = el.attribute (" unitfield" ," " );
717+ setLabelField ( SizeType, str==" " ? -1 : str.toInt () );
718+ }
719+ setLabelField ( Size, _elementFieldIndex (el) );
700720 }
701721
702722 /* Bold */
@@ -940,9 +960,18 @@ void QgsLabel::writeXML(std::ostream& xml)
940960 {
941961 if (mLabelFieldIdx [Size] != -1 )
942962 {
963+ if (mLabelFieldIdx [SizeType] != -1 )
964+ {
965+ xml << " \t\t\t <size value=\" " << mLabelAttributes ->size ()
966+ << " \" unitfield=\" " << mLabelFieldIdx [SizeType]
967+ << " \" field=\" " << mLabelFieldIdx [Size] << " \" />\n " ;
968+ }
969+ else
970+ {
943971 xml << " \t\t\t <size value=\" " << mLabelAttributes ->size ()
944972 << " \" units=\" " << (const char *)QgsLabelAttributes::unitsName (mLabelAttributes ->sizeType ()).utf8 ()
945973 << " \" field=\" " << mLabelFieldIdx [Size] << " \" />\n " ;
974+ }
946975 }
947976 else
948977 {
0 commit comments