Skip to content

Commit

Permalink
[Layout Legend] Children symbol node should obey spacing according to…
Browse files Browse the repository at this point in the history
… layer node mode

Fixes #50780
  • Loading branch information
roya0045 committed Jan 11, 2023
1 parent e1032d5 commit 9ed5afb
Show file tree
Hide file tree
Showing 10 changed files with 81 additions and 19 deletions.
19 changes: 14 additions & 5 deletions src/core/qgslegendrenderer.cpp
Expand Up @@ -338,7 +338,7 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
else if ( QgsLayerTree::isLayer( node ) )
{
QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node );

QgsLegendStyle::Style layerStyle = nodeLegendStyle( nodeLayer );
bool allowColumnSplit = false;
switch ( nodeLayer->legendSplitBehavior() )
{
Expand All @@ -356,7 +356,7 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
LegendComponentGroup group;
group.placeColumnBreakBeforeGroup = nodeLayer->customProperty( QStringLiteral( "legend/column-break" ) ).toInt();

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

bool groupIsLayerGroup = true;

double symbolIndent = indent;
switch ( layerStyle )
{
case QgsLegendStyle::Subgroup:
case QgsLegendStyle::Group:
symbolIndent += mSettings.style( layerStyle ).indent( );
break;
default:
break;
}
for ( int j = 0; j < legendNodes.count(); j++ )
{
QgsLayerTreeModelLegendNode *legendNode = legendNodes.at( j );
Expand Down Expand Up @@ -412,7 +421,7 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
group.size.rheight() += mSettings.style( QgsLegendStyle::Symbol ).margin( QgsLegendStyle::Top );
}
group.size.rheight() += symbolComponent.size.height();
symbolComponent.indent = indent;
symbolComponent.indent = symbolIndent;
group.components.append( symbolComponent );
}
else
Expand All @@ -428,7 +437,7 @@ QList<QgsLegendRenderer::LegendComponentGroup> QgsLegendRenderer::createComponen
}
LegendComponentGroup symbolGroup;
symbolGroup.placeColumnBreakBeforeGroup = forceBreak;
symbolComponent.indent = indent;
symbolComponent.indent = symbolIndent;
symbolGroup.components.append( symbolComponent );
symbolGroup.size.rwidth() = symbolComponent.size.width();
symbolGroup.size.rheight() = symbolComponent.size.height();
Expand Down
81 changes: 67 additions & 14 deletions tests/src/core/testqgslegendrenderer.cpp
Expand Up @@ -168,7 +168,11 @@ class TestQgsLegendRenderer : public QgsTest
void testRightAlignTextRightAlignSymbol();

void testGroupHeadingSpacing();
void testGroupIndent();
void testGroupIndentSetup();
void testGroupIndentDefault();
void testGroupIndentRS();
void testGroupIndentRT();
void testGroupIndentRSRT();

void testMapUnits();
void testTallSymbol();
Expand Down Expand Up @@ -695,20 +699,11 @@ void TestQgsLegendRenderer::testGroupHeadingSpacing()
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_heading_spacing" ) ) );
}

void TestQgsLegendRenderer::testGroupIndent()
void TestQgsLegendRenderer::testGroupIndentSetup()
{
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
sym->setColor( Qt::red );
sym->setSize( sym->size() * 6 );
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
QVERIFY( catRenderer );
catRenderer->updateCategorySymbol( 0, sym );

QgsLayerTreeModel legendModel( mRoot );
QgsLegendSettings settings;

QgsLayerTreeGroup *grp2 = mRoot->addGroup( QStringLiteral( "Subgroup" ) );
sym->setSize( sym->size() / 6 );
grp2->setCustomProperty( QStringLiteral( "legend/title-style" ), QLatin1String( "subgroup" ) );
for ( int i = 1; i <= 4; ++i )
{
Expand All @@ -717,35 +712,93 @@ void TestQgsLegendRenderer::testGroupIndent()
vl->setRenderer( new QgsSingleSymbolRenderer( sym->clone() ) );
grp2->addLayer( vl );
}
}


