From d1be2ff2145d6a725d5eb577d186e86bb20e63e3 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 8 Oct 2015 23:14:18 +1100 Subject: [PATCH] Fix hardcoded border for raster legend items (fix #13540) Previously raster legend items always had a fixed black border. Now there's options to change the color/width of this border or disable it entirely. --- .../core/composer/qgscomposeritemcommand.sip | 1 + python/core/composer/qgscomposerlegend.sip | 55 +++++++++ python/core/qgslegendsettings.sip | 55 +++++++++ src/app/composer/qgscomposerlegendwidget.cpp | 53 +++++++++ src/app/composer/qgscomposerlegendwidget.h | 4 + src/core/composer/qgscomposeritemcommand.h | 1 + src/core/composer/qgscomposerlegend.cpp | 18 +++ src/core/composer/qgscomposerlegend.h | 55 +++++++++ .../layertree/qgslayertreemodellegendnode.cpp | 15 ++- src/core/qgslegendsettings.cpp | 3 + src/core/qgslegendsettings.h | 59 ++++++++++ .../composer/qgscomposerlegendwidgetbase.ui | 111 +++++++++++++++++- tests/src/core/testqgslegendrenderer.cpp | 18 +++ .../expected_legend_raster_border.png | Bin 0 -> 4569 bytes .../expected_legend_raster_border_mask.png | Bin 0 -> 808 bytes 15 files changed, 444 insertions(+), 4 deletions(-) create mode 100644 tests/testdata/control_images/legend/expected_legend_raster_border/expected_legend_raster_border.png create mode 100644 tests/testdata/control_images/legend/expected_legend_raster_border/expected_legend_raster_border_mask.png diff --git a/python/core/composer/qgscomposeritemcommand.sip b/python/core/composer/qgscomposeritemcommand.sip index 15bb4be07f7..664408b7f7c 100644 --- a/python/core/composer/qgscomposeritemcommand.sip +++ b/python/core/composer/qgscomposeritemcommand.sip @@ -68,6 +68,7 @@ class QgsComposerMergeCommand : QgsComposerItemCommand LegendIconSymbolSpace, LegendBoxSpace, LegendColumnSpace, + LegendRasterBorderWidth, //composer picture ComposerPictureRotation, // composer scalebar diff --git a/python/core/composer/qgscomposerlegend.sip b/python/core/composer/qgscomposerlegend.sip index 7e482ec5312..8dca1ce8d1d 100644 --- a/python/core/composer/qgscomposerlegend.sip +++ b/python/core/composer/qgscomposerlegend.sip @@ -129,6 +129,61 @@ class QgsComposerLegend : QgsComposerItem int equalColumnWidth() const; void setEqualColumnWidth( bool s ); + /** Returns whether a border will be drawn around raster symbol items. + * @see setDrawRasterBorder() + * @see rasterBorderColor() + * @see rasterBorderWidth() + * @note added in QGIS 2.12 + */ + bool drawRasterBorder() const; + + /** Sets whether a border will be drawn around raster symbol items. + * @param enabled set to true to draw borders + * @see drawRasterBorder() + * @see setRasterBorderColor() + * @see setRasterBorderWidth() + * @note added in QGIS 2.12 + */ + void setDrawRasterBorder( bool enabled ); + + /** Returns the border color for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @see setRasterBorderColor() + * @see drawRasterBorder() + * @see rasterBorderWidth() + * @note added in QGIS 2.12 + */ + QColor rasterBorderColor() const; + + /** Sets the border color for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @param color border color + * @see rasterBorderColor() + * @see setDrawRasterBorder() + * @see setRasterBorderWidth() + * @note added in QGIS 2.12 + */ + void setRasterBorderColor( const QColor& color ); + + /** Returns the border width (in millimeters) for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @see setRasterBorderWidth() + * @see drawRasterBorder() + * @see rasterBorderColor() + * @note added in QGIS 2.12 + */ + double rasterBorderWidth() const; + + /** Sets the border width for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @param width border width in millimeters + * @see rasterBorderWidth() + * @see setDrawRasterBorder() + * @see setRasterBorderColor() + * @note added in QGIS 2.12 + */ + void setRasterBorderWidth( double width ); + void setComposerMap( const QgsComposerMap* map ); const QgsComposerMap* composerMap() const; diff --git a/python/core/qgslegendsettings.sip b/python/core/qgslegendsettings.sip index 5bd81f1881b..bd2e1747004 100644 --- a/python/core/qgslegendsettings.sip +++ b/python/core/qgslegendsettings.sip @@ -59,6 +59,61 @@ class QgsLegendSettings QSizeF symbolSize() const; void setSymbolSize( QSizeF s ); + /** Returns whether a border will be drawn around raster symbol items. + * @see setDrawRasterBorder() + * @see rasterBorderColor() + * @see rasterBorderWidth() + * @note added in QGIS 2.12 + */ + bool drawRasterBorder() const; + + /** Sets whether a border will be drawn around raster symbol items. + * @param enabled set to true to draw borders + * @see drawRasterBorder() + * @see setRasterBorderColor() + * @see setRasterBorderWidth() + * @note added in QGIS 2.12 + */ + void setDrawRasterBorder( bool enabled ); + + /** Returns the border color for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @see setRasterBorderColor() + * @see drawRasterBorder() + * @see rasterBorderWidth() + * @note added in QGIS 2.12 + */ + QColor rasterBorderColor() const; + + /** Sets the border color for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @param color border color + * @see rasterBorderColor() + * @see setDrawRasterBorder() + * @see setRasterBorderWidth() + * @note added in QGIS 2.12 + */ + void setRasterBorderColor( const QColor& color ); + + /** Returns the border width (in millimeters) for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @see setRasterBorderWidth() + * @see drawRasterBorder() + * @see rasterBorderColor() + * @note added in QGIS 2.12 + */ + double rasterBorderWidth() const; + + /** Sets the border width for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @param width border width in millimeters + * @see rasterBorderWidth() + * @see setDrawRasterBorder() + * @see setRasterBorderColor() + * @note added in QGIS 2.12 + */ + void setRasterBorderWidth( double width ); + QSizeF wmsLegendSize() const; void setWmsLegendSize( QSizeF s ); diff --git a/src/app/composer/qgscomposerlegendwidget.cpp b/src/app/composer/qgscomposerlegendwidget.cpp index aeeabc14b4d..197ceff45b6 100644 --- a/src/app/composer/qgscomposerlegendwidget.cpp +++ b/src/app/composer/qgscomposerlegendwidget.cpp @@ -103,6 +103,10 @@ QgsComposerLegendWidget::QgsComposerLegendWidget( QgsComposerLegend* legend ) mFontColorButton->setColorDialogTitle( tr( "Select font color" ) ); mFontColorButton->setContext( "composer" ); + mRasterBorderColorButton->setColorDialogTitle( tr( "Select border color" ) ); + mRasterBorderColorButton->setAllowAlpha( true ); + mRasterBorderColorButton->setContext( "composer " ); + //add widget for item properties QgsComposerItemWidget* itemPropertiesWidget = new QgsComposerItemWidget( this, legend ); mainLayout->addWidget( itemPropertiesWidget ); @@ -161,6 +165,11 @@ void QgsComposerLegendWidget::setGuiElements() mIconLabelSpaceSpinBox->setValue( mLegend->style( QgsComposerLegendStyle::SymbolLabel ).margin( QgsComposerLegendStyle::Left ) ); mBoxSpaceSpinBox->setValue( mLegend->boxSpace() ); mColumnSpaceSpinBox->setValue( mLegend->columnSpace() ); + + mRasterBorderGroupBox->setChecked( mLegend->drawRasterBorder() ); + mRasterBorderWidthSpinBox->setValue( mLegend->rasterBorderWidth() ); + mRasterBorderColorButton->setColor( mLegend->rasterBorderColor() ); + mCheckBoxAutoUpdate->setChecked( mLegend->autoUpdateModel() ); refreshMapComboBox(); @@ -613,6 +622,47 @@ void QgsComposerLegendWidget::on_mMapComboBox_currentIndexChanged( int index ) } } +void QgsComposerLegendWidget::on_mRasterBorderGroupBox_toggled( bool state ) +{ + if ( !mLegend ) + { + return; + } + + mLegend->beginCommand( tr( "Legend raster borders" ) ); + mLegend->setDrawRasterBorder( state ); + mLegend->adjustBoxSize(); + mLegend->update(); + mLegend->endCommand(); +} + +void QgsComposerLegendWidget::on_mRasterBorderWidthSpinBox_valueChanged( double d ) +{ + if ( !mLegend ) + { + return; + } + + mLegend->beginCommand( tr( "Legend raster border width" ), QgsComposerMergeCommand::LegendRasterBorderWidth ); + mLegend->setRasterBorderWidth( d ); + mLegend->adjustBoxSize(); + mLegend->update(); + mLegend->endCommand(); +} + +void QgsComposerLegendWidget::on_mRasterBorderColorButton_colorChanged( const QColor& newColor ) +{ + if ( !mLegend ) + { + return; + } + + mLegend->beginCommand( tr( "Legend raster border color" ) ); + mLegend->setRasterBorderColor( newColor ); + mLegend->update(); + mLegend->endCommand(); +} + void QgsComposerLegendWidget::on_mAddToolButton_clicked() { if ( !mLegend ) @@ -894,6 +944,9 @@ void QgsComposerLegendWidget::blockAllSignals( bool b ) mBoxSpaceSpinBox->blockSignals( b ); mColumnSpaceSpinBox->blockSignals( b ); mFontColorButton->blockSignals( b ); + mRasterBorderGroupBox->blockSignals( b ); + mRasterBorderColorButton->blockSignals( b ); + mRasterBorderWidthSpinBox->blockSignals( b ); } void QgsComposerLegendWidget::refreshMapComboBox() diff --git a/src/app/composer/qgscomposerlegendwidget.h b/src/app/composer/qgscomposerlegendwidget.h index fdb833cf865..8f252fc594d 100644 --- a/src/app/composer/qgscomposerlegendwidget.h +++ b/src/app/composer/qgscomposerlegendwidget.h @@ -69,6 +69,10 @@ class QgsComposerLegendWidget: public QgsComposerItemBaseWidget, private Ui::Qgs void on_mCheckBoxAutoUpdate_stateChanged( int state ); void on_mMapComboBox_currentIndexChanged( int index ); + void on_mRasterBorderGroupBox_toggled( bool state ); + void on_mRasterBorderWidthSpinBox_valueChanged( double d ); + void on_mRasterBorderColorButton_colorChanged( const QColor& newColor ); + //item manipulation void on_mMoveDownToolButton_clicked(); void on_mMoveUpToolButton_clicked(); diff --git a/src/core/composer/qgscomposeritemcommand.h b/src/core/composer/qgscomposeritemcommand.h index 07117399702..bea9ddffdbb 100644 --- a/src/core/composer/qgscomposeritemcommand.h +++ b/src/core/composer/qgscomposeritemcommand.h @@ -102,6 +102,7 @@ class CORE_EXPORT QgsComposerMergeCommand: public QgsComposerItemCommand LegendIconSymbolSpace, LegendBoxSpace, LegendColumnSpace, + LegendRasterBorderWidth, //composer picture ComposerPictureRotation, // composer scalebar diff --git a/src/core/composer/qgscomposerlegend.cpp b/src/core/composer/qgscomposerlegend.cpp index 15799668f90..9cbaf1b64ca 100644 --- a/src/core/composer/qgscomposerlegend.cpp +++ b/src/core/composer/qgscomposerlegend.cpp @@ -28,6 +28,7 @@ #include "qgslegendrenderer.h" #include "qgslogger.h" #include "qgsproject.h" +#include "qgssymbollayerv2utils.h" #include #include #include @@ -241,6 +242,14 @@ void QgsComposerLegend::setSplitLayer( bool s ) { mSettings.setSplitLayer( s ); bool QgsComposerLegend::equalColumnWidth() const { return mSettings.equalColumnWidth(); } void QgsComposerLegend::setEqualColumnWidth( bool s ) { mSettings.setEqualColumnWidth( s ); } +bool QgsComposerLegend::drawRasterBorder() const { return mSettings.drawRasterBorder(); } +void QgsComposerLegend::setDrawRasterBorder( bool enabled ) { mSettings.setDrawRasterBorder( enabled ); } + +QColor QgsComposerLegend::rasterBorderColor() const { return mSettings.rasterBorderColor(); } +void QgsComposerLegend::setRasterBorderColor( const QColor& color ) { mSettings.setRasterBorderColor( color ); } + +double QgsComposerLegend::rasterBorderWidth() const { return mSettings.rasterBorderWidth(); } +void QgsComposerLegend::setRasterBorderWidth( double width ) { mSettings.setRasterBorderWidth( width ); } void QgsComposerLegend::synchronizeWithModel() { @@ -279,6 +288,11 @@ bool QgsComposerLegend::writeXML( QDomElement& elem, QDomDocument & doc ) const composerLegendElem.setAttribute( "symbolWidth", QString::number( mSettings.symbolSize().width() ) ); composerLegendElem.setAttribute( "symbolHeight", QString::number( mSettings.symbolSize().height() ) ); + + composerLegendElem.setAttribute( "rasterBorder", mSettings.drawRasterBorder() ); + composerLegendElem.setAttribute( "rasterBorderColor", QgsSymbolLayerV2Utils::encodeColor( mSettings.rasterBorderColor() ) ); + composerLegendElem.setAttribute( "rasterBorderWidth", QString::number( mSettings.rasterBorderWidth() ) ); + composerLegendElem.setAttribute( "wmsLegendWidth", QString::number( mSettings.wmsLegendSize().width() ) ); composerLegendElem.setAttribute( "wmsLegendHeight", QString::number( mSettings.wmsLegendSize().height() ) ); composerLegendElem.setAttribute( "wrapChar", mSettings.wrapChar() ); @@ -402,6 +416,10 @@ bool QgsComposerLegend::readXML( const QDomElement& itemElem, const QDomDocument mSettings.setSymbolSize( QSizeF( itemElem.attribute( "symbolWidth", "7.0" ).toDouble(), itemElem.attribute( "symbolHeight", "14.0" ).toDouble() ) ); mSettings.setWmsLegendSize( QSizeF( itemElem.attribute( "wmsLegendWidth", "50" ).toDouble(), itemElem.attribute( "wmsLegendHeight", "25" ).toDouble() ) ); + mSettings.setDrawRasterBorder( itemElem.attribute( "rasterBorder", "1" ) != "0" ); + mSettings.setRasterBorderColor( QgsSymbolLayerV2Utils::decodeColor( itemElem.attribute( "rasterBorderColor", "0,0,0" ) ) ); + mSettings.setRasterBorderWidth( itemElem.attribute( "rasterBorderWidth", "0" ).toDouble() ); + mSettings.setWrapChar( itemElem.attribute( "wrapChar" ) ); //composer map diff --git a/src/core/composer/qgscomposerlegend.h b/src/core/composer/qgscomposerlegend.h index 5f074ec9fbe..057659a5a9a 100644 --- a/src/core/composer/qgscomposerlegend.h +++ b/src/core/composer/qgscomposerlegend.h @@ -156,6 +156,61 @@ class CORE_EXPORT QgsComposerLegend : public QgsComposerItem bool equalColumnWidth() const; void setEqualColumnWidth( bool s ); + /** Returns whether a border will be drawn around raster symbol items. + * @see setDrawRasterBorder() + * @see rasterBorderColor() + * @see rasterBorderWidth() + * @note added in QGIS 2.12 + */ + bool drawRasterBorder() const; + + /** Sets whether a border will be drawn around raster symbol items. + * @param enabled set to true to draw borders + * @see drawRasterBorder() + * @see setRasterBorderColor() + * @see setRasterBorderWidth() + * @note added in QGIS 2.12 + */ + void setDrawRasterBorder( bool enabled ); + + /** Returns the border color for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @see setRasterBorderColor() + * @see drawRasterBorder() + * @see rasterBorderWidth() + * @note added in QGIS 2.12 + */ + QColor rasterBorderColor() const; + + /** Sets the border color for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @param color border color + * @see rasterBorderColor() + * @see setDrawRasterBorder() + * @see setRasterBorderWidth() + * @note added in QGIS 2.12 + */ + void setRasterBorderColor( const QColor& color ); + + /** Returns the border width (in millimeters) for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @see setRasterBorderWidth() + * @see drawRasterBorder() + * @see rasterBorderColor() + * @note added in QGIS 2.12 + */ + double rasterBorderWidth() const; + + /** Sets the border width for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @param width border width in millimeters + * @see rasterBorderWidth() + * @see setDrawRasterBorder() + * @see setRasterBorderColor() + * @note added in QGIS 2.12 + */ + void setRasterBorderWidth( double width ); + void setComposerMap( const QgsComposerMap* map ); const QgsComposerMap* composerMap() const { return mComposerMap;} diff --git a/src/core/layertree/qgslayertreemodellegendnode.cpp b/src/core/layertree/qgslayertreemodellegendnode.cpp index 6cc18acaece..f646d73196a 100644 --- a/src/core/layertree/qgslayertreemodellegendnode.cpp +++ b/src/core/layertree/qgslayertreemodellegendnode.cpp @@ -515,8 +515,21 @@ QSizeF QgsRasterSymbolLegendNode::drawSymbol( const QgsLegendSettings& settings, if ( QgsRasterRenderer* rasterRenderer = rasterLayer->renderer() ) itemColor.setAlpha( rasterRenderer->opacity() * 255.0 ); } - ctx->painter->setBrush( itemColor ); + + if ( settings.drawRasterBorder() ) + { + QPen pen; + pen.setColor( settings.rasterBorderColor() ); + pen.setWidthF( settings.rasterBorderWidth() ); + pen.setJoinStyle( Qt::MiterJoin ); + ctx->painter->setPen( pen ); + } + else + { + ctx->painter->setPen( Qt::NoPen ); + } + ctx->painter->drawRect( QRectF( ctx->point.x(), ctx->point.y() + ( itemHeight - settings.symbolSize().height() ) / 2, settings.symbolSize().width(), settings.symbolSize().height() ) ); } diff --git a/src/core/qgslegendsettings.cpp b/src/core/qgslegendsettings.cpp index a04dbe3101b..6e332f9bab2 100644 --- a/src/core/qgslegendsettings.cpp +++ b/src/core/qgslegendsettings.cpp @@ -30,6 +30,9 @@ QgsLegendSettings::QgsLegendSettings() , mColumnCount( 1 ) , mSplitLayer( false ) , mEqualColumnWidth( false ) + , mRasterSymbolBorder( true ) + , mRasterBorderColor( Qt::black ) + , mRasterBorderWidth( 0.0 ) , mMmPerMapUnit( 1 ) , mUseAdvancedEffects( true ) , mMapScale( 1 ) diff --git a/src/core/qgslegendsettings.h b/src/core/qgslegendsettings.h index 4cf9820194b..5291d6be9cc 100644 --- a/src/core/qgslegendsettings.h +++ b/src/core/qgslegendsettings.h @@ -82,6 +82,61 @@ class CORE_EXPORT QgsLegendSettings QSizeF symbolSize() const {return mSymbolSize;} void setSymbolSize( QSizeF s ) {mSymbolSize = s;} + /** Returns whether a border will be drawn around raster symbol items. + * @see setDrawRasterBorder() + * @see rasterBorderColor() + * @see rasterBorderWidth() + * @note added in QGIS 2.12 + */ + bool drawRasterBorder() const { return mRasterSymbolBorder; } + + /** Sets whether a border will be drawn around raster symbol items. + * @param enabled set to true to draw borders + * @see drawRasterBorder() + * @see setRasterBorderColor() + * @see setRasterBorderWidth() + * @note added in QGIS 2.12 + */ + void setDrawRasterBorder( bool enabled ) { mRasterSymbolBorder = enabled; } + + /** Returns the border color for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @see setRasterBorderColor() + * @see drawRasterBorder() + * @see rasterBorderWidth() + * @note added in QGIS 2.12 + */ + QColor rasterBorderColor() const { return mRasterBorderColor; } + + /** Sets the border color for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @param color border color + * @see rasterBorderColor() + * @see setDrawRasterBorder() + * @see setRasterBorderWidth() + * @note added in QGIS 2.12 + */ + void setRasterBorderColor( const QColor& color ) { mRasterBorderColor = color; } + + /** Returns the border width (in millimeters) for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @see setRasterBorderWidth() + * @see drawRasterBorder() + * @see rasterBorderColor() + * @note added in QGIS 2.12 + */ + double rasterBorderWidth() const { return mRasterBorderWidth; } + + /** Sets the border width for the border drawn around raster symbol items. The border is + * only drawn if drawRasterBorder() is true. + * @param width border width in millimeters + * @see rasterBorderWidth() + * @see setDrawRasterBorder() + * @see setRasterBorderColor() + * @note added in QGIS 2.12 + */ + void setRasterBorderWidth( double width ) { mRasterBorderWidth = width; } + QSizeF wmsLegendSize() const {return mWmsLegendSize;} void setWmsLegendSize( QSizeF s ) {mWmsLegendSize = s;} @@ -174,6 +229,10 @@ class CORE_EXPORT QgsLegendSettings /** Use the same width (maximum) for all columns */ bool mEqualColumnWidth; + bool mRasterSymbolBorder; + QColor mRasterBorderColor; + double mRasterBorderWidth; + QMap mStyleMap; /** Conversion ratio between millimeters and map units - for symbols with size given in map units */ diff --git a/src/ui/composer/qgscomposerlegendwidgetbase.ui b/src/ui/composer/qgscomposerlegendwidgetbase.ui index 5ebbb126912..449d221a375 100644 --- a/src/ui/composer/qgscomposerlegendwidgetbase.ui +++ b/src/ui/composer/qgscomposerlegendwidgetbase.ui @@ -63,9 +63,9 @@ 0 - 0 + -420 375 - 1291 + 1392 @@ -226,7 +226,7 @@ false - false + true false @@ -636,6 +636,108 @@ + + + + Draw border for raster symbols + + + true + + + composeritem + + + true + + + + + + Border color + + + + + + + + + + 0 + 0 + + + + + 120 + 0 + + + + + 120 + 16777215 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Thickness + + + true + + + mRasterBorderWidthSpinBox + + + + + + + + 0 + 0 + + + + Hairline + + + mm + + + 0.100000000000000 + + + false + + + + + + @@ -956,6 +1058,9 @@ mSymbolsColGroupBox mSymbolWidthSpinBox mSymbolHeightSpinBox + mRasterBorderGroupBox + mRasterBorderColorButton + mRasterBorderWidthSpinBox mSymbolsColGroupBox_2 mWmsLegendWidthSpinBox mWmsLegendHeightSpinBox diff --git a/tests/src/core/testqgslegendrenderer.cpp b/tests/src/core/testqgslegendrenderer.cpp index 93371a208c3..d2a96f4ff1d 100644 --- a/tests/src/core/testqgslegendrenderer.cpp +++ b/tests/src/core/testqgslegendrenderer.cpp @@ -98,6 +98,7 @@ class TestQgsLegendRenderer : public QObject void testLongSymbolText(); void testThreeColumns(); void testFilterByMap(); + void testRasterBorder(); private: QgsLayerTreeGroup* mRoot; @@ -327,5 +328,22 @@ void TestQgsLegendRenderer::testFilterByMap() QVERIFY( _verifyImage( testName, mReport ) ); } +void TestQgsLegendRenderer::testRasterBorder() +{ + QString testName = "legend_raster_border"; + + QgsLayerTreeGroup* root = new QgsLayerTreeGroup(); + root->addLayer( mRL ); + + QgsLayerTreeModel legendModel( root ); + + QgsLegendSettings settings; + _setStandardTestFont( settings ); + settings.setRasterBorderWidth( 2 ); + settings.setRasterBorderColor( Qt::green ); + _renderLegend( testName, &legendModel, settings ); + QVERIFY( _verifyImage( testName, mReport ) ); +} + QTEST_MAIN( TestQgsLegendRenderer ) #include "testqgslegendrenderer.moc" diff --git a/tests/testdata/control_images/legend/expected_legend_raster_border/expected_legend_raster_border.png b/tests/testdata/control_images/legend/expected_legend_raster_border/expected_legend_raster_border.png new file mode 100644 index 0000000000000000000000000000000000000000..9da7f6d269692cf8c52d3a23bff397febec6d11a GIT binary patch literal 4569 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 E7a0PIo&W#< literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_raster_border/expected_legend_raster_border_mask.png b/tests/testdata/control_images/legend/expected_legend_raster_border/expected_legend_raster_border_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec1e653339b0762b48fd460ee8e7b7e181deb63 GIT binary patch literal 808 zcmeAS@N?(olHy`uVBq!ia0vp^#Xwxf!3HFM_pJ#9Qfx`y?k)`fL2$v|<&%LToCO|{ zKxN#WAk1if^7LAuAbW|YuPgg~E)F4U*$3+myk=lv+Un`z7*cWT?Ol8CtU{UNAJ1FP zGj3s7F5r7g&hgp&r2;uQqD{-@IZR+#Yr2)QE83gisi?46c;QaAbk3#)LK|IA314{%yKYi+Y`DMt* zikQ23;fWGTKh$TW&EKy3)#m;7IQh1P>(;L~o#`XuDp(btn(?8}QmQxLNuHPw)8qpx z1_xEz*#2)id)D{un>QYl^z`&XG(`hllUly_@;+)JZ3w)W}uW)ckq4v%Q_Y zjqTBFwwg3hSTu4%!h+@5^>Zr=?_IhysjR$w>e)0=mPWSb#;CQ^jy*PC@h;L$t)&7V7Hg+_-md-qzc>w{P4q2)}pye$2U;nHwW~&YwSj>;C<4z3IUMET_^o zTUl6Kc=&K(UVi@mzo9SBEU3-R_1*VA+d}4?eD@-c+qZA;+Q0w$*|WWAnyC<#zkcnSSh<~E^15~FR)uI~78XvF7ueaebJM0pix(@GTFFj5 zo%*%PRweefj55Dg-8GuoGk4y+O{zb4+_AjjqLkR{b{H7UbLY>W{k)Q4SBIqQ zMAO;6-Nzr76%{3&K7D$chsv|l-~Z36YBCUzZj>@3)|--H!*DrWrh4{an^LB{Ts5!U1Ji literal 0 HcmV?d00001