@@ -35,7 +35,9 @@ QgsComposerLegend::QgsComposerLegend( QgsComposition* composition )
35
35
, mGroupSpace( 2 )
36
36
, mLayerSpace( 2 )
37
37
, mSymbolSpace( 2 )
38
- , mIconLabelSpace( 2 ), mComposerMap( 0 )
38
+ , mIconLabelSpace( 2 )
39
+ , mComposerMap( 0 )
40
+
39
41
{
40
42
// QStringList idList = layerIdList();
41
43
// mLegendModel.setLayerSet( idList );
@@ -47,6 +49,8 @@ QgsComposerLegend::QgsComposerLegend( QgsComposition* composition )
47
49
48
50
mSymbolWidth = 7 ;
49
51
mSymbolHeight = 4 ;
52
+ mWrapChar = " " ;
53
+ mlineSpacing = 1.5 ;
50
54
adjustBoxSize ();
51
55
52
56
connect ( &mLegendModel , SIGNAL ( layersChanged () ), this , SLOT ( synchronizeWithModel () ) );
@@ -98,17 +102,22 @@ QSizeF QgsComposerLegend::paintAndDetermineSize( QPainter* painter )
98
102
// font metrics
99
103
100
104
// draw title
101
- currentYCoordinate += fontAscentMillimeters ( mTitleFont );
105
+ double currentItemMaxX = 0 ; // maximum x-coordinate for current item
102
106
if ( painter )
103
107
{
104
108
painter->setPen ( QColor ( 0 , 0 , 0 ) );
105
- drawText ( painter, mBoxSpace , currentYCoordinate, mTitle , mTitleFont );
109
+ QStringList lines = splitStringForWrapping ( mTitle );
110
+ for ( QStringList::Iterator titlePart = lines.begin (); titlePart != lines.end (); ++titlePart )
111
+ {
112
+ currentYCoordinate += fontAscentMillimeters ( mTitleFont );
113
+ drawText ( painter, mBoxSpace , currentYCoordinate, *titlePart, mTitleFont );
114
+ currentItemMaxX = 2 * mBoxSpace + textWidthMillimeters ( mTitleFont , *titlePart );
115
+ maxXCoord = qMax ( maxXCoord, currentItemMaxX );
116
+ if ( titlePart != lines.end () )
117
+ currentYCoordinate += mlineSpacing;
118
+ }
106
119
}
107
120
108
-
109
- maxXCoord = 2 * mBoxSpace + textWidthMillimeters ( mTitleFont , mTitle );
110
-
111
- double currentItemMaxX = 0 ; // maximum x-coordinate for current item
112
121
for ( int i = 0 ; i < numLayerItems; ++i )
113
122
{
114
123
currentLayerItem = rootItem->child ( i );
@@ -167,14 +176,20 @@ void QgsComposerLegend::drawGroupItem( QPainter* p, QgsComposerGroupItem* groupI
167
176
}
168
177
169
178
currentYCoord += mGroupSpace ;
170
- currentYCoord += fontAscentMillimeters ( mGroupFont ) ;
179
+ double currentMaxXCoord = 0 ;
171
180
172
181
p->setPen ( QColor ( 0 , 0 , 0 ) );
173
- drawText ( p, mBoxSpace , currentYCoord, groupItem->text (), mGroupFont );
174
182
175
- // maximum x-coordinate of current item
176
- double currentMaxXCoord = 2 * mBoxSpace + textWidthMillimeters ( mGroupFont , groupItem->text () );
177
- maxXCoord = qMax ( currentMaxXCoord, maxXCoord );
183
+ QStringList lines = splitStringForWrapping ( groupItem->text () );
184
+ for ( QStringList::Iterator groupPart = lines.begin (); groupPart != lines.end (); ++groupPart )
185
+ {
186
+ currentYCoord += fontAscentMillimeters ( mGroupFont );
187
+ drawText ( p, mBoxSpace , currentYCoord, *groupPart, mGroupFont );
188
+ currentMaxXCoord = 2 * mBoxSpace + textWidthMillimeters ( mGroupFont , *groupPart );
189
+ maxXCoord = qMax ( currentMaxXCoord, maxXCoord );
190
+ if ( groupPart != lines.end () )
191
+ currentYCoord += mlineSpacing;
192
+ }
178
193
179
194
// children can be other group items or layer items
180
195
int numChildItems = groupItem->rowCount ();
@@ -216,16 +231,22 @@ void QgsComposerLegend::drawLayerItem( QPainter* p, QgsComposerLayerItem* layerI
216
231
if ( !layerItem->text ().isEmpty () )
217
232
{
218
233
currentYCoord += mLayerSpace ;
219
- currentYCoord += fontAscentMillimeters ( mLayerFont );
220
234
221
235
// draw layer Item
222
236
if ( p )
223
237
{
224
238
p->setPen ( QColor ( 0 , 0 , 0 ) );
225
- drawText ( p, mBoxSpace , currentYCoord, layerItem->text (), mLayerFont );
226
- }
227
239
228
- maxXCoord = qMax ( maxXCoord, 2 * mBoxSpace + textWidthMillimeters ( mLayerFont , layerItem->text () ) );
240
+ QStringList lines = splitStringForWrapping ( layerItem->text () );
241
+ for ( QStringList::Iterator layerItemPart = lines.begin (); layerItemPart != lines.end (); ++layerItemPart )
242
+ {
243
+ currentYCoord += fontAscentMillimeters ( mLayerFont );
244
+ drawText ( p, mBoxSpace , currentYCoord, *layerItemPart , mLayerFont );
245
+ maxXCoord = qMax ( maxXCoord, 2 * mBoxSpace + textWidthMillimeters ( mLayerFont , *layerItemPart ) );
246
+ if ( layerItemPart != lines.end () )
247
+ currentYCoord += mlineSpacing ;
248
+ }
249
+ }
229
250
}
230
251
else // layer title omited
231
252
{
@@ -282,6 +303,8 @@ void QgsComposerLegend::drawLayerChildItems( QPainter* p, QStandardItem* layerIt
282
303
continue ;
283
304
}
284
305
306
+ int lineCount = splitStringForWrapping ( currentItem->text () ).count ();
307
+
285
308
QgsSymbol* symbol = 0 ;
286
309
QgsComposerSymbolItem* symbolItem = dynamic_cast <QgsComposerSymbolItem*>( currentItem );
287
310
if ( symbolItem )
@@ -333,7 +356,7 @@ void QgsComposerLegend::drawLayerChildItems( QPainter* p, QStandardItem* layerIt
333
356
334
357
childYCoords.push_back ( currentYCoord );
335
358
realItemHeights.push_back ( realItemHeight );
336
- currentYCoord += realItemHeight;
359
+ currentYCoord += lineCount > 0 ? ( realItemHeight + mlineSpacing ) * lineCount : realItemHeight;
337
360
textAlignCoord = qMax ( currentXCoord, textAlignCoord );
338
361
}
339
362
@@ -343,8 +366,16 @@ void QgsComposerLegend::drawLayerChildItems( QPainter* p, QStandardItem* layerIt
343
366
if ( p )
344
367
{
345
368
p->setPen ( QColor ( 0 , 0 , 0 ) );
346
- drawText ( p, textAlignCoord, childYCoords.at ( i ) + textHeight + ( realItemHeights.at ( i ) - textHeight ) / 2 , layerItem->child ( i, 0 )->text (), mItemFont );
347
- maxXCoord = qMax ( maxXCoord, textAlignCoord + mBoxSpace + textWidthMillimeters ( mItemFont , layerItem->child ( i, 0 )->text () ) );
369
+
370
+ QStringList lines = splitStringForWrapping ( layerItem->child ( i, 0 )->text () );
371
+ double textY = childYCoords.at ( i ) + textHeight + ( realItemHeights.at ( i ) - textHeight ) / 2 ;
372
+ for ( QStringList::Iterator itemPart = lines.begin (); itemPart != lines.end (); ++itemPart )
373
+ {
374
+ drawText ( p, textAlignCoord, textY , *itemPart , mItemFont );
375
+ maxXCoord = qMax ( maxXCoord, textAlignCoord + mBoxSpace + textWidthMillimeters ( mItemFont , *itemPart ) );
376
+ if ( itemPart != lines.end () )
377
+ textY += mlineSpacing + textHeight + ( realItemHeights.at ( i ) - textHeight ) / 2 ;
378
+ }
348
379
}
349
380
}
350
381
}
@@ -649,6 +680,7 @@ bool QgsComposerLegend::writeXML( QDomElement& elem, QDomDocument & doc ) const
649
680
composerLegendElem.setAttribute ( " iconLabelSpace" , QString::number ( mIconLabelSpace ) );
650
681
composerLegendElem.setAttribute ( " symbolWidth" , mSymbolWidth );
651
682
composerLegendElem.setAttribute ( " symbolHeight" , mSymbolHeight );
683
+ composerLegendElem.setAttribute ( " wrapChar" , mWrapChar );
652
684
653
685
if ( mComposerMap )
654
686
{
@@ -706,6 +738,8 @@ bool QgsComposerLegend::readXML( const QDomElement& itemElem, const QDomDocument
706
738
mSymbolWidth = itemElem.attribute ( " symbolWidth" , " 7.0" ).toDouble ();
707
739
mSymbolHeight = itemElem.attribute ( " symbolHeight" , " 14.0" ).toDouble ();
708
740
741
+ mWrapChar = itemElem.attribute ( " wrapChar" );
742
+
709
743
// composer map
710
744
if ( !itemElem.attribute ( " map" ).isEmpty () )
711
745
{
@@ -743,3 +777,14 @@ void QgsComposerLegend::invalidateCurrentMap()
743
777
disconnect ( mComposerMap , SIGNAL ( destroyed ( QObject* ) ), this , SLOT ( invalidateCurrentMap () ) );
744
778
mComposerMap = 0 ;
745
779
}
780
+
781
+ QStringList QgsComposerLegend::splitStringForWrapping ( QString stringToSplt )
782
+ {
783
+ QStringList list;
784
+ // If the string contains nothing then just return the string without spliting.
785
+ if ( mWrapChar .count () == 0 )
786
+ list << stringToSplt;
787
+ else
788
+ list = stringToSplt.split ( mWrapChar );
789
+ return list;
790
+ }
0 commit comments