void TestQgsLegendRenderer::testGroupIndentDefault()
{
testGroupIndentSetup();
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
sym->setColor( Qt::red );
sym->setSize( sym->size() * 6 );
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
QVERIFY( catRenderer );
catRenderer->updateCategorySymbol( 0, sym );
QgsLayerTreeModel legendModel( mRoot );
QgsLegendSettings settings;
settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 );
settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 );
_setStandardTestFont( settings, QStringLiteral( "Bold" ) );

QImage res = _renderLegend( &legendModel, settings );
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_indent" ) ) );
}

void TestQgsLegendRenderer::testGroupIndentRT()
{
testGroupIndentSetup();
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
sym->setColor( Qt::red );
sym->setSize( sym->size() * 6 );
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
QVERIFY( catRenderer );
catRenderer->updateCategorySymbol( 0, sym );
QgsLayerTreeModel legendModel( mRoot );
QgsLegendSettings settings;
settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 );
settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 );
_setStandardTestFont( settings, QStringLiteral( "Bold" ) );
settings.rstyle( QgsLegendStyle::Group ).setAlignment( Qt::AlignRight );
settings.rstyle( QgsLegendStyle::Subgroup ).setAlignment( Qt::AlignRight );
settings.rstyle( QgsLegendStyle::SymbolLabel ).setAlignment( Qt::AlignRight );

res = _renderLegend( &legendModel, settings );
QImage res = _renderLegend( &legendModel, settings );
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_indent_right_align_text" ) ) );
}

void TestQgsLegendRenderer::testGroupIndentRS()
{
testGroupIndentSetup();
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
sym->setColor( Qt::red );
sym->setSize( sym->size() * 6 );
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
QVERIFY( catRenderer );
catRenderer->updateCategorySymbol( 0, sym );
QgsLayerTreeModel legendModel( mRoot );
QgsLegendSettings settings;
settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 );
settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 );
_setStandardTestFont( settings, QStringLiteral( "Bold" ) );
settings.rstyle( QgsLegendStyle::Group ).setAlignment( Qt::AlignLeft );
settings.rstyle( QgsLegendStyle::Subgroup ).setAlignment( Qt::AlignLeft );
settings.rstyle( QgsLegendStyle::SymbolLabel ).setAlignment( Qt::AlignLeft );
settings.setSymbolAlignment( Qt::AlignRight );

res = _renderLegend( &legendModel, settings );
QImage res = _renderLegend( &legendModel, settings );
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_indent_right_align_symbol" ) ) );
}

void TestQgsLegendRenderer::testGroupIndentRSRT()
{
testGroupIndentSetup();
QgsMarkerSymbol *sym = new QgsMarkerSymbol();
sym->setColor( Qt::red );
sym->setSize( sym->size() * 6 );
QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast<QgsCategorizedSymbolRenderer *>( mVL3->renderer() );
QVERIFY( catRenderer );
catRenderer->updateCategorySymbol( 0, sym );
QgsLayerTreeModel legendModel( mRoot );
QgsLegendSettings settings;
settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 );
settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 );
_setStandardTestFont( settings, QStringLiteral( "Bold" ) );
settings.rstyle( QgsLegendStyle::Group ).setAlignment( Qt::AlignRight );
settings.rstyle( QgsLegendStyle::Subgroup ).setAlignment( Qt::AlignRight );
settings.rstyle( QgsLegendStyle::SymbolLabel ).setAlignment( Qt::AlignRight );
settings.setSymbolAlignment( Qt::AlignRight );

res = _renderLegend( &legendModel, settings );
QImage res = _renderLegend( &legendModel, settings );
QVERIFY( _verifyImage( res, QStringLiteral( "legend_group_indent_right_align_symbol_right_align_text" ) ) );
}

Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 9ed5afb

Please sign in to comment.