Skip to content

Commit 9ed5afb

Browse files
authoredJan 11, 2023
[Layout Legend] Children symbol node should obey spacing according to layer node mode
Fixes #50780
1 parent e1032d5 commit 9ed5afb

File tree

10 files changed

+81
-19
lines changed

10 files changed

+81
-19
lines changed
 

‎src/core/qgslegendrenderer.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
338338
else if ( QgsLayerTree::isLayer( node ) )
339339
{
340340
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );
341-
341+
QgsLegendStyle::Style layerStyle = nodeLegendStyle( nodeLayer );
342342
bool allowColumnSplit = false;
343343
switch ( nodeLayer->legendSplitBehavior() )
344344
{
@@ -356,7 +356,7 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
356356
LegendComponentGroup group;
357357
group.placeColumnBreakBeforeGroup = nodeLayer->customProperty( QStringLiteral( "legend/column-break" ) ).toInt();
358358

359-
if ( nodeLegendStyle( nodeLayer ) != QgsLegendStyle::Hidden )
359+
if ( layerStyle != QgsLegendStyle::Hidden )
360360
{
361361
LegendComponent component;
362362
component.item = node;
@@ -379,7 +379,16 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
379379
layerGroups.reserve( legendNodes.count() );
380380

381381
bool groupIsLayerGroup = true;
382-
382+
double symbolIndent = indent;
383+
switch ( layerStyle )
384+
{
385+
case QgsLegendStyle::Subgroup:
386+
case QgsLegendStyle::Group:
387+
symbolIndent += mSettings.style( layerStyle ).indent( );
388+
break;
389+
default:
390+
break;
391+
}
383392
for ( int j = 0; j < legendNodes.count(); j++ )
384393
{
385394
QgsLayerTreeModelLegendNode *legendNode = legendNodes.at( j );
@@ -412,7 +421,7 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
412421
group.size.rheight() += mSettings.style( QgsLegendStyle::Symbol ).margin( QgsLegendStyle::Top );
413422
}
414423
group.size.rheight() += symbolComponent.size.height();
415-
symbolComponent.indent = indent;
424+
symbolComponent.indent = symbolIndent;
416425
group.components.append( symbolComponent );
417426
}
418427
else
@@ -428,7 +437,7 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
428437
}
429438
LegendComponentGroup symbolGroup;
430439
symbolGroup.placeColumnBreakBeforeGroup = forceBreak;
431-
symbolComponent.indent = indent;
440+
symbolComponent.indent = symbolIndent;
432441
symbolGroup.components.append( symbolComponent );
433442
symbolGroup.size.rwidth() = symbolComponent.size.width();
434443
symbolGroup.size.rheight() = symbolComponent.size.height();

‎tests/src/core/testqgslegendrenderer.cpp

Lines changed: 67 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@ class TestQgsLegendRenderer : public QgsTest
168168
void testRightAlignTextRightAlignSymbol();
169169

170170
void testGroupHeadingSpacing();
171-
void testGroupIndent();
171+
void testGroupIndentSetup();
172+
void testGroupIndentDefault();
173+
void testGroupIndentRS();
174+
void testGroupIndentRT();
175+
void testGroupIndentRSRT();
172176

173177
void testMapUnits();
174178
void testTallSymbol();
@@ -695,20 +699,11 @@ void TestQgsLegendRenderer::testGroupHeadingSpacing()
695699
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_heading_spacing" ) ) );
696700
}
697701

698-
void TestQgsLegendRenderer::testGroupIndent()
702+
void TestQgsLegendRenderer::testGroupIndentSetup()
699703
{
700704
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
701705
sym->setColor( Qt::red );
702-
sym->setSize( sym->size() * 6 );
703-
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
704-
QVERIFY( catRenderer );
705-
catRenderer->updateCategorySymbol( 0, sym );
706-
707-
QgsLayerTreeModel legendModel( mRoot );
708-
QgsLegendSettings settings;
709-
710706
QgsLayerTreeGroup *grp2 = mRoot->addGroup( QStringLiteral( "Subgroup" ) );
711-
sym->setSize( sym->size() / 6 );
712707
grp2->setCustomProperty( QStringLiteral( "legend/title-style" ), QLatin1String( "subgroup" ) );
713708
for ( int i = 1; i <= 4; ++i )
714709
{
@@ -717,35 +712,93 @@ void TestQgsLegendRenderer::testGroupIndent()
717712
vl->setRenderer( new QgsSingleSymbolRenderer( sym->clone() ) );
718713
grp2->addLayer( vl );
719714
}
715+
}
716+
720717

