Skip to content

Commit 7088008

Browse files
committedJan 10, 2019
Avoid duplicate code
1 parent 32126ca commit 7088008

File tree

2 files changed

+89
-298
lines changed

2 files changed

+89
-298
lines changed
 

‎src/core/qgslegendrenderer.cpp

Lines changed: 83 additions & 297 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,17 @@ void QgsLegendRenderer::drawLegend( QPainter *painter )
4444
paintAndDetermineSize( painter );
4545
}
4646

47-
4847
QSizeF QgsLegendRenderer::paintAndDetermineSize( QPainter *painter )
48+
{
49+
return paintAndDetermineSizeInternal( nullptr, painter );
50+
}
51+
52+
QSizeF QgsLegendRenderer::paintAndDetermineSizeInternal( QgsRenderContext *context, QPainter *painter )
4953
{
5054
QSizeF size( 0, 0 );
5155
QgsLayerTreeGroup *rootGroup = mLegendModel->rootGroup();
52-
if ( !rootGroup ) return size;
56+
if ( !rootGroup )
57+
return size;
5358

5459
QList<Atom> atomList = createAtomList( rootGroup, mSettings.splitLayer() );
5560

@@ -98,7 +103,8 @@ QSizeF QgsLegendRenderer::paintAndDetermineSize( QPainter *painter )
98103
point.ry() += spaceAboveAtom( atom );
99104
}
100105

101-
QSizeF atomSize = drawAtom( atom, painter, point );
106+
QSizeF atomSize = context ? drawAtom( atom, context, point )
107+
: drawAtom( atom, painter, point );
102108
columnWidth = std::max( atomSize.width(), columnWidth );
103109

104110
point.ry() += atom.size.height();
@@ -139,7 +145,10 @@ QSizeF QgsLegendRenderer::paintAndDetermineSize( QPainter *painter )
139145
point.rx() = size.width() - mSettings.boxSpace();
140146
}
141147
point.ry() = mSettings.boxSpace();
142-
drawTitle( painter, point, mSettings.titleAlignment(), size.width() );
148+
if ( context )
149+
drawTitle( context, point, mSettings.titleAlignment(), size.width() );
150+
else
151+
drawTitle( painter, point, mSettings.titleAlignment(), size.width() );
143152
}
144153

145154
return size;
@@ -355,8 +364,12 @@ void QgsLegendRenderer::setColumns( QList<Atom> &atomList )
355364
}
356365
}
357366

