From c04369ebe98480ced25f27c8d466a2ba678e26f9 Mon Sep 17 00:00:00 2001 From: Juernjakob Dugge Date: Tue, 6 Oct 2020 21:37:00 +0200 Subject: [PATCH 1/3] [FEATURE] Indentation of legend groups and subgroups Fixes #29606 --- .../layout/qgslayoutitem.sip.in | 2 + .../core/auto_generated/qgslegendstyle.sip.in | 4 + src/core/layout/qgslayoutitem.h | 2 + src/core/qgslegendrenderer.cpp | 47 ++- src/core/qgslegendrenderer.h | 4 +- src/core/qgslegendsettings.cpp | 2 + src/core/qgslegendstyle.cpp | 2 + src/core/qgslegendstyle.h | 5 + src/gui/layout/qgslayoutlegendwidget.cpp | 30 ++ src/gui/layout/qgslayoutlegendwidget.h | 2 + src/ui/layout/qgslayoutlegendwidgetbase.ui | 327 ++++++++++-------- tests/src/core/testqgslegendrenderer.cpp | 32 ++ .../expected_legend_group_indent.png | Bin 0 -> 22880 bytes 13 files changed, 308 insertions(+), 151 deletions(-) create mode 100644 tests/testdata/control_images/legend/expected_legend_group_indent/expected_legend_group_indent.png diff --git a/python/core/auto_generated/layout/qgslayoutitem.sip.in b/python/core/auto_generated/layout/qgslayoutitem.sip.in index 2341c48e447c..a21869d2be22 100644 --- a/python/core/auto_generated/layout/qgslayoutitem.sip.in +++ b/python/core/auto_generated/layout/qgslayoutitem.sip.in @@ -207,6 +207,8 @@ Base class for graphical items within a :py:class:`QgsLayout`. UndoLegendWmsLegendHeight, UndoLegendTitleSpaceBottom, UndoLegendGroupSpace, + UndoLegendGroupIndent, + UndoLegendSubgroupIndent, UndoLegendLayerSpace, UndoLegendSymbolSpace, UndoLegendIconSymbolSpace, diff --git a/python/core/auto_generated/qgslegendstyle.sip.in b/python/core/auto_generated/qgslegendstyle.sip.in index 4b3e0f71e5c3..afbaae433f71 100644 --- a/python/core/auto_generated/qgslegendstyle.sip.in +++ b/python/core/auto_generated/qgslegendstyle.sip.in @@ -105,6 +105,10 @@ Sets the alignment for the legend component. .. versionadded:: 3.10 %End + double indent(); + + void setIndent( double indent ); + void writeXml( const QString &name, QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context = QgsReadWriteContext() ) const; %Docstring Writes the component's style definition to an XML element. diff --git a/src/core/layout/qgslayoutitem.h b/src/core/layout/qgslayoutitem.h index 67734a965014..7891d7543b3b 100644 --- a/src/core/layout/qgslayoutitem.h +++ b/src/core/layout/qgslayoutitem.h @@ -258,6 +258,8 @@ class CORE_EXPORT QgsLayoutItem : public QgsLayoutObject, public QGraphicsRectIt UndoLegendWmsLegendHeight, //!< Legend WMS height UndoLegendTitleSpaceBottom, //!< Legend title space UndoLegendGroupSpace, //!< Legend group spacing + UndoLegendGroupIndent, //!< Legend group indent + UndoLegendSubgroupIndent, //!< Legend subgroup indent UndoLegendLayerSpace, //!< Legend layer spacing UndoLegendSymbolSpace, //!< Legend symbol spacing UndoLegendIconSymbolSpace, //!< Legend icon symbol space diff --git a/src/core/qgslegendrenderer.cpp b/src/core/qgslegendrenderer.cpp index 943257106dcc..a00b849db4ec 100644 --- a/src/core/qgslegendrenderer.cpp +++ b/src/core/qgslegendrenderer.cpp @@ -270,7 +270,7 @@ void QgsLegendRenderer::widthAndOffsetForTitleText( const Qt::AlignmentFlag hali } } -QList QgsLegendRenderer::createComponentGroupList( QgsLayerTreeGroup *parentGroup, QgsRenderContext &context ) +QList QgsLegendRenderer::createComponentGroupList( QgsLayerTreeGroup *parentGroup, QgsRenderContext &context, double indent ) { QList componentGroups; @@ -283,15 +283,27 @@ QList QgsLegendRenderer::createComponen if ( QgsLayerTree::isGroup( node ) ) { QgsLayerTreeGroup *nodeGroup = QgsLayerTree::toGroup( node ); + QString style = node->customProperty( QStringLiteral( "legend/title-style" ) ).toString(); + double newIndent = indent; + if ( style == QLatin1String( "subgroup" ) ) + { + newIndent += mSettings.style( QgsLegendStyle::Subgroup ).indent( ); + } + else + { + newIndent += mSettings.style( QgsLegendStyle::Group ).indent( ); + } // Group subitems - QList subgroups = createComponentGroupList( nodeGroup, context ); + QList subgroups = createComponentGroupList( nodeGroup, context, newIndent ); + bool hasSubItems = !subgroups.empty(); if ( nodeLegendStyle( nodeGroup ) != QgsLegendStyle::Hidden ) { LegendComponent component; component.item = node; + component.indent = newIndent; component.size = drawGroupTitle( nodeGroup, context ); if ( !subgroups.isEmpty() ) @@ -350,6 +362,7 @@ QList QgsLegendRenderer::createComponen LegendComponent component; component.item = node; component.size = drawLayerTitle( nodeLayer, context ); + component.indent = indent; group.components.append( component ); group.size.rwidth() = component.size.width(); group.size.rheight() = component.size.height(); @@ -400,6 +413,7 @@ QList QgsLegendRenderer::createComponen group.size.rheight() += mSettings.style( QgsLegendStyle::Symbol ).margin( QgsLegendStyle::Top ); } group.size.rheight() += symbolComponent.size.height(); + symbolComponent.indent = indent; group.components.append( symbolComponent ); } else @@ -415,6 +429,7 @@ QList QgsLegendRenderer::createComponen } LegendComponentGroup symbolGroup; symbolGroup.placeColumnBreakBeforeGroup = forceBreak; + symbolComponent.indent = indent; symbolGroup.components.append( symbolComponent ); symbolGroup.size.rwidth() = symbolComponent.size.width(); symbolGroup.size.rheight() = symbolComponent.size.height(); @@ -661,7 +676,18 @@ QSizeF QgsLegendRenderer::drawGroup( const LegendComponentGroup &group, QgsRende currentY += mSettings.style( s ).margin( QgsLegendStyle::Top ); } QSizeF groupSize; - groupSize = drawGroupTitle( groupItem, context, columnContext, currentY ); + ColumnContext columnContextForItem = columnContext; + double indentWidth = component.indent; + if ( s == QgsLegendStyle::Subgroup ) + { + indentWidth -= mSettings.style( QgsLegendStyle::Subgroup ).indent( ); + } + else + { + indentWidth -= mSettings.style( QgsLegendStyle::Group ).indent( ); + } + columnContextForItem.left += indentWidth; + groupSize = drawGroupTitle( groupItem, context, columnContextForItem, currentY ); size.rwidth() = std::max( groupSize.width(), size.width() ); } } @@ -675,7 +701,11 @@ QSizeF QgsLegendRenderer::drawGroup( const LegendComponentGroup &group, QgsRende currentY += mSettings.style( s ).margin( QgsLegendStyle::Top ); } QSizeF subGroupSize; - subGroupSize = drawLayerTitle( layerItem, context, columnContext, currentY ); + + ColumnContext columnContextForItem = columnContext; + double indentWidth = component.indent; + columnContextForItem.left += indentWidth; + subGroupSize = drawLayerTitle( layerItem, context, columnContextForItem, currentY ); size.rwidth() = std::max( subGroupSize.width(), size.width() ); } } @@ -686,9 +716,14 @@ QSizeF QgsLegendRenderer::drawGroup( const LegendComponentGroup &group, QgsRende currentY += mSettings.style( QgsLegendStyle::Symbol ).margin( QgsLegendStyle::Top ); } - LegendComponent symbolComponent = drawSymbolItem( legendNode, context, columnContext, currentY, component.maxSiblingSymbolWidth ); + ColumnContext columnContextForItem = columnContext; + double indentWidth = 0; + indentWidth = component.indent; + columnContextForItem.left += indentWidth; + + LegendComponent symbolComponent = drawSymbolItem( legendNode, context, columnContextForItem, currentY, component.maxSiblingSymbolWidth ); // expand width, it may be wider because of label offsets - size.rwidth() = std::max( symbolComponent.size.width(), size.width() ); + size.rwidth() = std::max( symbolComponent.size.width() + indentWidth, size.width() ); } currentY += component.size.height(); first = false; diff --git a/src/core/qgslegendrenderer.h b/src/core/qgslegendrenderer.h index e8b74cc3484b..c64443732649 100644 --- a/src/core/qgslegendrenderer.h +++ b/src/core/qgslegendrenderer.h @@ -144,6 +144,8 @@ class CORE_EXPORT QgsLegendRenderer //! Component size QSizeF size; + double indent = 0; + /** * Horizontal offset for the symbol label. * @@ -215,7 +217,7 @@ class CORE_EXPORT QgsLegendRenderer * Returns a list of component groups for the specified \a parentGroup, respecting the current layer's * splitting settings. */ - QList createComponentGroupList( QgsLayerTreeGroup *parentGroup, QgsRenderContext &context ); + QList createComponentGroupList( QgsLayerTreeGroup *parentGroup, QgsRenderContext &context, double indent = 0 ); /** * Divides a list of component groups into columns, and sets the column index for each group in the list. diff --git a/src/core/qgslegendsettings.cpp b/src/core/qgslegendsettings.cpp index e0c9717ce173..434346c6c16b 100644 --- a/src/core/qgslegendsettings.cpp +++ b/src/core/qgslegendsettings.cpp @@ -36,6 +36,8 @@ QgsLegendSettings::QgsLegendSettings() rstyle( QgsLegendStyle::Group ).rfont().setPointSizeF( 14.0 ); rstyle( QgsLegendStyle::Subgroup ).rfont().setPointSizeF( 12.0 ); rstyle( QgsLegendStyle::SymbolLabel ).rfont().setPointSizeF( 12.0 ); + rstyle( QgsLegendStyle::Group ).setIndent( 0.0 ); + rstyle( QgsLegendStyle::Subgroup ).setIndent( 0.0 ); } double QgsLegendSettings::mmPerMapUnit() const diff --git a/src/core/qgslegendstyle.cpp b/src/core/qgslegendstyle.cpp index e15e1dc2397a..bef734a0a4c9 100644 --- a/src/core/qgslegendstyle.cpp +++ b/src/core/qgslegendstyle.cpp @@ -49,6 +49,7 @@ void QgsLegendStyle::writeXml( const QString &name, QDomElement &elem, QDomDocum styleElem.setAttribute( QStringLiteral( "name" ), name ); styleElem.setAttribute( QStringLiteral( "alignment" ), QString::number( mAlignment ) ); + styleElem.setAttribute( QStringLiteral( "indent" ), QString::number( mIndent ) ); if ( !qgsDoubleNear( mMarginMap[Top], 0.0 ) ) styleElem.setAttribute( QStringLiteral( "marginTop" ), QString::number( mMarginMap[Top] ) ); @@ -80,6 +81,7 @@ void QgsLegendStyle::readXml( const QDomElement &elem, const QDomDocument &doc, mMarginMap[Right] = elem.attribute( QStringLiteral( "marginRight" ), QStringLiteral( "0" ) ).toDouble(); mAlignment = static_cast< Qt::Alignment >( elem.attribute( QStringLiteral( "alignment" ), QString::number( Qt::AlignLeft ) ).toInt() ); + mIndent = elem.attribute( QStringLiteral( "indent" ), QStringLiteral( "0" ) ).toDouble(); } QString QgsLegendStyle::styleName( Style s ) diff --git a/src/core/qgslegendstyle.h b/src/core/qgslegendstyle.h index d690c2ce4db8..7369f660fd75 100644 --- a/src/core/qgslegendstyle.h +++ b/src/core/qgslegendstyle.h @@ -121,6 +121,10 @@ class CORE_EXPORT QgsLegendStyle */ void setAlignment( Qt::Alignment alignment ) { mAlignment = alignment; } + double indent() { return mIndent; } + + void setIndent( double indent ) { mIndent = indent; } + /** * Writes the component's style definition to an XML element. * \see readXml() @@ -159,6 +163,7 @@ class CORE_EXPORT QgsLegendStyle QFont mFont; QMap mMarginMap; Qt::Alignment mAlignment = Qt::AlignLeft; + double mIndent = 0; }; #endif diff --git a/src/gui/layout/qgslayoutlegendwidget.cpp b/src/gui/layout/qgslayoutlegendwidget.cpp index ebe2db1150c2..7bc69347ba18 100644 --- a/src/gui/layout/qgslayoutlegendwidget.cpp +++ b/src/gui/layout/qgslayoutlegendwidget.cpp @@ -94,6 +94,8 @@ QgsLayoutLegendWidget::QgsLayoutLegendWidget( QgsLayoutItemLegend *legend, QgsMa connect( mWmsLegendHeightSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLegendWidget::mWmsLegendHeightSpinBox_valueChanged ); connect( mTitleSpaceBottomSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLegendWidget::mTitleSpaceBottomSpinBox_valueChanged ); connect( mGroupSpaceSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLegendWidget::mGroupSpaceSpinBox_valueChanged ); + connect( mGroupIndentSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLegendWidget::mGroupIndentSpinBox_valueChanged ); + connect( mSubgroupIndentSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLegendWidget::mSubgroupIndentSpinBox_valueChanged ); connect( mSpaceBelowGroupHeadingSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLegendWidget::spaceBelowGroupHeadingChanged ); connect( mGroupSideSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLegendWidget::spaceGroupSideChanged ); connect( mLayerSpaceSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutLegendWidget::mLayerSpaceSpinBox_valueChanged ); @@ -240,6 +242,8 @@ void QgsLayoutLegendWidget::setGuiElements() mWmsLegendHeightSpinBox->setValue( mLegend->wmsLegendHeight() ); mTitleSpaceBottomSpinBox->setValue( mLegend->style( QgsLegendStyle::Title ).margin( QgsLegendStyle::Bottom ) ); mGroupSpaceSpinBox->setValue( mLegend->style( QgsLegendStyle::Group ).margin( QgsLegendStyle::Top ) ); + mGroupIndentSpinBox->setValue( mLegend->style( QgsLegendStyle::Group ).indent() ); + mSubgroupIndentSpinBox->setValue( mLegend->style( QgsLegendStyle::Subgroup ).indent() ); mGroupSideSpinBox->setValue( mLegend->style( QgsLegendStyle::Group ).margin( QgsLegendStyle::Left ) ); mSpaceBelowGroupHeadingSpinBox->setValue( mLegend->style( QgsLegendStyle::Group ).margin( QgsLegendStyle::Bottom ) ); mLayerSpaceSpinBox->setValue( mLegend->style( QgsLegendStyle::Subgroup ).margin( QgsLegendStyle::Top ) ); @@ -493,6 +497,30 @@ void QgsLayoutLegendWidget::mGroupSpaceSpinBox_valueChanged( double d ) } } +void QgsLayoutLegendWidget::mGroupIndentSpinBox_valueChanged( double d ) +{ + if ( mLegend ) + { + mLegend->beginCommand( tr( "Change Group Indent" ), QgsLayoutItem::UndoLegendGroupIndent ); + mLegend->rstyle( QgsLegendStyle::Group ).setIndent( d ); + mLegend->adjustBoxSize(); + mLegend->update(); + mLegend->endCommand(); + } +} + +void QgsLayoutLegendWidget::mSubgroupIndentSpinBox_valueChanged( double d ) +{ + if ( mLegend ) + { + mLegend->beginCommand( tr( "Change Subgroup Indent" ), QgsLayoutItem::UndoLegendSubgroupIndent ); + mLegend->rstyle( QgsLegendStyle::Subgroup ).setIndent( d ); + mLegend->adjustBoxSize(); + mLegend->update(); + mLegend->endCommand(); + } +} + void QgsLayoutLegendWidget::spaceBelowGroupHeadingChanged( double space ) { if ( mLegend ) @@ -1258,6 +1286,8 @@ void QgsLayoutLegendWidget::blockAllSignals( bool b ) mMaxSymbolSizeSpinBox->blockSignals( b ); mMinSymbolSizeSpinBox->blockSignals( b ); mGroupSpaceSpinBox->blockSignals( b ); + mGroupIndentSpinBox->blockSignals( b ); + mSubgroupIndentSpinBox->blockSignals( b ); mSpaceBelowGroupHeadingSpinBox->blockSignals( b ); mGroupSideSpinBox->blockSignals( b ); mSpaceBelowSubgroupHeadingSpinBox->blockSignals( b ); diff --git a/src/gui/layout/qgslayoutlegendwidget.h b/src/gui/layout/qgslayoutlegendwidget.h index 6a3d1456a49a..3a3ffb6a7c17 100644 --- a/src/gui/layout/qgslayoutlegendwidget.h +++ b/src/gui/layout/qgslayoutlegendwidget.h @@ -82,6 +82,8 @@ class GUI_EXPORT QgsLayoutLegendWidget: public QgsLayoutItemBaseWidget, private void mWmsLegendHeightSpinBox_valueChanged( double d ); void mTitleSpaceBottomSpinBox_valueChanged( double d ); void mGroupSpaceSpinBox_valueChanged( double d ); + void mGroupIndentSpinBox_valueChanged( double d ); + void mSubgroupIndentSpinBox_valueChanged( double d ); void mLayerSpaceSpinBox_valueChanged( double d ); void mSymbolSpaceSpinBox_valueChanged( double d ); void mIconLabelSpaceSpinBox_valueChanged( double d ); diff --git a/src/ui/layout/qgslayoutlegendwidgetbase.ui b/src/ui/layout/qgslayoutlegendwidgetbase.ui index 37d383b3c290..532a78ebb0e6 100644 --- a/src/ui/layout/qgslayoutlegendwidgetbase.ui +++ b/src/ui/layout/qgslayoutlegendwidgetbase.ui @@ -63,9 +63,9 @@ 0 - -1031 - 387 - 2728 + -1172 + 359 + 2146 @@ -763,7 +763,7 @@ mm - + false @@ -783,7 +783,7 @@ mm - + false @@ -879,7 +879,7 @@ 0.100000000000000 - + false @@ -957,7 +957,7 @@ 9999.000000000000000 - + false @@ -980,7 +980,7 @@ 9999.000000000000000 - + false @@ -1003,55 +1003,52 @@ true - - - - - - - mm + + + + <b>Legend Title</b> - - - - - - - mm + + + + Space below title. - - - - - <b>Legend Items</b> + Space below - - - - + + + + Space below title. mm - - + + + + <b>Groups</b> + + + + + - Space below title. + Space above text using group style. - - mm + + Above group - - + + @@ -1060,18 +1057,18 @@ - - + + - Space above text using subgroup style. + Additional space - Above subgroup + Indent of group items - - + + @@ -1081,6 +1078,13 @@ + + + <b>Group Headings</b> + + + + Space above text using group style. @@ -1090,7 +1094,17 @@ - + + + + + + + mm + + + + Space above text using group style. @@ -1100,25 +1114,35 @@ - - - - Space above text using group style. + + + + + + mm + + + + + - Above group + <b>Subgroups</b> - - + + + + Space above text using subgroup style. + - <b>Subgroup Headings</b> + Above subgroup - - + + @@ -1127,49 +1151,45 @@ - - + + - Space between symbol icon and symbol label (symbol label left margin). + Space above text using subgroup style. - Symbol label space + Indent of subgroup items - - - - <b>General</b> + + + + - - - - - - <b>Group Headings</b> + + mm - - + + - <b>Subgroups</b> + <b>Subgroup Headings</b> - - - - + + + + Space above text using group style. - - mm + + Below heading - - + + @@ -1178,7 +1198,7 @@ - + Space above text using group style. @@ -1188,15 +1208,8 @@ - - - - <b>Groups</b> - - - - - + + @@ -1205,8 +1218,25 @@ - - + + + + <b>Legend Items</b> + + + + + + + Space above symbol and symbol label. + + + Space before side of symbol + + + + + @@ -1215,7 +1245,7 @@ - + Space above symbol and symbol label. @@ -1225,8 +1255,8 @@ - - + + @@ -1235,66 +1265,76 @@ - - + + + + Space between symbol icon and symbol label (symbol label left margin). + - Line space + Symbol label space - - - - <b>Legend Title</b> + + + + + + + mm - - - - Space above text using group style. - + + - Below heading + <b>General</b> - + Box space - + + + + + + + mm + + + + Column space - - - - Space below title. + + + + - - Space below + + mm - - - - Space above symbol and symbol label. - + + - Space before side of symbol + Line space - - + + @@ -1321,42 +1361,42 @@ 1 - QgsScrollArea - QScrollArea -
qgsscrollarea.h
- 1 + QgsDoubleSpinBox + QDoubleSpinBox +
qgsdoublespinbox.h
+
+ + QgsFontButton + QToolButton +
qgsfontbutton.h
+
+ + QgsPropertyOverrideButton + QToolButton +
qgspropertyoverridebutton.h
QgsSpinBox QSpinBox
qgsspinbox.h
+ + QgsScrollArea + QScrollArea +
qgsscrollarea.h
+ 1 +
QgsCollapsibleGroupBoxBasic QGroupBox
qgscollapsiblegroupbox.h
1
- - QgsDoubleSpinBox - QDoubleSpinBox -
qgsdoublespinbox.h
-
QgsLayoutItemComboBox QComboBox
qgslayoutitemcombobox.h
- - QgsFontButton - QToolButton -
qgsfontbutton.h
-
- - QgsPropertyOverrideButton - QToolButton -
qgspropertyoverridebutton.h
-
QgsLayerTreeView QTreeView @@ -1422,7 +1462,6 @@ mWmsLegendHeightSpinBox mSpacingColGroupBox mTitleSpaceBottomSpinBox - mGroupSpaceSpinBox mSpaceBelowGroupHeadingSpinBox mGroupSideSpinBox mLayerSpaceSpinBox diff --git a/tests/src/core/testqgslegendrenderer.cpp b/tests/src/core/testqgslegendrenderer.cpp index 0cdc120f5d3c..e323720e041d 100644 --- a/tests/src/core/testqgslegendrenderer.cpp +++ b/tests/src/core/testqgslegendrenderer.cpp @@ -175,6 +175,7 @@ class TestQgsLegendRenderer : public QObject void testRightAlignTextRightAlignSymbol(); void testGroupHeadingSpacing(); + void testGroupIndent(); void testMapUnits(); void testTallSymbol(); @@ -692,6 +693,37 @@ void TestQgsLegendRenderer::testGroupHeadingSpacing() } +void TestQgsLegendRenderer::testGroupIndent() +{ + QgsMarkerSymbol *sym = new QgsMarkerSymbol(); + sym->setColor( Qt::red ); + sym->setSize( sym->size() * 6 ); + QgsCategorizedSymbolRenderer *catRenderer = dynamic_cast( 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 ) + { + QgsVectorLayer *vl = new QgsVectorLayer( QStringLiteral( "Polygon" ), QStringLiteral( "Layer %1" ).arg( i ), QStringLiteral( "memory" ) ); + QgsProject::instance()->addMapLayer( vl ); + vl->setRenderer( new QgsSingleSymbolRenderer( sym->clone() ) ); + grp2->addLayer( vl ); + } + + settings.rstyle( QgsLegendStyle::Group ).setIndent( 10 ); + settings.rstyle( QgsLegendStyle::Subgroup ).setIndent( 5 ); + _setStandardTestFont( settings, QStringLiteral( "Bold" ) ); + _renderLegend( QStringLiteral( "legend_group_indent" ), &legendModel, settings ); + QVERIFY( _verifyImage( QStringLiteral( "legend_group_indent" ), mReport ) ); + +} + void TestQgsLegendRenderer::testRightAlignText() { QgsMarkerSymbol *sym = new QgsMarkerSymbol(); diff --git a/tests/testdata/control_images/legend/expected_legend_group_indent/expected_legend_group_indent.png b/tests/testdata/control_images/legend/expected_legend_group_indent/expected_legend_group_indent.png new file mode 100644 index 0000000000000000000000000000000000000000..139262f3155c74e242bdd988add6700070fb2733 GIT binary patch literal 22880 zcmbq*by!zx*XE{Fq&uVpLAsO@DFqRbZlpnwk`NSWkw(IxL%NYh=@z6xKuQ_~1VtLD zS^K>6%{AXQ@5FV@AD*KqKla|w^Q?8(+M#MH@&p%YFCqv+pm0}K1O7jXAQ&wd&cW|a zola}vf4EL}^&cY$VLSQ@BZiCc5`r)x3bHa$u&>m9e}s^A1u^nJjkyFjEXU4{_1dS;m0F zZ!WH}E~1XcM;;sfH?M84fAfx?nD}OWMOJpsNi-u}=L?~es2c$mi5vv#9U&}Y!BbzLQWG~3u0+0f81 zRG?kR=~l!m;QiONNWUV8Udm(V!jmUYgjPs$IXN^{-3~U*4h|2?7PSj?oYkF0JDNM0 z=pwtE;J3`0%VZQ{Vq)VBo+6QqQjzje43}A0uyS&8RtD3t*i=(rvMDE$>+@c|jB$E; z`qBLlv!x)7p`jta#V7pni3zir`e(iUZEaWRa~xw!Cn3@V%BOnmg$ z2lqGU+s5mkT}!?B4Aa8G;^5%G^zY6p#o@SU0e;MLvB%$uk?LZDssio~c5d#MboBH% z4=6+&92_QV9_MP*Y;HQ)j^w?1-4GOXuGqN2AX?aVggtu;kBaw-kWiKR)W&qpHP$Ov zE_5FsZx3K5z4JXyco`89zH`_e!=>oZpD0w=Ree)J!lpM~z`qh6N6hN>Vji0|Tfx^7 zlQ)5ZfoX=pg!B&&Hs>v^tUe8ojEt=GCR{5@zQ@L5ZEYx$ae-X3Mv)79a?t*tG+n%0chcduakWohKUR;#bC$9DMjtxorIj?9a5 zmX?-R^1{Q{zNK}`F8}<=#a{7j+bT9LI$BysM~8c$uPP{t^f1qP;+zhkdT$n zZ?0NeTk96(Ei5i7=<3ETi;0VCYG{!5>~C+Ay_Im^Wa{DK=2TWz{<|0@b(ihUP>T3d z?1orb=Jcf{OP#U4K4rDB+1Ym?A#i1HW&7o{_w&m`!?4a1mU=5GDd96p(%IP9+*ML~ zk(0v~giq7D_4`|0a9$oeA}uZLmzK)tbASSqh>xNsY#i!|4) zq>YSHs*e72GUC0@Cimv<{ph^N@3M6F;lqb%upd{xmN53PFxR{P!9+IKM!BZzo<^aU zZ?U&Nfgqu>{?E3*|MArLO|31ce)-Mk&85#|Pmb3ouC4t18K=j_%#2xGUG49J%>DXh zyimqW#Bh_CPBrx=&6}&Lyk&h0E0a})b05vxg8UbYintMJOUo>#28XF?e+&3zVTVcf z3FkFl?P1La*4A-#_Y@T`B20XIs?qP$)72N8A58K*tYE*VtlTs5{vI0{-OtrkjtTOZ zPx*CP3aZ&9B}7I>M#AKeU0vJ1_a!NDe<{+xhWNn_VLEAfao+uR!~VE4++>+sd_n?l zq;8QO1|MIE`37u|@IJ1a%f@uDE&LZ(Rvxk@Sr4SfqLe1#Ad<$504JE2c+~*hqIODS66ZA>FKj_a?DqUvpcF+H#T@g z3GwjSrfVLDR}v5s21Q1y)C?5ztEi|9e*G$MYs-nu?W}$Y2@N&dpJkBpdD-0DtoWf# zou2dhagv0m@D);pS5uBnC+CoZg>b%jZxt0nkG=I!$i#cS9MC2O$ev2~^W1St`tWKq{DUbJGif6~Cj#Kg*Y8B62YsVBF7Id;ko zw_A@MJ<6V%&m(@2z|4I!+jzLzW7k&a7hETgW&*6?g-LPW)0?X+E95rfP?cK#tPEx1 zJjl$<{5(8des6<8%q1X(>t?pk>G3m}hVActWJ|LRo^i`i1IVXxf`WpE--^G}D4Eh) zt?-@o-lvbG6T?(h9bhg|$0s28Gat-oetLZ9zr$-(J2zQnN6l}F;N#<`6&B(V5fQC_ ztD_>jszN?KR$^k}WN%{=nwG}ob$a-NpP!$7m`_ARgj=r^ahR;kU!wW`1qwL!xpNth zfAstBe2TcV2&G4+Gm>7;CODJ!?W#AYz}>rdo7;kkUL_`mog<)~YuKN8QBxx}GCJC$ zJ;2v=-1-X(qj_z#FxiFbDy~J2zq)?aW&!0bv`=vgASFiH2s}yJIgehujzS*FI*@ z{Ux1Pd9Bf+lVY|G;TggtEKEtoXDsXLdL5brR=(E7YuBz-+I%@jFaCskzlu6o(`dv1 zI#0pHcZvV!_V;gl;{X1OvcB88ym2f70N7g5Qce!7`O-j1t@9)oPbXDG~o4dfjt5i}_k~M72XbGBtUYWUEs4xQq!+4dQ z?yK|?F*m%SU|%@p@nVnJ#K(q*N$YUcCq6hbVq#(rW-C#>WRR%so~&_RJck~#($Z2= zsylOelG@A#`W04X7INwmo_j9?X|4$g1-^gJ`)jr-YH(1EnwA#bK^>=aAr~%Rz8n$~ zA`PdssHkYL+Ts4)>=^Mt=)4v^u{>~`GD5nWn-RyEdJLrA>yQ-vHfS;!OC=Y|9cLw9 z(u?b;eczb+@bTF;8!0JiT5j%nU0vPluwCzMuwK1dVW$VhB|AnH9wJ(qkwdNoJ$-%L zt>17Z!9DExwz4fP zEsAao;!j?#Z*0UYyuGidH+Xt-)I&K}OMP*nT{ZD~eybb%Cw&oqe&VH$jt*R})2$vp zePeTT<_LQ6SU5B>{l!px$Z2Ug^Xx_ov=xA=UvuS8()UB*?(q1mSE`sV}zN(<0 zFjDu_Q6>q>TsFXj3&Zb?8#wcR52oL?w6Mrra)gy%4QBLVsxjm(Em?W`zI!A-k9?m( z#L>}F#``=W9Wl48!=p#muKz zgQ=-Blsii|3RX^LW_a4MjTW7RGDl&v-=MPUdzi^k*uz%s2wN*@I@KuWTi<@mp^3er zyCkmbX1gw_ZDqwK>^So>SM}Y+*l#sX^O(j>J_Jm@`iW4JpPzYITwSW4w01e1r zZb|a&c>7}Uj2=bTvdeU>8{UUU-&%(<H`{D7g=^Bjz7JmL{*xT6mVGVGR(L!BS4n8KP zG;YSIVL|Z@2iUyUZ7h6ze6f;%uVlPo>svpgrKN@YQ<3f1*MhaSw72iwYHe)=l$86< z$J_?WwdJ0P_b!E!$hB)M3HLs2sifS{wp7&?HFAEKn3SYMNlD558@=#n%P0LmF@?r7 zIe0G_xPMOazm$x_HHLL4;TIfy9w6{|Y(m24Ek-FHL))Z;goKdDNJ@L0aQdw5Y>s7) z_pT;1l~q*&X06zCQa;JWm>DZ2g@uL9Gl1SUek?7OdIof)XJ)>@C1WdHgpG%R?EU)I zGyExvabS<)r`=3_jj4o1M>U1|j_&Q-SkS-M^^A<@0VA^y>%2lA<#XEb?Dq%hlvJ(y z&NQ?H1O%d@qU85Y^sS;Ns~y6>Jo;OJ-vqwjHx z*Q4>$%Ww~Gk2Pl#eig6@%<0T5?-$9xc;0j zhQ7YOzsK;GFX2TdL&5d+H};GTVEl%~V0rskKK$uf17*|5>8rYrZ_ zlFPG%#w!5h0U6wm)+yyJ1B9euEH^kf*xdXaOR4IylT$NL0Ay*lO=Agwl)Z_(d~h+N zA*piW^%nRS&U4KeSFT){1LSJ;EUbYXslG{qVB_G-@BaL1FSF@Ckjd_g7u~b`@$nBr zxOF_Hvq=$A(T{hhp1yJ+Is=Ln0b8ESA&jcfe13VkgE#r{;dxvC7%6S1>r`RAcKAxIR{0TmkQj2FV&Jl2K6S#JS2KXB*-oAaC zi65c9;mZEASn%34_;{kC`yU8V@bJAiLDTY^v9WP!Wu;{&fY48{MM)?q0y#8uN<+^9 zE5N@bTy*brOuyS@K3h~>eOkw9-f%25?8SMai<4^HnIC6Yq zr-z3JMPpvk8prNJ*XPga?~UqW4-$aYgaG*0OITpzB)5U@Pi6DLWx1PqYJD*M z#oPhlm7-qY1~EBK z#ogC845y%bh{ALDKJc!@b%-}cQ2@>t99A-b`MkOfVPAgwZ4H+A0T(j`1mooF{2Z78 zH#hg(&!0VPViyPDvX1~{dG+cTwL~`hY}!Nmf`7`oR%#|3Q!MOSy`rQ z*T|qnYB%~gx?PUzAz@(XXV7$UaUng9?`Z?rV)p0}A;K>r(ph0W5LQ3K{p*J7mmKAT z^@;&xNy>Z=swVT*=THSBy1MQzegED%JxvGrlVa-wuSVfj&WjeNrp>&OKS={~v$$^A z+jDDZXlw#}uBZ$pyGkkkyaKKXXrL6ekS#e7$yaaQynwxkqUm0%_7IYe{({8#_|ne= zk;E};`Jx>b4h}r-#ADOb$r6Hd)JoQXdJG*d?-8C7`7_@gvc5nOUw?xx_)yV&Z9$^!1H9rGdh zR20E1f`(fELDAdf;EOL6za48o0P^iArKGD%m6(`_;+cXu32jzfBBD+}_5ZMclcq+! zIykbeU0oOM+_{5Ng~Fk>v#TN^afb%eUsjU4+dK;tN$Ke$gzUx; zBqjBDjehy^;@vwF0#7ZG`HTXT>tQ~9`V?V*d`~LUwl&yyv>ljZsq3l+w^1$m{;zKq ztBao^+TfJ_nXrC$8Bmo)XJp`u7g#r*{^~XE(Y?aPcJA@_-sg37;`a9TbE~VNtV*#V zw2POoUOnH~*tjzFfp2%oLlumAj&uqCbyrITupXgd1H-({TBdL6pl^g190`U7WN#?+Jvx`&MH0nlcQrSnM~?p3mXmOuHktH9k^m!0EU zID)$b1y8~pITcFls;Nju9u8o8$GvD<7 zOD=uNZSn9SJCX)Hr>nQOJzq1|)ZQMSg@pyy%KYr~WOIMNq>|6Tz#v}I`v$5ANu3>& zad2>S_4K?*O=SQqNK8tKiIkR?xB6jVIc?6#93TF8x4FIj!jRYc`3(RAghoc+6c2qs zb8>fg*ZP}WKsHJigX?!g)aHS$?M1j6l_SQ@Z()KL*~t z2;pq#GQNBFg2&Fv?bEQok4#O|T>LS$ z)V18+wsKjKQwB9QN>1%>ZIQ}akS6_ZI!ndv9vC13h2rvcA)%o%3wc>NxibD~1O?z9 zYipTBMX8g79d5M+5nx=fAkZ0ks_p$QJX}#005LH&HT&H+irK(NEwX<;8ZDq$`&tt9 z_AU8M-&4BGI}!e`UXko-H!GDVMcM|6nGiz+9ixVX4v8sOPu`z5EO=ue`Y zZ;fAAI0q`bW|Pm!xZv%@&M3Yi-HwT-g=)ZA7p-=oYT0x}U(PBiQJtKewEwR1s7!?o<_JC@LtB za93p(7Ah6$mavJ4d|;N7yYkXo^xP(xK_RHPc%8=W92{)yG}U*Kh+n3BRE9~DPsgNA@NXepDvDeUAim7kuam=0Z3ccY zzqAw(9UU#mQ=q0hPezffSOyB$o@flv93b>NDtH&?Bq(xUCrf(Ml8}(_3ku$XS`$OL zSOj-R7X{{8!RQLh93@Wal}*0YV?AeY=g=H94E!tIeq zWM{Mf-P;IXU$;+|@?`+%?G8^lh=>stXB)PO5*xWT9ra}ay_JH>Vn0<)06a<##8d={ zVwAe0r$=289vS%wgy6v(4$bbF%bpYfDl(}%ypHgmX$6#r=an z7RcdOODNSc029z}E7B{&l#!9?eRQ<9;eVrhP4^j=pH2`khVqq0=&w#7dL8|4ih{;g zp+^JCFtw-?6KECzB91c`x(5=4@IX9l2O;KFT-uy`*Hl_{>J?RDOQ{> z_R}8)dg?rOIY~&2ntW0~iwX1kS#8!91Vpd9o5}}k55P=TX69`q55>LJ7mbxZl$E6e zR_zAt^kid_qiU%B+2d*{>wY?&MrNNFR^*|xyN8G1QId!wrQKJ!_ZGXqVH;k5I;do2 zUDwA2VymIa=m@j11zjP<#Yj_?JPZg4fs^ogbhN4~EfwgR>yLhV9VmG7+^Rz+L_|@f z0}=aL%&$SliH;_oZuGu{@{PKePR(**WT}?iBRaDMJpS|M;{Zc8G8|eA7?Q>*o z_t>j_04al>LW($nf~s@&t?ntvSuDt5LkLuJAZyMWlR}6es1U$W!~Fb^E3B*(`cLJK zIhByXZox;>qSGIpu|TYi{%q-fd?1i0;z)?-HFyXO4-XH1a5Nd8n!+MJw>u3Y#LvEq zt=T+=ABllzBU_#yVY^|UKi>wp0SIyLdw$qdfh8q;)%FvujW5hOc1;v{GKKfGIvik! zFf(U>6cIZH&`w4I$O-rFj&LejE!UzT&;4Hlb?^r=lA+_nZT(661%k=@2GK$<&y#iVBM(oU5u9~$};y+ zIMf=5he~+RVOu6A6Z?261C-u;wp@R#prXPnn0GbWH&s|z*uT=a!6RnEk(ZO?+1bgy zGteXRZHgC)jowE((Q)zdU3*G(Lr2hB7vbaF_tt6PfZvU++wwNaKJ!7 zbtUU78OHR}i3PsKFB3s4baB>en*eQ8HIILo1N=mqgP#8V`}bh!jcO@8{Po!;#@N_c zCg!}tLJROX5Cm+2hc-5s#l!da>kG%z=2q541sV5uXXqJu|gAT39K$F697^D+NBONW4OrG z!|fk%Koy}xDz-_L9dq&)8K|=po`G(v3O%379w6OLpU5nK5)f7r5_M4G_3z)W*ink( zExWXd3j-zK>AqY zN3TJ@O}`zi@rF%VPi>$Ty5`!{hmy2Zl%Z{vm^AetgW{Sc>HT*w`tt3(2R*S@ViZ4* zjm1v5sE5{T$H31=Zwgcdf4r$1j(1DQG#)HnM_WpmPcuk)kkkr|a&Ura*iV^&(I~k%JASu~jJ&lJOwgD*J3VrI z_2JU``ucblsd|T8wu@@M)Uz$@6R8t&fos+}HsWg~CT(WFjSZ!|YZce7GT(&11bq{_ zxlCXzx5I3s1dzycfb4v%3iP3=m=3j}DRGcOdja0KcFxxkk>;bcG?yPEpj@R7Y zo+UfAv*QZ-BeRGI6`=P6*qq^2%Ai>THA~CR4g?7h_x)|I7u}(Xym5={&UQT0 z1{9m-XtJ}r_kQ?Ew-T%@C>`N|=1PT%PXGSodr2*D>+_RlKa8%vKDoLl8z@NT(tSTS z*YW~EK*$XU2#}VS&owwH;bf5X3IY6_Eb5F2I1>u*Ic63XyYC6Dg8Mef1}%U(uy4nL zfmVha&IFX;As7`3o&am!e z)zs9W7Dq-#M)d2~m{?d?m5;s|tQu<>F>!O_!%0H%FF1n}np8p<|4_8!390{AEB7DS z+IFXJ_T@`_!2ighW6ah^_vBjX{3wp)@88YGiu7A=k>bMHLP;V9);aP^s_ED7yrg~( zA~4eBo82}!Sv&34-qCScNQeS4b#NfauiQB!a}!(Q&!tqGB>NDi?h-axSy}lI1Pcm} z#19#K&p8BPf4h8DAG<3_ry|Gx)m@1*1|?PTqR!0W1gR-05n$t778ER>_BXD!r+G9} z9|}znD0KbwvRJZ#f=z+udj8JN4)!z9c}<@IG_+a;e3uOhg$Ag4pP{;ei*OtE!p`yG zW0}JkF5TBrQACFa2Wp0fbR^47n8wk2Af*j2_r&GHH(EM6ssbdJ1bh}A5&~Qn{^f;? zW^nr6czJm}+?;D+P1V%*EP%fD_h2z9->B{h`Yli`M*z4Rlw0Cv=i~?`Vfqfdlj37< zviZUmt4pjD8L|RmX$A<#ub`fbiHf2Ja|N)De>qeJ%Lh8+j1}refw8JY7h6zR80W6? zfMPUR>~Xx2nH12Pf4i_YDIc} zekhB4WExb$ULROmQJ19)U@*PgO4ca@bVAY@#VCL47A8E*nMUs(^Bbs0W8I(3q09aq zfHu%^dc<$OEtmz)I5;_*J3F$*#tc@y@y|bg6lIlqZ_*SA*vSlRF}=!%B=1;@H{Ryd z4zqD0(H}mDd|uvi2`1t#&UJBhwLF^#U-k2_x3{-`gSLda^ZqX*I7zwCWrhK2<^kL< zDth;hkwlxDd>dp9y{>uieoJ@!6&O2G3mj=OZaCW#EjOxWzkg2%eHrZf@$vDwHX^A2 z02xqGWpV9_?!x`)k7#zR!ac-a>fWV3+y1|Fr)=o0Isq|RZhY=_wC9lROAcWR)Qc1U1=b}T2`uJTI3r<2ot>TM!LtWx z_|wx_@AFK)tCtuV8LbvKHX<~0RWJ}Z?);G1h>eSh2?VG|RpW=qR}t@q>4Gf>I@Gyn zsp~F}AHM*&2X*IFQW74b2dZiw)g*W{W~jgxq{S%*)TqbMXKU#*YId7WHTg;bHPE|P z4^o{u6nv+rPdm#jI>Ui1E6QY-{$#Put*urtbLW`v0ASAr=2Cl;p#2Eg9xB2Ms5ZBhl<;8hbGzK_Qs*h)mZceO-E5(_3}F#aK0ssS`Xct0GOWfA z;xWMLWq9M-dVBG~G9UH%)|F4|J}pJUuF7tu@+~-A5gR%M4jDe^xUJwK9V$;gB?sj7 zAAgM|a3m$?|5F&JfM>G@sv$8IRj0Y)%Ia#_(KSGvqs!-lHJ7y#^5CpGeP2>YKKsEq z9UgfH%grsGq~+y>elf8Naf&3lIYFYK*netjHY>}X114Vib9w|SX+Gx%(PU2forxyp zLfypydhxV3F@X$@GimbX%m$X$aX0$CveKVx1_g;)*oKMblV{$EY+n+4oCdr&$CFMa zh9xoYbi9$i$M=||k%MF9^gBV~(vsH4_wM=RRQUL%gIyOYa#cH*IE_P7+eqFhhOhnF zn2MLMA+0APEoHhvJIOq|XE5v?jfeA!OZ9NTCMA8hWmagxHP z8wJ(EV#!+?m(`2+b_4rOe9csWl$!7VvUN;qPJghVACV%*Q zQk%se)9(})cZH7FPnFzQ^M{iy*)r*9^{mhBhA+7SWg+9PqY6z~S6pkoFZCSmQsh!< zSg9K|xZ?g8E9v~IuCBeRnm}`QEH(oM_Y2<>?Jw`0L@~QvmE~ktrpsCTzcmp>80_WT z<wXwi?i^P+J77`E?WDaJl_B`_s`ZRa- zj!&&x9iL9ET*MZ-#mW{I7W|=zSU^X%cg8^64>r?ZZ-65`)a2_cdgDgx&=3hK)IroD z%W@xRFIo|xvZ8sA`vq^eAE~Wx@?B%a>Ek4^&R{F;?dwP>D!LfQw~~*Px_RJHgUEVc zztQw_Qb@=Jx|{CAzz^CF{w#vuJ@IpSIS`}?1Oafj2@oU$9CnJm@Js{pDb3FqSMv0( zWPY%r2Pz*x$4~Zqzh?)qg}e@&u3Wv!A}PrL9x8~U zZ7*rA5%14xUWIyX<^OjjGm4m;JOFAhv!I~HOUM(UhfCeH|_&g40>sp$jzHKolgF`LB4DOl*faeFRIRryg2|<5I3(bRg2!Wp# z>v!HkAXk^!?4pvZl+AD!^G}Xa4n4mqD4(SxdGX=Fk8MRd!n=F%|Lm@5=kmp{H5yA? z=gZ9liN5sl4;6r|pd;goJeqC>JXZ$V6I$+(w33p6^*CN5gQePf(A#mMeT{%$24!Vk zAttFiRV-Q_P<3g~9Jecg+m+Vspmd9+rU71Dd+PykbDRoa==rzDeBUsHiM(<9S39g$ zj_1eNT^qG%>j1q51A+FA{(Phv;F&YT5-%QhsLSMG|9!e9Yi3{|D_uNmTv+%fH(W^} zw+%I|Fqn{$5)&yIW5^-u&j2=5l$8bcGXge4EPy0WT1hX_D#zK>on7#hJKEccNru1! zNl1}pz6{NNcyyE%&`GS%Qr9cN!_VrHjdbq0rrTf1JdOhlK0nxY4A5WuvwtozOi2?QG3 zf?g-rs)h=1f&?M(bex|K7dKz!9cO!hRUf~{w;QftLMcvt?(LP;(js4S5xal!u15P$ z0ni&D^Wm3}K-1gTS2%K2Wh0|K+ch~k+4PZ3s4fx1T!X=}s~m$LzQrOZ6?wF;@@R%! zxW)$j;6XGcx*x20#J=nH*N2R4F88AGu`U(YC6POEW^J}me4sYoe(OD0bIqsL8B1ki zVsu`!=B}2mJm1x;)AhbhIY#qN$Xfx~iQ@-7o0$>H+D96feJZOz9S7o}r7KvSP2Fu} zoMbFTe9@Mtj)pEfKXiSpSitgNGx14ao7r2t(WuB`12f;dcZ(A$ODn3Di3(h7>6Z=C z<_ncU?>wU$CpG$qgG?qt=&Z~2;4)jjiXV=nTk{=F$o`FnpoG-YVW zsjruOijUP8Bz+r;7gA4t2VH8)@6PYg@^Jf$D=GPqj_&25cB!B@h7Tnr=8~5HOn5L)Oyq|f;{Gfe&tn@P7#(J8#HK7mDg*pF)JnWcX z`Q(QW4qXhTyr>EJOfou?L{_w(KP(e*b#=(~7sAtQr$e~WeD%^S1#xxw)x zTJbd0&Fc;OrjwN%i4bnOzyHf$_p2D4c9tU8jP>DK9vS{^^B4Ya(d7RU!^&yDQ1u%V zFft19h-qoVM&Jj<$2S991e;U3#JJ($CtI@1cE98iXj>tG8W-SPbWGw?^CLjz-`^<_ zb;D5iEckuW)R|wAE6udCHiI|o^(P{JG(5$ry@8%a4Fd;>Wawzx{ zSpP!n9P+Fr780q`(}rt%&LXy(s#wEbX$px%*FUc?vaJ1e)&*gTA`{YApatFMf>e|r zL_*%$gU`GInUi%0CF38)Z!#7L#`eXf5U$bXN-mX?-%hB`L%NM}{(u9-~s%~9}$58F~@ZsI3zoyOHP+AR{#qdfuXJ<6nYh?!sL3A??|||$2!#vhKI}&lTsa&+ zl;YZbea|W-C3W%Q#SGwNWjB3&ec^d#&&`<%3JNkKBL&)AW04Ro#9#u2>mok>6;J~~ z$uVCBwXV+|PZr0ozM)}tBwrJibz}D+Q>in1zLSFtE(jcjyj|Vma0>0h5`!W5Q~Rd& zb%@+fLBUyq_U&84niRiEP2P^IT!mF1lYT+{Yf}u{7Tbry zAD+m)_J*h~F(V@p67uq80B|j6G(C6_GH8Qs3i8(%^B&J<&(c#{%?Sh(UXI2kC%=S# zO{vcd=Jv$J9ulKk*ZjLvpkm_bRG&wHJAqt=AYk7Db;nJ(7u0JTQq#r37(*EYSN_*? zzq2r~WYcT)u}tdWt;ajtzdFa-ig{c&CMi%M9t~xggP#YXtikj6)P9ikie=}72Gddo z2@8;S(0&8CM6Ye-p^8*+V$dvaCj?Fo0C{vTJ)S>$AjcEhozEIFy3F&f{H=l4tp7`4 z+E+t&SZvEGalD(BJili^pf_0O?MF0v9 zftiBy41|M9=fykB-Hf%PB_{8X=$IIa2GFTZFHut7@jW{c5$B~o1(1rn4i|UQ*h3IcZ+Px;^Bg+kqQ6okJau{tg921k1f>U6?2aZ0lx4#DhYz`{&fVGa1_Ghv4+I?Qm(c4<;`LrJ# zXLBHI;ddg9Ck)>38YKLSO`1|c6CsJ=agKujjO?+gsHng)r@C?D1~(tLNMOPsez0H7!LJ)#<(2Os*49Fa`o)Ww z2xP1^HrtAnW&gqTuK|TQM&hVi2Umjx4HAsQ;7K?OfP1(?a5w%4}#G}wE7*KatQM+f`8)V=7xhz zH+WKk%S&0MtkS1uqYiPAmevfCkr9ozT)ImCToTNIOjs4X1nH0kekfRhum}7h6amQ% zeuv5HPaF&CmzHroe`WYPKwhy;9`TR&qZ^fb8yZG%iPB=O+2#VluKc6-3O*gfU!9(u zVkQZnFx?>=^@qX;p#;=_%*xG$l|H|@xye3e?A&$r&F8e@VghD}R~0qCzu6)zRuILW zQC?l$KHnwo*$l$x z;Cmx+*k#E#pOHcgSXxbu7-DV$FxxUT5UhD^^P?{_gdF@Jb^x|(+^X5s7WULq9>YJu zuFd`Y|Azsv|AMmq>!=vVZr?0Gp58^=&Ha4vEQ}BE2JUoW`Mz&rU z>R8VybZme9^5r&!QmU%@)Rnu1jv)~ff8B-@8b!|n2l&rr7fR>|bCV@v7JSzL%c0a7 zLBPfaPdg|^zwQZ7f2u?{jJZI-=oTd3#>OZi7t;pJR=?5!a;7i?G>=X~KsXN)I%ZZ@ z=O7l1inV)tduYZI9dctP2RKFstD|^12AEU?V5fPg4G02Nus2zZ49#&1V_;yQ6bqSy z%v&cMwleSsP+#55%nT|v=k_5L8^q4=D7mE}0A*b7{v47#pzF1OF$}dn2=s2m^!VTp z3}K+`O4xq9xjPpoYXGt_F+-ARuCSyLQ*BRe2p-@^7`{X1e9w*;$KD%-gN*>vh58P4 zP_hO)Ply~~4!lPhxw)Og77);^O-f2iy9Wk@9vT&3O6#UF@oHJ8J^Z>pTK8AAF3vJ4+xBtr*O*Iop^VRe>@xxBVWF#MuV}3OV zvVLgDN)KO?dqeB0g=j37l-I!~^FUu)TW0(3 zI2K7z&H+%s7+qK_pNR?#EvyIESr0JCBmlFG05@9(Du=A>4kSZtXX?es^dWjhLIQ(= zB*@mEKVYJ8qj3rt0sFi0VHP!8uEh1M0;C^-Sk?D7@Tynf4`_M3LE5MRVd+n@1_g6otQf3ltiQ$DYImi_;NwKlX!J+qoMc zK%npxESAf}%&*k6ppf%?Ij^OoPO`kO=i z5fHxDKPZR#B`6Ni1XCJN`Fg!dvZxHe-QHYy;LN09wjE&<4{nI4jH>afD`acXg7D=A z3BT-w#6%4kyQxrBQnF~!bDjd31~v#ZRIsRHwu+03S0S)e)c;y`6aXyg6s9y9Sq79} zWjk6R=q(Mt7L*Q99E$W90ew|Sz*v>iEDU0voF4sNN7KZzvTsvTjMkoEq=5|!7qSN8 z-M=p6{Uu2#5%xCyaQf%Jn)u3jdEJDY?Bfl3x<39KlsE)|hZX49cz6yfcPIGUWsj{- zUBq{0r@O%EMMExhVlLP)(Q*M7w*`30AMl;;y^~BC)g*=IWA6)U2nH zaH*jK+@ZJ%-OGQQ;hGgbgknNqBS9*&va1$#p%_bQ6cZ@8_=vfO!@2Hq8a64?CZ zPpTh%!4=ZLK4_L$4qQd<#}VF367!9cMB9dSCh!TV>v9Vi}jBSoE0drtEhuz8F$%08`LR zNTa13ynfF}Ff%8LKjlrD*U;3=bYA>41OzZfR>*llwm`Qeb?!XptGju?EO%g`#{j+( z_Qeal08L9lSvle#_pv7`A|e~)1Wx5yI9<_qBIy($hbpU8g{BqL0pCncys+R0YpYaAQ@#pUWx%DHNkJ*klngoic@HW8o?t?e0iAxSDF#$y9Ucc~QEi3Lwx%_o_TaXByu1-I ziqD@ve}rH&I0v6GTjG(NPi=|z8EU+-hWysdz zDMgjb`C!eIJS|lrFd+dXw?Os`P6Z)HA;*A@W0w*?0YRw$qVEN;m3at1nB$M6Hbg)E0Ab>6;z)v7d=uXj3IH&L!%sw$ z*V1Iw;p{9zp?%;HkSBP&*+zt>s$n)4GNgpLH`EezrJ#dB#v~Xf%a{ZONdeFXfujJy zyhw=Kq`|om+F%aGk`9!mfIQMvhcavuFkB%j2-eMu^mH=<_fPW|)br;}%zTdj$OFvBLUQgUVCHK*IF)x= zddCw07eo4~Vueks%CY;xH}EJyWSBoucn1Py{hUJvh|AqAS? zH&Kea=qMH%<0l&dL8Z+1%!eWNrDma8LMkT&6VOQ!_(lu_kkltYqENDX?IG9<15%or zye^`M)?KZC9DSq|GWd|4S2BGJ@dN1A|ID3Y=Z$PewW;GMZsY^?ONZI*Y!%ohv9@0T zpP#m4%d@hpYoQM#FiR>tE=-2Y~ykKR!adHSPTS>@4oZeQV3j| z2lw*<>8L*r-X@GXQ6{~6^QO(>m$T@ZdI4#wq&I}ubPxpUqrii1a*$T%fDxjDo8a7Q zE~~hR7RcsjfIw$nQs#TI`!)WCTLIGnUSwE9ib^+uF!hQcsHp?F zV&*A>CLamt5Mdy%xj%bmcDS{SDu#zpYW3>f1t5=!I`+^!(*by+rkLIo&h5LP2BMA! zve|TYLIg#;1JL;V%1Q{Nei7uoVU0hq;spQ)Fcf$Tf^__*&B(o!8x)XGNBkiE!VO8c z{8KQe%62PJSb$dfsyf?I&LX2aN_bu{iPVCkg59qs+tIde^qhfci$gGB)Kvu-Ag{;P zl0w-YPBqE|d0=KE8?G%SyX5|d$ZQe2v6mZE_K+EZ!48<;0LVH5+kiC*3U9>;3@nw_ z0!ir~mVh8vV{q_!yZaD>$d^P$V0>0lNr{CyWBbQIg{z5)iO$(87J0qD5YsWStdmRm z0wbV$lk)xQ&Wb4-`he{TV$4Ah7Cpr< z%J>5M6&3=aW_%D&k>>wM@*XyP1FVBKl&q{Qjh~I4`@A5Qpp#N)2pAGC=;$!Kl))6n ziF{8F&%>vqrwEyYyO9fe#rs<p&Yxbo|BxOTxmSdM2Dw>528kedDiI}$vjnM|qc|j_z zZR;PZVghhz7-F{}cgHnB6O5XO&Cb0633jDfNZ2U76MyBmrebq1p4pFY?G8uk=}FQ zd=)z&n4bCu+8%0mTMEYNOcIeJXfA3Gu(W<1PPqFe8k#b%4#s8ZoQlPDo3+{~tf@|d zxv$E~>&W4cix+~uV#IRcFjSk2;=Orn8>=DbcDVHb)t>-Yh#v|3`2KwXkWB9#=b-m# z=RG&)Frd1^pK;SHFP>2Z_j+m12lNEK(ZD=SHr(pH= zkA0l{=*+U@Qq!C>=Y`AxjY4zV+usS`!E4%zL&gq^1l33YKWp8%szRS#`6qor2Ng1HofQ?xu#~T`oPgK3RJ%|2m&BmCFvJWlkOWBpxI-8yIANLE%1IA z=~JhCC?X))sO2x50-qQHw*)#BMi=8Rs8=SaxD|b7KL@G`D*XU2Plq69{LN>AKBtG) zI`YqSj?qm8@p&9LxiAmP1k)t4*zmdnbVdSh0ND!m1-52wM*yTf1F-GE?AfWV?IrQ2 zzXGbOg+UBKkiJBrHYikw-B;XFw%9jec!8XOK?Oi@#>&bHsRKm9Ij&p@fQi)_ty4gy zwQw3AJb1vd%*x8jk*%D1Ghr7K4xx3;Bs25t&z5MO8C9M?e*9>@0ZtP8&71Y@p02Xp z5?O}4xqt#;)+rNqyUS6hx`YerlHzWkbh$0`IM1DyXH5>u{ai%=!Ls;c%>m0Iq|oGDAndiV@v2R z%5Z9K35_KLq`S=Yl5in+6Ojbbci?>|c9hvY*=L)5xw4lf3@^nBmJXt<4SD2ghw` zfphq!CTfF2L(kDSzQn}D4E_WqY_l2S%RD{|mUdF72Q02P=n+$3NOU_g52XXc%AWh> ze!0dbKuBRhx~L}bUw(5*P3kyCQC~mdW6w=?_6uM>RsIRddceEP!O2N_Ei+d+iOu7> z-t23KJdkevUcV-VXAKLlH9g1`2;fscfRmH6``0a$Q@{+JtA2m_8e=*B=*-5H`kxO? zEk|EXoZDJ3a_>a6h7n0NYktX{@_2~l4?GPl_jw56!L9X*(+=!Fzz^Qo{?46A&~NO8B_?*ZS^wa=+V)p;bDz~C)-8<8Sb%3 zmwaG%SheGfxd`$QJ0G9Cr>8jnIjrln1dutDmd&^*E+(e$st+$C3g6w{+CrvR>-c@& z>7(J|Z?!m81_TjzUcf0uMSjF@VZmG-e^MW2YC$?Eb^EDzvPPX^< z?j&r@i17{o1W~oi=Ta1Sj9`m6fvf~-taQoOHgK&*M=2n#F=$(b_(5(MJPsBqDMsk} z=s@$(Ls>Jk%ZO=CLm+Vk=Y&3QYAwic&$Q-plss5y*!o8LJ8W^n(0hi{2N z)y2cZ!-w|v?Qo>iHSz~%W(eo{pYk@BKVOB{B!IEFUap*?a-P}$RyuJH1bjr*utJJ% zWvj7A!{n^qpW|)!rXu{s$*G|XEs$+5A3WT$Jl4(CEIi$WS{W`4`qp9xl}P|#4hSBq z>Faac_>O_T70Vr@T4xAP!V_`sDsl5x$89eAqiq+Vmjo-J9mIe$I)8J%ge(|c3N$%0r&k{R}OGSoab9{ z!c*J&jeSqtK*3!A_Df#nJ40R*+++9DN7}1C_u~!3!e|+<-p@+oMge>FdxFi=KU&yj;RU(vKIe?;T!dkMjph8lWfV{Br%q9;#_*_=5&SPDQm?*2(Zfr;y^?mi=b*x4^LH zwqUR>#4=SGM8Mb;;RsWQJZC6sBf!aoh;}<<%Kq*KkK8jB)q1J$azK^(4RvssK&W%x zzx&O2T770~s^{6-+L{yKVz2E!kvzC4cx?nk8US(xwYRs=)<1ov(EMb7YcjH`gAZ#6 zyt`k|p4LKMTU$qG(j(-FYHY6WolKIm8Xt*;R8K;_dr3h?_p8S}?qY?3a0+5LI@4(m zqlydrgg;$xz!ct4^@~f`mQVkFot}P41*y~f%gcH*lVNwVNm(f<^gK^*3KG(~3X5aB#d{ zw` zFd%a`b0}nW2Zn5~laQQ1dXAY66bJJYupls{fia9sPXjMNU)xj>B1B6-6LBYevludy zMUI3N2raw_zyZ8raLZP}NBHo!ffoN+AOrc6dus zNC@za4xe0=6h#~yoCSE9mjco?J8NQJ@%X>haqZDi=5KtYVv}4#IBB-hVHLTIXpusc z&{U{Yo2H?4t7ws1mXcf8N%^P&BCtvTtY}}>{gy9(LD*kQj2X5M1zRoG=W6J! zGTEtfslL?6#H3*+Jx3lJl3Vf2#Kh zDv`+Wb2XvAX0cer3PhNB_8*O_cMlMX>(b@Zufan~l#I4<5>dp30HX?hP2+VhsLG)g@!CRbyS>Y>1TMBo$}nwld3W#N!(LCb{q zJrRp|N~1Y1k{;u-9g=$7L^FDqDv0A9--_U*72&X7NFqQOFd*3>0^U8JF*}3RK>Ucc zK~Y6T{AQ1`NuBN9xXby;Z1F(S>gj2gT*=gA>o3KziM66m%qVq8h`E5OA(kf<`&rX> zqoagF`ulnxij@^mLiwnusD@SLN3I-UHFy2W;YJQ_i|{Ku;J@(B`?CBA^23MP_QxF9 z8Gc{q1!O|VkJhBs1N<}<;C!lC?H2#*+{?nMnwqlq6UAcF=p zuK|cep$V}!NT)C9c_nyjZ=J;$-D#dmq;2hG<>^li2R28TwDUJ3u6im~@Z@>c6E{K;| z8+r1t&f^xID$znZTzS}kdH<$Ede*Ow@kjF%O z@Fl&WkeR#o7)kks!U1DRgY4 zH3`0-duNZpQU$%?Cfm&R2)x=M-lXBJLP<-;LXZZ)8j8q zJtL~lkN@XL{>QHPu&_GAXztUeTBBEOdW1sZhu?Q?lp}!^xCjJpTaCBl^=HHAoYtp@ zNu-ho4~RUBcjlP`13pl5`C->?e-@GU+tp?x9}>*s~Z zi{0M(^%@kv)`jM}87hy+L0O(ok(u6bROT?5u8{JS0_I8&TY*Hx4~@W{YpY>v1NPj- z=QBuDs2SDNa`W=i=D?rj0>x}^d$oQJNnr4 z@KPF_?h~<7d;XlCwV+K$r@z@U^|38`d-|vFO*P&(IheY)ONWF{_V8iAu4|G+5|yo*t|`Hb`7g!gV0&l6HM1a@PPs}8KNWVr2ccTYl+6@Y`& z?_PXEQWcqMFGa|Y2I^Z)TYKiJ;CRzoqTdxcCQl3~Z7dn-B%Ar%?lewXFmD&A5eu2Y z?>6G8(F2Qp80C0C;pigyg5y3?)IU01U>T%^73(sC5zx2kU@zCi)3r=JCUX_1xhW=e z=IW^uYNcuT_~G^^#X|<4?^c+*CppO3+p|r25FvJqqFd@|G$Ilmuied42#%8lC`k^N z^YvsNeQayb2yeVx<~5%^7UCLa{#!SN5faMMCu-R(VujISBa`QJ|JWPZiunQN7GHMq mkIOssJBadLY1E-FVZXY5vNS46;RGU+NjtZDINfsaP5cL$3a< Date: Thu, 24 Dec 2020 13:09:54 +0100 Subject: [PATCH 2/3] Add docstrings --- python/core/auto_generated/qgslegendstyle.sip.in | 14 ++++++++++++++ src/core/qgslegendstyle.h | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/python/core/auto_generated/qgslegendstyle.sip.in b/python/core/auto_generated/qgslegendstyle.sip.in index afbaae433f71..9ebf36ea908e 100644 --- a/python/core/auto_generated/qgslegendstyle.sip.in +++ b/python/core/auto_generated/qgslegendstyle.sip.in @@ -106,8 +106,22 @@ Sets the alignment for the legend component. %End double indent(); +%Docstring +Returns the indent of a group or subgroup. + +.. seealso:: :py:func:`indent` + +.. versionadded:: 3.18 +%End void setIndent( double indent ); +%Docstring +Sets the indent of a group or subgroup. + +.. seealso:: :py:func:`indent` + +.. versionadded:: 3.18 +%End void writeXml( const QString &name, QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context = QgsReadWriteContext() ) const; %Docstring diff --git a/src/core/qgslegendstyle.h b/src/core/qgslegendstyle.h index 7369f660fd75..ea5c56e2f9e2 100644 --- a/src/core/qgslegendstyle.h +++ b/src/core/qgslegendstyle.h @@ -121,8 +121,20 @@ class CORE_EXPORT QgsLegendStyle */ void setAlignment( Qt::Alignment alignment ) { mAlignment = alignment; } + /** + * Returns the indent of a group or subgroup. + * + * \see indent() + * \since QGIS 3.18 + */ double indent() { return mIndent; } + /** + * Sets the indent of a group or subgroup. + * + * \see indent() + * \since QGIS 3.18 + */ void setIndent( double indent ) { mIndent = indent; } /** From 7de030aa0bbc87006afcb67664983246230e7c27 Mon Sep 17 00:00:00 2001 From: Juernjakob Dugge Date: Sat, 16 Jan 2021 16:07:02 +0100 Subject: [PATCH 3/3] Handle indentation of right-aligned legends --- .../core/auto_generated/qgslegendstyle.sip.in | 4 ++-- src/core/qgslegendrenderer.cpp | 21 ++++++++++++++++-- src/core/qgslegendrenderer.h | 4 ++++ src/core/qgslegendstyle.h | 4 ++-- tests/src/core/testqgslegendrenderer.cpp | 19 ++++++++++++++++ ...legend_group_indent_right_align_symbol.png | Bin 0 -> 22729 bytes ...nt_right_align_symbol_right_align_text.png | Bin 0 -> 22328 bytes ...d_legend_group_indent_right_align_text.png | Bin 0 -> 22680 bytes 8 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 tests/testdata/control_images/legend/expected_legend_group_indent_right_align_symbol/expected_legend_group_indent_right_align_symbol.png create mode 100644 tests/testdata/control_images/legend/expected_legend_group_indent_right_align_symbol_right_align_text/expected_legend_group_indent_right_align_symbol_right_align_text.png create mode 100644 tests/testdata/control_images/legend/expected_legend_group_indent_right_align_text/expected_legend_group_indent_right_align_text.png diff --git a/python/core/auto_generated/qgslegendstyle.sip.in b/python/core/auto_generated/qgslegendstyle.sip.in index 9ebf36ea908e..580760c38b76 100644 --- a/python/core/auto_generated/qgslegendstyle.sip.in +++ b/python/core/auto_generated/qgslegendstyle.sip.in @@ -107,7 +107,7 @@ Sets the alignment for the legend component. double indent(); %Docstring -Returns the indent of a group or subgroup. +Returns the indent (in mm) of a group or subgroup. .. seealso:: :py:func:`indent` @@ -116,7 +116,7 @@ Returns the indent of a group or subgroup. void setIndent( double indent ); %Docstring -Sets the indent of a group or subgroup. +Sets the indent (in mm) of a group or subgroup. .. seealso:: :py:func:`indent` diff --git a/src/core/qgslegendrenderer.cpp b/src/core/qgslegendrenderer.cpp index a00b849db4ec..8935f7a306c2 100644 --- a/src/core/qgslegendrenderer.cpp +++ b/src/core/qgslegendrenderer.cpp @@ -284,6 +284,7 @@ QList QgsLegendRenderer::createComponen { QgsLayerTreeGroup *nodeGroup = QgsLayerTree::toGroup( node ); QString style = node->customProperty( QStringLiteral( "legend/title-style" ) ).toString(); + // Update the required indent for the group/subgroup items, starting from the indent accumulated from parent groups double newIndent = indent; if ( style == QLatin1String( "subgroup" ) ) { @@ -680,13 +681,22 @@ QSizeF QgsLegendRenderer::drawGroup( const LegendComponentGroup &group, QgsRende double indentWidth = component.indent; if ( s == QgsLegendStyle::Subgroup ) { + // Remove indent - the subgroup items should be indented, not the subgroup title indentWidth -= mSettings.style( QgsLegendStyle::Subgroup ).indent( ); } else { + // Remove indent - the group items should be indented, not the group title indentWidth -= mSettings.style( QgsLegendStyle::Group ).indent( ); } - columnContextForItem.left += indentWidth; + if ( mSettings.style( QgsLegendStyle::SymbolLabel ).alignment() == Qt::AlignLeft ) + { + columnContextForItem.left += indentWidth; + } + if ( mSettings.style( QgsLegendStyle::SymbolLabel ).alignment() == Qt::AlignRight ) + { + columnContextForItem.right -= indentWidth; + } groupSize = drawGroupTitle( groupItem, context, columnContextForItem, currentY ); size.rwidth() = std::max( groupSize.width(), size.width() ); } @@ -719,7 +729,14 @@ QSizeF QgsLegendRenderer::drawGroup( const LegendComponentGroup &group, QgsRende ColumnContext columnContextForItem = columnContext; double indentWidth = 0; indentWidth = component.indent; - columnContextForItem.left += indentWidth; + if ( mSettings.style( QgsLegendStyle::SymbolLabel ).alignment() == Qt::AlignLeft ) + { + columnContextForItem.left += indentWidth; + } + if ( mSettings.style( QgsLegendStyle::SymbolLabel ).alignment() == Qt::AlignRight ) + { + columnContextForItem.right -= indentWidth; + } LegendComponent symbolComponent = drawSymbolItem( legendNode, context, columnContextForItem, currentY, component.maxSiblingSymbolWidth ); // expand width, it may be wider because of label offsets diff --git a/src/core/qgslegendrenderer.h b/src/core/qgslegendrenderer.h index c64443732649..d329fbc85ac6 100644 --- a/src/core/qgslegendrenderer.h +++ b/src/core/qgslegendrenderer.h @@ -144,6 +144,10 @@ class CORE_EXPORT QgsLegendRenderer //! Component size QSizeF size; + /** + * Starting indent for groups/subgroups nested in other groups/subgroups. + * This value is the sum of the indents of all parent groups/subgroups. + */ double indent = 0; /** diff --git a/src/core/qgslegendstyle.h b/src/core/qgslegendstyle.h index ea5c56e2f9e2..6a418b322ff6 100644 --- a/src/core/qgslegendstyle.h +++ b/src/core/qgslegendstyle.h @@ -122,7 +122,7 @@ class CORE_EXPORT QgsLegendStyle void setAlignment( Qt::Alignment alignment ) { mAlignment = alignment; } /** - * Returns the indent of a group or subgroup. + * Returns the indent (in mm) of a group or subgroup. * * \see indent() * \since QGIS 3.18 @@ -130,7 +130,7 @@ class CORE_EXPORT QgsLegendStyle double indent() { return mIndent; } /** - * Sets the indent of a group or subgroup. + * Sets the indent (in mm) of a group or subgroup. * * \see indent() * \since QGIS 3.18 diff --git a/tests/src/core/testqgslegendrenderer.cpp b/tests/src/core/testqgslegendrenderer.cpp index e323720e041d..908721a028ee 100644 --- a/tests/src/core/testqgslegendrenderer.cpp +++ b/tests/src/core/testqgslegendrenderer.cpp @@ -722,6 +722,25 @@ void TestQgsLegendRenderer::testGroupIndent() _renderLegend( QStringLiteral( "legend_group_indent" ), &legendModel, settings ); QVERIFY( _verifyImage( QStringLiteral( "legend_group_indent" ), mReport ) ); + settings.rstyle( QgsLegendStyle::Group ).setAlignment( Qt::AlignRight ); + settings.rstyle( QgsLegendStyle::Subgroup ).setAlignment( Qt::AlignRight ); + settings.rstyle( QgsLegendStyle::SymbolLabel ).setAlignment( Qt::AlignRight ); + _renderLegend( QStringLiteral( "legend_group_indent_right_align_text" ), &legendModel, settings ); + QVERIFY( _verifyImage( QStringLiteral( "legend_group_indent_right_align_text" ), mReport ) ); + + 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 ); + _renderLegend( QStringLiteral( "legend_group_indent_right_align_symbol" ), &legendModel, settings ); + QVERIFY( _verifyImage( QStringLiteral( "legend_group_indent_right_align_symbol" ), mReport ) ); + + 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 ); + _renderLegend( QStringLiteral( "legend_group_indent_right_align_symbol_right_align_text" ), &legendModel, settings ); + QVERIFY( _verifyImage( QStringLiteral( "legend_group_indent_right_align_symbol_right_align_text" ), mReport ) ); } void TestQgsLegendRenderer::testRightAlignText() diff --git a/tests/testdata/control_images/legend/expected_legend_group_indent_right_align_symbol/expected_legend_group_indent_right_align_symbol.png b/tests/testdata/control_images/legend/expected_legend_group_indent_right_align_symbol/expected_legend_group_indent_right_align_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa1957bde52ca8b50c668955980c3bf00858e0a GIT binary patch literal 22729 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 z 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 literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_group_indent_right_align_symbol_right_align_text/expected_legend_group_indent_right_align_symbol_right_align_text.png b/tests/testdata/control_images/legend/expected_legend_group_indent_right_align_symbol_right_align_text/expected_legend_group_indent_right_align_symbol_right_align_text.png new file mode 100644 index 0000000000000000000000000000000000000000..6b0dfc6bfee643a79051e345d38123013f5277af GIT binary patch literal 22328 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 ipD-S6&hcMBPqB