718+
void TestQgsLegendRenderer::testGroupIndentDefault()
719+
{
720+
testGroupIndentSetup();
721+
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
722+
sym->setColor( Qt::red );
723+
sym->setSize( sym->size() * 6 );
724+
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
725+
QVERIFY( catRenderer );
726+
catRenderer->updateCategorySymbol( 0, sym );
727+
QgsLayerTreeModel legendModel( mRoot );
728+
QgsLegendSettings settings;
721729
settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 );
722730
settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 );
723731
_setStandardTestFont( settings, QStringLiteral( "Bold" ) );
724732

725733
QImage res = _renderLegend( &legendModel, settings );
726734
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_indent" ) ) );
735+
}
727736

737+
void TestQgsLegendRenderer::testGroupIndentRT()
738+
{
739+
testGroupIndentSetup();
740+
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
741+
sym->setColor( Qt::red );
742+
sym->setSize( sym->size() * 6 );
743+
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
744+
QVERIFY( catRenderer );
745+
catRenderer->updateCategorySymbol( 0, sym );
746+
QgsLayerTreeModel legendModel( mRoot );
747+
QgsLegendSettings settings;
748+
settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 );
749+
settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 );
750+
_setStandardTestFont( settings, QStringLiteral( "Bold" ) );
728751
settings.rstyle( QgsLegendStyle::Group ).setAlignment( Qt::AlignRight );
729752
settings.rstyle( QgsLegendStyle::Subgroup ).setAlignment( Qt::AlignRight );
730753
settings.rstyle( QgsLegendStyle::SymbolLabel ).setAlignment( Qt::AlignRight );
731754

732-
res = _renderLegend( &legendModel, settings );
755+
QImage res = _renderLegend( &legendModel, settings );
733756
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_indent_right_align_text" ) ) );
757+
}
734758

759+
void TestQgsLegendRenderer::testGroupIndentRS()
760+
{
761+
testGroupIndentSetup();
762+
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
763+
sym->setColor( Qt::red );
764+
sym->setSize( sym->size() * 6 );
765+
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
766+
QVERIFY( catRenderer );
767+
catRenderer->updateCategorySymbol( 0, sym );
768+
QgsLayerTreeModel legendModel( mRoot );
769+
QgsLegendSettings settings;
770+
settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 );
771+
settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 );
772+
_setStandardTestFont( settings, QStringLiteral( "Bold" ) );
735773
settings.rstyle( QgsLegendStyle::Group ).setAlignment( Qt::AlignLeft );
736774
settings.rstyle( QgsLegendStyle::Subgroup ).setAlignment( Qt::AlignLeft );
737775
settings.rstyle( QgsLegendStyle::SymbolLabel ).setAlignment( Qt::AlignLeft );
738776
settings.setSymbolAlignment( Qt::AlignRight );
739777

740-
res = _renderLegend( &legendModel, settings );
778+
QImage res = _renderLegend( &legendModel, settings );
741779
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_indent_right_align_symbol" ) ) );
780+
}
742781

782+
void TestQgsLegendRenderer::testGroupIndentRSRT()
783+
{
784+
testGroupIndentSetup();
785+
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
786+
sym->setColor( Qt::red );
787+
sym->setSize( sym->size() * 6 );
788+
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
789+
QVERIFY( catRenderer );
790+
catRenderer->updateCategorySymbol( 0, sym );
791+
QgsLayerTreeModel legendModel( mRoot );
792+
QgsLegendSettings settings;
793+
settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 );
794+
settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 );
795+
_setStandardTestFont( settings, QStringLiteral( "Bold" ) );
743796
settings.rstyle( QgsLegendStyle::Group ).setAlignment( Qt::AlignRight );
744797
settings.rstyle( QgsLegendStyle::Subgroup ).setAlignment( Qt::AlignRight );
745798
settings.rstyle( QgsLegendStyle::SymbolLabel ).setAlignment( Qt::AlignRight );
746799
settings.setSymbolAlignment( Qt::AlignRight );
747800

748-
res = _renderLegend( &legendModel, settings );
801+
QImage res = _renderLegend( &legendModel, settings );
749802
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_indent_right_align_symbol_right_align_text" ) ) );
750803
}
751804

Error rendering embedded code

Invalid image source.

Error rendering embedded code

Invalid image source.

0 commit comments

Comments
 (0)
Please sign in to comment.