358-
359367
QSizeF QgsLegendRenderer::drawTitle( QPainter *painter, QPointF point, Qt::AlignmentFlag halignment, double legendWidth )
368+
{
369+
return drawTitleInternal( nullptr, painter, point, halignment, legendWidth );
370+
}
371+
372+
QSizeF QgsLegendRenderer::drawTitleInternal( QgsRenderContext *context, QPainter *painter, QPointF point, Qt::AlignmentFlag halignment, double legendWidth )
360373
{
361374
QSizeF size( 0, 0 );
362375
if ( mSettings.title().isEmpty() )
@@ -367,7 +380,11 @@ QSizeF QgsLegendRenderer::drawTitle( QPainter *painter, QPointF point, Qt::Align
367380
QStringList lines = mSettings.splitStringForWrapping( mSettings.title() );
368381
double y = point.y();
369382

370-
if ( painter )
383+
if ( context )
384+
{
385+
context->painter()->setPen( mSettings.fontColor() );
386+
}
387+
else if ( painter )
371388
{
372389
painter->setPen( mSettings.fontColor() );
373390
}
@@ -403,7 +420,11 @@ QSizeF QgsLegendRenderer::drawTitle( QPainter *painter, QPointF point, Qt::Align
403420

404421
QRectF r( textBoxLeft, y, textBoxWidth, height );
405422

406-
if ( painter )
423+
if ( context->painter() )
424+
{
425+
mSettings.drawText( context->painter(), r, *titlePart, titleFont, halignment, Qt::AlignVCenter, Qt::TextDontClip );
426+
}
427+
else if ( painter )
407428
{
408429
mSettings.drawText( painter, r, *titlePart, titleFont, halignment, Qt::AlignVCenter, Qt::TextDontClip );
409430
}
@@ -449,6 +470,11 @@ double QgsLegendRenderer::spaceAboveAtom( const Atom &atom )
449470

450471
// Draw atom and expand its size (using actual nucleons labelXOffset)
451472
QSizeF QgsLegendRenderer::drawAtom( const Atom &atom, QPainter *painter, QPointF point )
473+
{
474+
return drawAtomInteral( atom, nullptr, painter, point );
475+
}
476+
477+
QSizeF QgsLegendRenderer::drawAtomInteral( const Atom &atom, QgsRenderContext *context, QPainter *painter, QPointF point )
452478
{
453479
bool first = true;
454480
QSizeF size = QSizeF( atom.size );
@@ -463,7 +489,10 @@ QSizeF QgsLegendRenderer::drawAtom( const Atom &atom, QPainter *painter, QPointF
463489
{
464490
point.ry() += mSettings.style( s ).margin( QgsLegendStyle::Top );
465491
}
466-
drawGroupTitle( groupItem, painter, point );
492+
if ( context )
493+
drawGroupTitle( groupItem, context, point );
494+
else
495+
drawGroupTitle( groupItem, painter, point );
467496
}
468497
}
469498
else if ( QgsLayerTreeLayer *layerItem = qobject_cast<QgsLayerTreeLayer *>( nucleon.item ) )
@@ -475,7 +504,10 @@ QSizeF QgsLegendRenderer::drawAtom( const Atom &atom, QPainter *painter, QPointF
475504
{
476505
point.ry() += mSettings.style( s ).margin( QgsLegendStyle::Top );
477506
}
478-
drawLayerTitle( layerItem, painter, point );
507+
if ( context )
508+
drawLayerTitle( layerItem, context, point );
509+
else
510+
drawLayerTitle( layerItem, painter, point );
479511
}
480512
}
481513
else if ( QgsLayerTreeModelLegendNode *legendNode = qobject_cast<QgsLayerTreeModelLegendNode *>( nucleon.item ) )
@@ -485,7 +517,8 @@ QSizeF QgsLegendRenderer::drawAtom( const Atom &atom, QPainter *painter, QPointF
485517
point.ry() += mSettings.style( QgsLegendStyle::Symbol ).margin( QgsLegendStyle::Top );
486518
}
487519

488-
Nucleon symbolNucleon = drawSymbolItem( legendNode, painter, point, nucleon.labelXOffset );
520+
Nucleon symbolNucleon = context ? drawSymbolItem( legendNode, context, point, nucleon.labelXOffset )
521+
: drawSymbolItem( legendNode, painter, point, nucleon.labelXOffset );
489522
// expand width, it may be wider because of labelXOffset
490523
size.rwidth() = std::max( symbolNucleon.size.width(), size.width() );
491524
}
@@ -495,15 +528,20 @@ QSizeF QgsLegendRenderer::drawAtom( const Atom &atom, QPainter *painter, QPointF
495528
return size;
496529
}
497530

498-
499531
QgsLegendRenderer::Nucleon QgsLegendRenderer::drawSymbolItem( QgsLayerTreeModelLegendNode *symbolItem, QPainter *painter, QPointF point, double labelXOffset )
532+
{
533+
return drawSymbolItemInternal( symbolItem, nullptr, painter, point, labelXOffset );
534+
}
535+
536+
QgsLegendRenderer::Nucleon QgsLegendRenderer::drawSymbolItemInternal( QgsLayerTreeModelLegendNode *symbolItem, QgsRenderContext *context, QPainter *painter, QPointF point, double labelXOffset )
500537
{
501538
QgsLayerTreeModelLegendNode::ItemContext ctx;
502-
ctx.painter = painter;
539+
ctx.painter = context ? context->painter() : painter;
503540
ctx.point = point;
504541
ctx.labelXOffset = labelXOffset;
505542

506-
QgsLayerTreeModelLegendNode::ItemMetrics im = symbolItem->draw( mSettings, painter ? &ctx : nullptr );
543+
QgsLayerTreeModelLegendNode::ItemMetrics im = symbolItem->draw( mSettings, context ? &ctx
544+
: ( painter ? &ctx : nullptr ) );
507545

508546
Nucleon nucleon;
509547
nucleon.item = symbolItem;
@@ -516,8 +554,12 @@ QgsLegendRenderer::Nucleon QgsLegendRenderer::drawSymbolItem( QgsLayerTreeModelL
516554
return nucleon;
517555
}
518556

519-
520557
QSizeF QgsLegendRenderer::drawLayerTitle( QgsLayerTreeLayer *nodeLayer, QPainter *painter, QPointF point )
558+
{
559+
return drawLayerTitleInternal( nodeLayer, nullptr, painter, point );
560+
}
561+
562+
QSizeF QgsLegendRenderer::drawLayerTitleInternal( QgsLayerTreeLayer *nodeLayer, QgsRenderContext *context, QPainter *painter, QPointF point )
521563
{
522564
QSizeF size( 0, 0 );
523565
QModelIndex idx = mLegendModel->node2index( nodeLayer );
@@ -527,15 +569,21 @@ QSizeF QgsLegendRenderer::drawLayerTitle( QgsLayerTreeLayer *nodeLayer, QPainter
527569

528570
double y = point.y();
529571

530-
if ( painter ) painter->setPen( mSettings.fontColor() );
572+
if ( context && context->painter() )
573+
context->painter()->setPen( mSettings.fontColor() );
574+
else if ( painter )
575+
painter->setPen( mSettings.fontColor() );
531576

532577
QFont layerFont = mSettings.style( nodeLegendStyle( nodeLayer ) ).font();
533578

534579
QStringList lines = mSettings.splitStringForWrapping( mLegendModel->data( idx, Qt::DisplayRole ).toString() );
535580
for ( QStringList::Iterator layerItemPart = lines.begin(); layerItemPart != lines.end(); ++layerItemPart )
536581
{
537582
y += mSettings.fontAscentMillimeters( layerFont );
538-
if ( painter ) mSettings.drawText( painter, point.x(), y, *layerItemPart, layerFont );
583+
if ( context && context->painter() )
584+
mSettings.drawText( context->painter(), point.x(), y, *layerItemPart, layerFont );
585+
if ( painter )
586+
mSettings.drawText( painter, point.x(), y, *layerItemPart, layerFont );
539587
qreal width = mSettings.textWidthMillimeters( layerFont, *layerItemPart );
540588
size.rwidth() = std::max( width, size.width() );
541589
if ( layerItemPart != ( lines.end() - 1 ) )
@@ -549,23 +597,33 @@ QSizeF QgsLegendRenderer::drawLayerTitle( QgsLayerTreeLayer *nodeLayer, QPainter
549597
return size;
550598
}
551599

552-
553600
QSizeF QgsLegendRenderer::drawGroupTitle( QgsLayerTreeGroup *nodeGroup, QPainter *painter, QPointF point )
601+
{
602+
return drawGroupTitleInternal( nodeGroup, nullptr, painter, point );
603+
}
604+
605+
QSizeF QgsLegendRenderer::drawGroupTitleInternal( QgsLayerTreeGroup *nodeGroup, QgsRenderContext *context, QPainter *painter, QPointF point )
554606
{
555607
QSizeF size( 0, 0 );
556608
QModelIndex idx = mLegendModel->node2index( nodeGroup );
557609

558610
double y = point.y();
559611

560-
if ( painter ) painter->setPen( mSettings.fontColor() );
612+
if ( context && context->painter() )
613+
context->painter()->setPen( mSettings.fontColor() );
614+
else if ( painter )
615+
painter->setPen( mSettings.fontColor() );
561616

562617
QFont groupFont = mSettings.style( nodeLegendStyle( nodeGroup ) ).font();
563618

564619
QStringList lines = mSettings.splitStringForWrapping( mLegendModel->data( idx, Qt::DisplayRole ).toString() );
565620
for ( QStringList::Iterator groupPart = lines.begin(); groupPart != lines.end(); ++groupPart )
566621
{
567622
y += mSettings.fontAscentMillimeters( groupFont );
568-
if ( painter ) mSettings.drawText( painter, point.x(), y, *groupPart, groupFont );
623+
if ( context && context->painter() )
624+
mSettings.drawText( context->painter(), point.x(), y, *groupPart, groupFont );
625+
else if ( painter )
626+
mSettings.drawText( painter, point.x(), y, *groupPart, groupFont );
569627
qreal width = mSettings.textWidthMillimeters( groupFont, *groupPart );
570628
size.rwidth() = std::max( width, size.width() );
571629
if ( groupPart != ( lines.end() - 1 ) )
@@ -577,8 +635,6 @@ QSizeF QgsLegendRenderer::drawGroupTitle( QgsLayerTreeGroup *nodeGroup, QPainter
577635
return size;
578636
}
579637

580-
581-
582638
QgsLegendStyle::Style QgsLegendRenderer::nodeLegendStyle( QgsLayerTreeNode *node, QgsLayerTreeModel *model )
583639
{
584640
QString style = node->customProperty( QStringLiteral( "legend/title-style" ) ).toString();
@@ -631,307 +687,37 @@ void QgsLegendRenderer::setNodeLegendStyle( QgsLayerTreeNode *node, QgsLegendSty
631687
node->removeCustomProperty( QStringLiteral( "legend/title-style" ) );
632688
}
633689

634-
635-
//new version of classes using QgsRenderContext
636690
QSizeF QgsLegendRenderer::drawTitle( QgsRenderContext *rendercontext, QPointF point, Qt::AlignmentFlag halignment, double legendWidth )
637691
{
638-
QSizeF size( 0, 0 );
639-
if ( mSettings.title().isEmpty() )
640-
{
641-
return size;
642-
}
643-
644-
QStringList lines = mSettings.splitStringForWrapping( mSettings.title() );
645-
double y = point.y();
646-
647-
if ( rendercontext->painter() )
648-
{
649-
rendercontext->painter()->setPen( mSettings.fontColor() );
650-
}
651-
652-
//calculate width and left pos of rectangle to draw text into
653-
double textBoxWidth;
654-
double textBoxLeft;
655-
switch ( halignment )
656-
{
657-
case Qt::AlignHCenter:
658-
textBoxWidth = ( std::min( static_cast< double >( point.x() ), legendWidth - point.x() ) - mSettings.boxSpace() ) * 2.0;
659-
textBoxLeft = point.x() - textBoxWidth / 2.;
660-
break;
661-
case Qt::AlignRight:
662-
textBoxLeft = mSettings.boxSpace();
663-
textBoxWidth = point.x() - mSettings.boxSpace();
664-
break;
665-
case Qt::AlignLeft:
666-
default:
667-
textBoxLeft = point.x();
668-
textBoxWidth = legendWidth - point.x() - mSettings.boxSpace();
669-
break;
670-
}
671-
672-
QFont titleFont = mSettings.style( QgsLegendStyle::Title ).font();
673-
674-
for ( QStringList::Iterator titlePart = lines.begin(); titlePart != lines.end(); ++titlePart )
675-
{
676-
//last word is not drawn if rectangle width is exactly text width, so add 1
677-
//TODO - correctly calculate size of italicized text, since QFontMetrics does not
678-
qreal width = mSettings.textWidthMillimeters( titleFont, *titlePart ) + 1;
679-
qreal height = mSettings.fontAscentMillimeters( titleFont ) + mSettings.fontDescentMillimeters( titleFont );
680-
681-
QRectF r( textBoxLeft, y, textBoxWidth, height );
682-
683-
if ( rendercontext->painter() )
684-
{
685-
mSettings.drawText( rendercontext->painter(), r, *titlePart, titleFont, halignment, Qt::AlignVCenter, Qt::TextDontClip );
686-
}
687-
688-
//update max width of title
689-
size.rwidth() = std::max( width, size.rwidth() );
690-
691-
y += height;
692-
if ( titlePart != ( lines.end() - 1 ) )
693-
{
694-
y += mSettings.lineSpacing();
695-
}
696-
}
697-
size.rheight() = y - point.y();
698-
699-
return size;
692+
return drawTitleInternal( rendercontext, nullptr, point, halignment, legendWidth );
700693
}
701694

702-
703-
704-
// Draw atom and expand its size (using actual nucleons labelXOffset)
705695
QSizeF QgsLegendRenderer::drawAtom( const Atom &atom, QgsRenderContext *rendercontext, QPointF point )
706696
{
707-
bool first = true;
708-
QSizeF size = QSizeF( atom.size );
709-
Q_FOREACH ( const Nucleon &nucleon, atom.nucleons )
710-
{
711-
if ( QgsLayerTreeGroup *groupItem = qobject_cast<QgsLayerTreeGroup *>( nucleon.item ) )
712-
{
713-
QgsLegendStyle::Style s = nodeLegendStyle( groupItem );
714-
if ( s != QgsLegendStyle::Hidden )
715-
{
716-
if ( !first )
717-
{
718-
point.ry() += mSettings.style( s ).margin( QgsLegendStyle::Top );
719-
}
720-
drawGroupTitle( groupItem, rendercontext, point );
721-
}
722-
}
723-
else if ( QgsLayerTreeLayer *layerItem = qobject_cast<QgsLayerTreeLayer *>( nucleon.item ) )
724-
{
725-
QgsLegendStyle::Style s = nodeLegendStyle( layerItem );
726-
if ( s != QgsLegendStyle::Hidden )
727-
{
728-
if ( !first )
729-
{
730-
point.ry() += mSettings.style( s ).margin( QgsLegendStyle::Top );
731-
}
732-
drawLayerTitle( layerItem, rendercontext, point );
733-
}
734-
}
735-
else if ( QgsLayerTreeModelLegendNode *legendNode = qobject_cast<QgsLayerTreeModelLegendNode *>( nucleon.item ) )
736-
{
737-
if ( !first )
738-
{
739-
point.ry() += mSettings.style( QgsLegendStyle::Symbol ).margin( QgsLegendStyle::Top );
740-
}
741-
742-
Nucleon symbolNucleon = drawSymbolItem( legendNode, rendercontext, point, nucleon.labelXOffset );
743-
// expand width, it may be wider because of labelXOffset
744-
size.rwidth() = std::max( symbolNucleon.size.width(), size.width() );
745-
}
746-
point.ry() += nucleon.size.height();
747-
first = false;
748-
}
749-
return size;
697+
return drawAtomInteral( atom, rendercontext, nullptr, point );
750698
}
751699

752-
753700
QgsLegendRenderer::Nucleon QgsLegendRenderer::drawSymbolItem( QgsLayerTreeModelLegendNode *symbolItem, QgsRenderContext *rendercontext, QPointF point, double labelXOffset )
754701
{
755-
QgsLayerTreeModelLegendNode::ItemContext ctx;
756-
ctx.painter = rendercontext->painter();
757-
ctx.point = point;
758-
ctx.labelXOffset = labelXOffset;
759-
760-
QgsLayerTreeModelLegendNode::ItemMetrics im = symbolItem->draw( mSettings, rendercontext ? &ctx : nullptr );
761-
762-
Nucleon nucleon;
763-
nucleon.item = symbolItem;
764-
nucleon.symbolSize = im.symbolSize;
765-
nucleon.labelSize = im.labelSize;
766-
//QgsDebugMsg( QStringLiteral( "symbol height = %1 label height = %2").arg( symbolSize.height()).arg( labelSize.height() ));
767-
double width = std::max( static_cast< double >( im.symbolSize.width() ), labelXOffset ) + im.labelSize.width();
768-
double height = std::max( im.symbolSize.height(), im.labelSize.height() );
769-
nucleon.size = QSizeF( width, height );
770-
return nucleon;
702+
return drawSymbolItemInternal( symbolItem, rendercontext, nullptr, point, labelXOffset );
771703
}
772704

773-
774705
QSizeF QgsLegendRenderer::drawLayerTitle( QgsLayerTreeLayer *nodeLayer, QgsRenderContext *rendercontext, QPointF point )
775706
{
776-
QSizeF size( 0, 0 );
777-
QModelIndex idx = mLegendModel->node2index( nodeLayer );
778-
779-
//Let the user omit the layer title item by having an empty layer title string
780-
if ( mLegendModel->data( idx, Qt::DisplayRole ).toString().isEmpty() ) return size;
781-
782-
double y = point.y();
783-
784-
if ( rendercontext->painter() ) rendercontext->painter()->setPen( mSettings.fontColor() );
785-
786-
QFont layerFont = mSettings.style( nodeLegendStyle( nodeLayer ) ).font();
787-
788-
QStringList lines = mSettings.splitStringForWrapping( mLegendModel->data( idx, Qt::DisplayRole ).toString() );
789-
for ( QStringList::Iterator layerItemPart = lines.begin(); layerItemPart != lines.end(); ++layerItemPart )
790-
{
791-
y += mSettings.fontAscentMillimeters( layerFont );
792-
if ( rendercontext->painter() ) mSettings.drawText( rendercontext->painter(), point.x(), y, *layerItemPart, layerFont );
793-
qreal width = mSettings.textWidthMillimeters( layerFont, *layerItemPart );
794-
size.rwidth() = std::max( width, size.width() );
795-
if ( layerItemPart != ( lines.end() - 1 ) )
796-
{
797-
y += mSettings.lineSpacing();
798-
}
799-
}
800-
size.rheight() = y - point.y();
801-
802-
return size;
707+
return drawLayerTitleInternal( nodeLayer, rendercontext, nullptr, point );
803708
}
804709

805-
806710
QSizeF QgsLegendRenderer::drawGroupTitle( QgsLayerTreeGroup *nodeGroup, QgsRenderContext *rendercontext, QPointF point )
807711
{
808-
QSizeF size( 0, 0 );
809-
QModelIndex idx = mLegendModel->node2index( nodeGroup );
810-
811-
double y = point.y();
812-
813-
if ( rendercontext->painter() ) rendercontext->painter()->setPen( mSettings.fontColor() );
814-
815-
QFont groupFont = mSettings.style( nodeLegendStyle( nodeGroup ) ).font();
816-
817-
QStringList lines = mSettings.splitStringForWrapping( mLegendModel->data( idx, Qt::DisplayRole ).toString() );
818-
for ( QStringList::Iterator groupPart = lines.begin(); groupPart != lines.end(); ++groupPart )
819-
{
820-
y += mSettings.fontAscentMillimeters( groupFont );
821-
if ( rendercontext->painter() ) mSettings.drawText( rendercontext->painter(), point.x(), y, *groupPart, groupFont );
822-
qreal width = mSettings.textWidthMillimeters( groupFont, *groupPart );
823-
size.rwidth() = std::max( width, size.width() );
824-
if ( groupPart != ( lines.end() - 1 ) )
825-
{
826-
y += mSettings.lineSpacing();
827-
}
828-
}
829-
size.rheight() = y - point.y();
830-
return size;
712+
return drawGroupTitleInternal( nodeGroup, rendercontext, nullptr, point );
831713
}
832714

833-
834715
void QgsLegendRenderer::drawLegend( QgsRenderContext &context )
835716
{
836717
paintAndDetermineSize( &context );
837718
}
838719

839720
QSizeF QgsLegendRenderer::paintAndDetermineSize( QgsRenderContext *context )
840721
{
841-
QSizeF size( 0, 0 );
842-
QgsLayerTreeGroup *rootGroup = mLegendModel->rootGroup();
843-
if ( !rootGroup ) return size;
844-
845-
QList<Atom> atomList = createAtomList( rootGroup, mSettings.splitLayer() );
846-
847-
setColumns( atomList );
848-
849-
qreal maxColumnWidth = 0;
850-
if ( mSettings.equalColumnWidth() )
851-
{
852-
Q_FOREACH ( const Atom &atom, atomList )
853-
{
854-
maxColumnWidth = std::max( atom.size.width(), maxColumnWidth );
855-
}
856-
}
857-
858-
//calculate size of title
859-
QSizeF titleSize = drawTitle();
860-
//add title margin to size of title text
861-
titleSize.rwidth() += mSettings.boxSpace() * 2.0;
862-
double columnTop = mSettings.boxSpace() + titleSize.height() + mSettings.style( QgsLegendStyle::Title ).margin( QgsLegendStyle::Bottom );
863-
864-
QPointF point( mSettings.boxSpace(), columnTop );
865-
bool firstInColumn = true;
866-
double columnMaxHeight = 0;
867-
qreal columnWidth = 0;
868-
int column = 0;
869-
Q_FOREACH ( const Atom &atom, atomList )
870-
{
871-
if ( atom.column > column )
872-
{
873-
// Switch to next column
874-
if ( mSettings.equalColumnWidth() )
875-
{
876-
point.rx() += mSettings.columnSpace() + maxColumnWidth;
877-
}
878-
else
879-
{
880-
point.rx() += mSettings.columnSpace() + columnWidth;
881-
}
882-
point.ry() = columnTop;
883-
columnWidth = 0;
884-
column++;
885-
firstInColumn = true;
886-
}
887-
if ( !firstInColumn )
888-
{
889-
point.ry() += spaceAboveAtom( atom );
890-
}
891-
892-
QSizeF atomSize = drawAtom( atom, context, point );
893-
columnWidth = std::max( atomSize.width(), columnWidth );
894-
895-
point.ry() += atom.size.height();
896-
columnMaxHeight = std::max( point.y() - columnTop, columnMaxHeight );
897-
898-
firstInColumn = false;
899-
}
900-
point.rx() += columnWidth + mSettings.boxSpace();
901-
902-
size.rheight() = columnTop + columnMaxHeight + mSettings.boxSpace();
903-
size.rwidth() = point.x();
904-
if ( !mSettings.title().isEmpty() )
905-
{
906-
size.rwidth() = std::max( titleSize.width(), size.width() );
907-
}
908-
909-
// override the size if it was set by the user
910-
if ( mLegendSize.isValid() )
911-
{
912-
qreal w = std::max( size.width(), mLegendSize.width() );
913-
qreal h = std::max( size.height(), mLegendSize.height() );
914-
size = QSizeF( w, h );
915-
}
916-
917-
// Now we have set the correct total item width and can draw the title centered
918-
if ( !mSettings.title().isEmpty() )
919-
{
920-
if ( mSettings.titleAlignment() == Qt::AlignLeft )
921-
{
922-
point.rx() = mSettings.boxSpace();
923-
}
924-
else if ( mSettings.titleAlignment() == Qt::AlignHCenter )
925-
{
926-
point.rx() = size.width() / 2;
927-
}
928-
else
929-
{
930-
point.rx() = size.width() - mSettings.boxSpace();
931-
}
932-
point.ry() = mSettings.boxSpace();
933-
drawTitle( context, point, mSettings.titleAlignment(), size.width() );
934-
}
935-
936-
return size;
722+
return paintAndDetermineSizeInternal( context, nullptr );
937723
}

‎src/core/qgslegendrenderer.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ class CORE_EXPORT QgsLegendRenderer
160160
class Atom
161161
{
162162
public:
163-
Atom();
164163

165164
//! List of child Nucleons belonging to this Atom.
166165
QList<Nucleon> nucleons;
@@ -294,6 +293,12 @@ class CORE_EXPORT QgsLegendRenderer
294293
QSizeF mLegendSize;
295294

296295
#endif
296+
QSizeF drawTitleInternal( QgsRenderContext *context, QPainter *painter, QPointF point, Qt::AlignmentFlag halignment, double legendWidth );
297+
QSizeF drawAtomInteral( const Atom &atom, QgsRenderContext *context, QPainter *painter, QPointF point );
298+
QgsLegendRenderer::Nucleon drawSymbolItemInternal( QgsLayerTreeModelLegendNode *symbolItem, QgsRenderContext *context, QPainter *painter, QPointF point, double labelXOffset );
299+
QSizeF drawLayerTitleInternal( QgsLayerTreeLayer *nodeLayer, QgsRenderContext *context, QPainter *painter, QPointF point );
300+
QSizeF drawGroupTitleInternal( QgsLayerTreeGroup *nodeGroup, QgsRenderContext *context, QPainter *painter, QPointF point );
301+
QSizeF paintAndDetermineSizeInternal( QgsRenderContext *context, QPainter *painter );
297302
};
298303

299304
#endif // QGSLEGENDRENDERER_H

0 commit comments

Comments
 (0)
Please sign in to comment.