From 16e98f205acbe3a2c6240b0851dd3561a07b7ded Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 1 Feb 2018 12:04:22 +1000 Subject: [PATCH] Default to a dark gray instead of black for symbol outlines Avoiding the very high constrast pure black results in cartographically more pleasing styles, so it's nice to do this by default. This should result in nicer looking maps being created in QGIS when users don't do any manual style tweaks. --- src/core/symbology/qgsellipsesymbollayer.cpp | 2 +- src/core/symbology/qgsfillsymbollayer.cpp | 4 ++-- src/core/symbology/qgsfillsymbollayer.h | 2 +- src/core/symbology/qgslinesymbollayer.h | 2 +- src/core/symbology/qgsmarkersymbollayer.cpp | 4 ++-- src/core/symbology/qgsmarkersymbollayer.h | 4 ++-- tests/src/core/testqgscentroidfillsymbol.cpp | 2 ++ tests/src/core/testqgslayertree.cpp | 4 ++++ tests/src/core/testqgslayoutatlas.cpp | 2 ++ tests/src/core/testqgslayoutitem.cpp | 4 ++++ tests/src/core/testqgslayoutmapgrid.cpp | 2 ++ tests/src/core/testqgslayoutpage.cpp | 2 ++ tests/src/core/testqgslayoutshapes.cpp | 1 + .../core/testqgspointpatternfillsymbol.cpp | 2 ++ tests/src/core/testqgssymbol.cpp | 3 +++ tests/src/python/test_qgsannotation.py | 12 +++++++++++- tests/src/python/test_qgsfillsymbollayers.py | 1 + .../test_qgsgeometrygeneratorsymbollayer.py | 17 ++++++++++------- tests/src/python/test_qgslayoutatlas.py | 8 ++++---- tests/src/python/test_qgslayoutmapgrid.py | 1 + tests/src/python/test_qgslinesymbollayers.py | 2 +- tests/src/python/test_qgsrulebasedrenderer.py | 6 +++--- .../python/test_qgssinglesymbolrenderer.py | 2 +- tests/src/python/test_qgssymbol.py | 4 ++-- .../test_qgssymbolexpressionvariables.py | 6 +++--- .../python/test_qgssymbollayer_createsld.py | 1 + .../expected_nullrenderer_selected_mask.png | Bin 1622 -> 3458 bytes 27 files changed, 69 insertions(+), 31 deletions(-) diff --git a/src/core/symbology/qgsellipsesymbollayer.cpp b/src/core/symbology/qgsellipsesymbollayer.cpp index 3dc57b12e92..1cd3ac7fd07 100644 --- a/src/core/symbology/qgsellipsesymbollayer.cpp +++ b/src/core/symbology/qgsellipsesymbollayer.cpp @@ -29,7 +29,7 @@ QgsEllipseSymbolLayer::QgsEllipseSymbolLayer() : mSymbolName( QStringLiteral( "circle" ) ) - , mStrokeColor( Qt::black ) + , mStrokeColor( QColor( 70, 70, 70 ) ) { mColor = Qt::white; mPen.setColor( mStrokeColor ); diff --git a/src/core/symbology/qgsfillsymbollayer.cpp b/src/core/symbology/qgsfillsymbollayer.cpp index d7c35461d25..e43316a17c4 100644 --- a/src/core/symbology/qgsfillsymbollayer.cpp +++ b/src/core/symbology/qgsfillsymbollayer.cpp @@ -1712,7 +1712,7 @@ QgsSVGFillSymbolLayer::QgsSVGFillSymbolLayer( const QString &svgFilePath, double mStrokeWidth = 0.3; mAngle = angle; mColor = QColor( 255, 255, 255 ); - mSvgStrokeColor = QColor( 0, 0, 0 ); + mSvgStrokeColor = QColor( 70, 70, 70 ); mSvgStrokeWidth = 0.2; setDefaultSvgParams(); mSvgPattern = nullptr; @@ -1729,7 +1729,7 @@ QgsSVGFillSymbolLayer::QgsSVGFillSymbolLayer( const QByteArray &svgData, double mStrokeWidth = 0.3; mAngle = angle; mColor = QColor( 255, 255, 255 ); - mSvgStrokeColor = QColor( 0, 0, 0 ); + mSvgStrokeColor = QColor( 70, 70, 70 ); mSvgStrokeWidth = 0.2; setSubSymbol( new QgsLineSymbol() ); setDefaultSvgParams(); diff --git a/src/core/symbology/qgsfillsymbollayer.h b/src/core/symbology/qgsfillsymbollayer.h index 285e156d8a2..4a602a69ae0 100644 --- a/src/core/symbology/qgsfillsymbollayer.h +++ b/src/core/symbology/qgsfillsymbollayer.h @@ -22,7 +22,7 @@ #define DEFAULT_SIMPLEFILL_COLOR QColor(0,0,255) #define DEFAULT_SIMPLEFILL_STYLE Qt::SolidPattern -#define DEFAULT_SIMPLEFILL_BORDERCOLOR QColor(0,0,0) +#define DEFAULT_SIMPLEFILL_BORDERCOLOR QColor( 70, 70, 70 ) #define DEFAULT_SIMPLEFILL_BORDERSTYLE Qt::SolidLine #define DEFAULT_SIMPLEFILL_BORDERWIDTH DEFAULT_LINE_WIDTH #define DEFAULT_SIMPLEFILL_JOINSTYLE Qt::BevelJoin diff --git a/src/core/symbology/qgslinesymbollayer.h b/src/core/symbology/qgslinesymbollayer.h index 951f9b46c59..faf5e73f028 100644 --- a/src/core/symbology/qgslinesymbollayer.h +++ b/src/core/symbology/qgslinesymbollayer.h @@ -25,7 +25,7 @@ class QgsExpression; -#define DEFAULT_SIMPLELINE_COLOR QColor(0,0,0) +#define DEFAULT_SIMPLELINE_COLOR QColor(70,70,70) #define DEFAULT_SIMPLELINE_WIDTH DEFAULT_LINE_WIDTH #define DEFAULT_SIMPLELINE_PENSTYLE Qt::SolidLine #define DEFAULT_SIMPLELINE_JOINSTYLE Qt::BevelJoin diff --git a/src/core/symbology/qgsmarkersymbollayer.cpp b/src/core/symbology/qgsmarkersymbollayer.cpp index 7bf0dcd7437..d6fc2b1d563 100644 --- a/src/core/symbology/qgsmarkersymbollayer.cpp +++ b/src/core/symbology/qgsmarkersymbollayer.cpp @@ -1698,8 +1698,8 @@ QgsSvgMarkerSymbolLayer::QgsSvgMarkerSymbolLayer( const QString &path, double si mScaleMethod = scaleMethod; mStrokeWidth = 0.2; mStrokeWidthUnit = QgsUnitTypes::RenderMillimeters; - mColor = QColor( Qt::black ); - mStrokeColor = QColor( Qt::black ); + mColor = QColor( 70, 70, 70 ); + mStrokeColor = QColor( 70, 70, 70 ); updateDefaultAspectRatio(); } diff --git a/src/core/symbology/qgsmarkersymbollayer.h b/src/core/symbology/qgsmarkersymbollayer.h index f16d4cf65ca..02f6c468217 100644 --- a/src/core/symbology/qgsmarkersymbollayer.h +++ b/src/core/symbology/qgsmarkersymbollayer.h @@ -23,7 +23,7 @@ #define DEFAULT_SIMPLEMARKER_NAME "circle" #define DEFAULT_SIMPLEMARKER_COLOR QColor(255,0,0) -#define DEFAULT_SIMPLEMARKER_BORDERCOLOR QColor(0,0,0) +#define DEFAULT_SIMPLEMARKER_BORDERCOLOR QColor( 70, 70, 70 ) #define DEFAULT_SIMPLEMARKER_JOINSTYLE Qt::BevelJoin #define DEFAULT_SIMPLEMARKER_SIZE DEFAULT_POINT_SIZE #define DEFAULT_SIMPLEMARKER_ANGLE 0 @@ -650,7 +650,7 @@ class CORE_EXPORT QgsSvgMarkerSymbolLayer : public QgsMarkerSymbolLayer #define DEFAULT_FONTMARKER_FONT "Dingbats" #define DEFAULT_FONTMARKER_CHR QChar('A') #define DEFAULT_FONTMARKER_SIZE POINT2MM(12) -#define DEFAULT_FONTMARKER_COLOR QColor(Qt::black) +#define DEFAULT_FONTMARKER_COLOR QColor( 70, 70, 70 ) #define DEFAULT_FONTMARKER_BORDERCOLOR QColor(Qt::white) #define DEFAULT_FONTMARKER_JOINSTYLE Qt::MiterJoin #define DEFAULT_FONTMARKER_ANGLE 0 diff --git a/tests/src/core/testqgscentroidfillsymbol.cpp b/tests/src/core/testqgscentroidfillsymbol.cpp index c70a7c6240e..87ea4231897 100644 --- a/tests/src/core/testqgscentroidfillsymbol.cpp +++ b/tests/src/core/testqgscentroidfillsymbol.cpp @@ -30,6 +30,7 @@ #include #include #include +#include "qgsmarkersymbollayer.h" //qgis test includes #include "qgsrenderchecker.h" @@ -94,6 +95,7 @@ void TestQgsCentroidFillSymbol::initTestCase() //setup gradient fill mCentroidFill = new QgsCentroidFillSymbolLayer(); + static_cast< QgsSimpleMarkerSymbolLayer * >( mCentroidFill->subSymbol()->symbolLayer( 0 ) )->setStrokeColor( Qt::black ); mFillSymbol = new QgsFillSymbol(); mFillSymbol->changeSymbolLayer( 0, mCentroidFill ); mSymbolRenderer = new QgsSingleSymbolRenderer( mFillSymbol ); diff --git a/tests/src/core/testqgslayertree.cpp b/tests/src/core/testqgslayertree.cpp index 85209c8b81d..e15960883c5 100644 --- a/tests/src/core/testqgslayertree.cpp +++ b/tests/src/core/testqgslayertree.cpp @@ -381,6 +381,7 @@ void TestQgsLayerTree::testLegendSymbolCategorized() renderer->setSourceSymbol( QgsSymbol::defaultSymbol( QgsWkbTypes::PointGeometry ) ); QgsStringMap props; props.insert( QStringLiteral( "color" ), QStringLiteral( "#ff0000" ) ); + props.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); renderer->addCategory( QgsRendererCategory( "a", QgsMarkerSymbol::createSimple( props ), QStringLiteral( "a" ) ) ); props.insert( QStringLiteral( "color" ), QStringLiteral( "#00ff00" ) ); renderer->addCategory( QgsRendererCategory( "b", QgsMarkerSymbol::createSimple( props ), QStringLiteral( "b" ) ) ); @@ -397,6 +398,7 @@ void TestQgsLayerTree::testLegendSymbolGraduated() renderer->setSourceSymbol( QgsSymbol::defaultSymbol( QgsWkbTypes::PointGeometry ) ); QgsStringMap props; props.insert( QStringLiteral( "color" ), QStringLiteral( "#ff0000" ) ); + props.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); renderer->addClass( QgsRendererRange( 1, 2, QgsMarkerSymbol::createSimple( props ), QStringLiteral( "a" ) ) ); props.insert( QStringLiteral( "color" ), QStringLiteral( "#00ff00" ) ); renderer->addClass( QgsRendererRange( 2, 3, QgsMarkerSymbol::createSimple( props ), QStringLiteral( "b" ) ) ); @@ -411,6 +413,7 @@ void TestQgsLayerTree::testLegendSymbolRuleBased() QgsRuleBasedRenderer::Rule *root = new QgsRuleBasedRenderer::Rule( nullptr ); QgsStringMap props; props.insert( QStringLiteral( "color" ), QStringLiteral( "#ff0000" ) ); + props.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); root->appendChild( new QgsRuleBasedRenderer::Rule( QgsMarkerSymbol::createSimple( props ), 0, 0, QStringLiteral( "\"col1\"=1" ) ) ); props.insert( QStringLiteral( "color" ), QStringLiteral( "#00ff00" ) ); root->appendChild( new QgsRuleBasedRenderer::Rule( QgsMarkerSymbol::createSimple( props ), 0, 0, QStringLiteral( "\"col1\"=2" ) ) ); @@ -509,6 +512,7 @@ void TestQgsLayerTree::testRendererLegend( QgsFeatureRenderer *renderer ) //another test - check directly setting symbol at renderer QgsStringMap props; props.insert( QStringLiteral( "color" ), QStringLiteral( "#00ffff" ) ); + props.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); renderer->setLegendSymbolItem( symbolList.at( 2 ).ruleKey(), QgsMarkerSymbol::createSimple( props ) ); m->refreshLayerLegend( n ); symbolNode = dynamic_cast< QgsSymbolLegendNode * >( m->findLegendNode( vl->id(), symbolList.at( 2 ).ruleKey() ) ); diff --git a/tests/src/core/testqgslayoutatlas.cpp b/tests/src/core/testqgslayoutatlas.cpp index f76ffa91a26..82207b5b3e7 100644 --- a/tests/src/core/testqgslayoutatlas.cpp +++ b/tests/src/core/testqgslayoutatlas.cpp @@ -130,6 +130,7 @@ void TestQgsLayoutAtlas::init() // fix the renderer, fill with green QgsStringMap props; props.insert( QStringLiteral( "color" ), QStringLiteral( "0,127,0" ) ); + props.insert( QStringLiteral( "outline_color" ), QStringLiteral( "0,0,0" ) ); QgsFillSymbol *fillSymbol = QgsFillSymbol::createSimple( props ); QgsSingleSymbolRenderer *renderer = new QgsSingleSymbolRenderer( fillSymbol ); mVectorLayer->setRenderer( renderer ); @@ -157,6 +158,7 @@ void TestQgsLayoutAtlas::init() // set the fill symbol of the overview map QgsStringMap props2; props2.insert( QStringLiteral( "color" ), QStringLiteral( "127,0,0,127" ) ); + props2.insert( QStringLiteral( "outline_color" ), QStringLiteral( "0,0,0" ) ); QgsFillSymbol *fillSymbol2 = QgsFillSymbol::createSimple( props2 ); mOverview->overview()->setFrameSymbol( fillSymbol2 ); diff --git a/tests/src/core/testqgslayoutitem.cpp b/tests/src/core/testqgslayoutitem.cpp index 35a32663a1e..08d9634fb13 100644 --- a/tests/src/core/testqgslayoutitem.cpp +++ b/tests/src/core/testqgslayoutitem.cpp @@ -1877,6 +1877,7 @@ void TestQgsLayoutItem::blendMode() QgsFillSymbol *fillSymbol = new QgsFillSymbol(); fillSymbol->changeSymbolLayer( 0, simpleFill ); simpleFill->setColor( QColor( 255, 150, 0 ) ); + simpleFill->setStrokeColor( Qt::black ); mComposerRect1->setSymbol( fillSymbol ); delete fillSymbol; @@ -1889,6 +1890,7 @@ void TestQgsLayoutItem::blendMode() QgsFillSymbol *fillSymbol2 = new QgsFillSymbol(); fillSymbol2->changeSymbolLayer( 0, simpleFill2 ); simpleFill2->setColor( QColor( 0, 100, 150 ) ); + simpleFill2->setStrokeColor( Qt::black ); mComposerRect2->setSymbol( fillSymbol2 ); delete fillSymbol2; @@ -1926,6 +1928,7 @@ void TestQgsLayoutItem::opacity() QgsFillSymbol *fillSymbol = new QgsFillSymbol(); fillSymbol->changeSymbolLayer( 0, simpleFill ); simpleFill->setColor( QColor( 255, 150, 0 ) ); + simpleFill->setStrokeColor( Qt::black ); mComposerRect1->setSymbol( fillSymbol ); delete fillSymbol; @@ -1938,6 +1941,7 @@ void TestQgsLayoutItem::opacity() QgsFillSymbol *fillSymbol2 = new QgsFillSymbol(); fillSymbol2->changeSymbolLayer( 0, simpleFill2 ); simpleFill2->setColor( QColor( 0, 100, 150 ) ); + simpleFill2->setStrokeColor( Qt::black ); mComposerRect2->setSymbol( fillSymbol2 ); delete fillSymbol2; diff --git a/tests/src/core/testqgslayoutmapgrid.cpp b/tests/src/core/testqgslayoutmapgrid.cpp index 264d83cc44c..2deff501347 100644 --- a/tests/src/core/testqgslayoutmapgrid.cpp +++ b/tests/src/core/testqgslayoutmapgrid.cpp @@ -20,6 +20,7 @@ #include "qgsmultirenderchecker.h" #include "qgslayoutitemmap.h" #include "qgslayoutitemmapgrid.h" +#include "qgsmarkersymbollayer.h" #include "qgsfontutils.h" #include "qgsproject.h" #include @@ -233,6 +234,7 @@ void TestQgsLayoutMapGrid::markerGrid() map->grid()->setIntervalY( 2000 ); map->grid()->setGridLineWidth( 0.5 ); map->grid()->setGridLineColor( QColor( 0, 0, 0 ) ); + static_cast< QgsSimpleMarkerSymbolLayer * >( map->grid()->markerSymbol()->symbolLayer( 0 ) )->setStrokeColor( Qt::black ); map->updateBoundingRect(); l.addLayoutItem( map ); diff --git a/tests/src/core/testqgslayoutpage.cpp b/tests/src/core/testqgslayoutpage.cpp index 8105fe987d2..65515eb7ea0 100644 --- a/tests/src/core/testqgslayoutpage.cpp +++ b/tests/src/core/testqgslayoutpage.cpp @@ -24,6 +24,7 @@ #include "qgssinglesymbolrenderer.h" #include "qgsfillsymbollayer.h" #include "qgslinesymbollayer.h" +#include "qgsmarkersymbollayer.h" #include "qgsmultirenderchecker.h" #include "qgslayoutpagecollection.h" #include @@ -234,6 +235,7 @@ void TestQgsLayoutPage::markerLinePaper() l.pageCollection()->addPage( page.release() ); QgsMarkerLineSymbolLayer *markerLine = new QgsMarkerLineSymbolLayer(); + static_cast< QgsSimpleMarkerSymbolLayer * >( markerLine->subSymbol()->symbolLayer( 0 ) )->setStrokeColor( Qt::black ); std::unique_ptr< QgsFillSymbol > markerLineSymbol = qgis::make_unique< QgsFillSymbol >(); markerLineSymbol->changeSymbolLayer( 0, markerLine ); l.pageCollection()->setPageStyleSymbol( markerLineSymbol.get() ); diff --git a/tests/src/core/testqgslayoutshapes.cpp b/tests/src/core/testqgslayoutshapes.cpp index c77e08a3ed9..fc6afdae40e 100644 --- a/tests/src/core/testqgslayoutshapes.cpp +++ b/tests/src/core/testqgslayoutshapes.cpp @@ -303,6 +303,7 @@ void TestQgsLayoutShapes::shapeRotation() QgsFillSymbol *fillSymbol = new QgsFillSymbol(); fillSymbol->changeSymbolLayer( 0, simpleFill ); simpleFill->setColor( QColor( 255, 150, 0 ) ); + simpleFill->setStrokeColor( Qt::black ); //simpleFill->setStrokeColor( Qt::yellow ); //simpleFill->setStrokeWidth( 6 ); shape->setSymbol( fillSymbol ); diff --git a/tests/src/core/testqgspointpatternfillsymbol.cpp b/tests/src/core/testqgspointpatternfillsymbol.cpp index 1c3d4f1f65b..1a654d5137e 100644 --- a/tests/src/core/testqgspointpatternfillsymbol.cpp +++ b/tests/src/core/testqgspointpatternfillsymbol.cpp @@ -133,6 +133,7 @@ void TestQgsPointPatternFillSymbol::pointPatternFillSymbol() QgsStringMap properties; properties.insert( QStringLiteral( "color" ), QStringLiteral( "0,0,0,255" ) ); + properties.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); properties.insert( QStringLiteral( "name" ), QStringLiteral( "circle" ) ); properties.insert( QStringLiteral( "size" ), QStringLiteral( "5.0" ) ); QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties ); @@ -147,6 +148,7 @@ void TestQgsPointPatternFillSymbol::dataDefinedSubSymbol() QgsStringMap properties; properties.insert( QStringLiteral( "color" ), QStringLiteral( "0,0,0,255" ) ); + properties.insert( QStringLiteral( "outline_color" ), QStringLiteral( "#000000" ) ); properties.insert( QStringLiteral( "name" ), QStringLiteral( "circle" ) ); properties.insert( QStringLiteral( "size" ), QStringLiteral( "5.0" ) ); QgsMarkerSymbol *pointSymbol = QgsMarkerSymbol::createSimple( properties ); diff --git a/tests/src/core/testqgssymbol.cpp b/tests/src/core/testqgssymbol.cpp index a02d5c7b856..1b3a78e5481 100644 --- a/tests/src/core/testqgssymbol.cpp +++ b/tests/src/core/testqgssymbol.cpp @@ -30,6 +30,7 @@ #include "qgslinesymbollayer.h" #include "qgsfillsymbollayer.h" #include "qgssinglesymbolrenderer.h" +#include "qgsmarkersymbollayer.h" #include "qgsstyle.h" @@ -177,6 +178,7 @@ void TestQgsSymbol::testCanvasClip() QgsMarkerLineSymbolLayer *markerLine = new QgsMarkerLineSymbolLayer(); markerLine->setPlacement( QgsMarkerLineSymbolLayer:: CentralPoint ); + static_cast< QgsSimpleMarkerSymbolLayer *>( markerLine->subSymbol()->symbolLayer( 0 ) )->setStrokeColor( Qt::black ); QgsLineSymbol *lineSymbol = new QgsLineSymbol(); lineSymbol->changeSymbolLayer( 0, markerLine ); QgsSingleSymbolRenderer *renderer = new QgsSingleSymbolRenderer( lineSymbol ); @@ -196,6 +198,7 @@ void TestQgsSymbol::testCanvasClip() ms.setLayers( QList() << mpPolysLayer ); QgsCentroidFillSymbolLayer *centroidFill = new QgsCentroidFillSymbolLayer(); + static_cast< QgsSimpleMarkerSymbolLayer * >( centroidFill->subSymbol()->symbolLayer( 0 ) )->setStrokeColor( Qt::black ); QgsFillSymbol *fillSymbol = new QgsFillSymbol(); fillSymbol->changeSymbolLayer( 0, centroidFill ); renderer = new QgsSingleSymbolRenderer( fillSymbol ); diff --git a/tests/src/python/test_qgsannotation.py b/tests/src/python/test_qgsannotation.py index e492256955e..1442ac157c2 100644 --- a/tests/src/python/test_qgsannotation.py +++ b/tests/src/python/test_qgsannotation.py @@ -55,6 +55,8 @@ class TestQgsAnnotation(unittest.TestCase): def testTextAnnotation(self): """ test rendering a text annotation""" a = QgsTextAnnotation() + a.fillSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) + a.markerSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) a.setFrameSize(QSizeF(300, 200)) a.setFrameOffsetFromReferencePoint(QPointF(40, 50)) doc = QTextDocument() @@ -71,6 +73,8 @@ class TestQgsAnnotation(unittest.TestCase): def testSvgAnnotation(self): """ test rendering a svg annotation""" a = QgsSvgAnnotation() + a.fillSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) + a.markerSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) a.setFrameSize(QSizeF(300, 200)) a.setFrameOffsetFromReferencePoint(QPointF(40, 50)) svg = TEST_DATA_DIR + "/sample_svg.svg" @@ -86,6 +90,8 @@ class TestQgsAnnotation(unittest.TestCase): def testHtmlAnnotation(self): """ test rendering a html annotation""" a = QgsHtmlAnnotation() + a.fillSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) + a.markerSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) a.setFrameSize(QSizeF(400, 250)) a.setFrameOffsetFromReferencePoint(QPointF(70, 90)) html = TEST_DATA_DIR + "/test_html.html" @@ -104,6 +110,8 @@ class TestQgsAnnotation(unittest.TestCase): 'test', "memory") a = QgsHtmlAnnotation() + a.fillSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) + a.markerSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) a.setFrameSize(QSizeF(400, 250)) a.setFrameOffsetFromReferencePoint(QPointF(70, 90)) a.setMapLayer(layer) @@ -121,6 +129,7 @@ class TestQgsAnnotation(unittest.TestCase): def testRelativePosition(self): """ test rendering an annotation without map point""" a = QgsHtmlAnnotation() + a.fillSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) a.setFrameSize(QSizeF(400, 250)) a.setHasFixedMapPosition(False) html = TEST_DATA_DIR + "/test_html.html" @@ -131,6 +140,7 @@ class TestQgsAnnotation(unittest.TestCase): def testMargins(self): """ test rendering an annotation with margins""" a = QgsHtmlAnnotation() + a.fillSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) a.setFrameSize(QSizeF(400, 250)) a.setHasFixedMapPosition(False) a.setContentsMargin(QgsMargins(15, 10, 30, 20)) @@ -144,7 +154,7 @@ class TestQgsAnnotation(unittest.TestCase): a = QgsTextAnnotation() a.setFrameSize(QSizeF(400, 250)) a.setHasFixedMapPosition(False) - a.setFillSymbol(QgsFillSymbol.createSimple({'color': 'blue', 'width_border': '5'})) + a.setFillSymbol(QgsFillSymbol.createSimple({'color': 'blue', 'width_border': '5', 'outline_color': 'black'})) im = self.renderAnnotation(a, QPointF(20, 30)) self.assertTrue(self.imageCheck('annotation_fillstyle', 'annotation_fillstyle', im)) diff --git a/tests/src/python/test_qgsfillsymbollayers.py b/tests/src/python/test_qgsfillsymbollayers.py index b9d4a3f34b7..a2ea51e5c98 100644 --- a/tests/src/python/test_qgsfillsymbollayers.py +++ b/tests/src/python/test_qgsfillsymbollayers.py @@ -58,6 +58,7 @@ class TestQgsFillSymbolLayers(unittest.TestCase): """ test that rendering a polygon with simple line symbol with offset results in closed line""" layer = QgsSimpleLineSymbolLayer() layer.setOffset(-1) + layer.setColor(QColor(0, 0, 0)) symbol = QgsFillSymbol() symbol.changeSymbolLayer(0, layer) diff --git a/tests/src/python/test_qgsgeometrygeneratorsymbollayer.py b/tests/src/python/test_qgsgeometrygeneratorsymbollayer.py index 0c5799c31e5..c631ebc8d24 100644 --- a/tests/src/python/test_qgsgeometrygeneratorsymbollayer.py +++ b/tests/src/python/test_qgsgeometrygeneratorsymbollayer.py @@ -28,7 +28,7 @@ import qgis # NOQA import os from qgis.PyQt.QtCore import QSize - +from qgis.PyQt.QtGui import QColor from qgis.core import ( QgsVectorLayer, QgsSingleSymbolRenderer, @@ -68,9 +68,9 @@ class TestQgsGeometryGeneratorSymbolLayerV2(unittest.TestCase): QgsProject.instance().addMapLayer(self.points_layer) # Create style - sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f'}) + sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'}) sym2 = QgsLineSymbol.createSimple({'color': '#fdbf6f'}) - sym3 = QgsMarkerSymbol.createSimple({'color': '#fdbf6f'}) + sym3 = QgsMarkerSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'}) self.polys_layer.setRenderer(QgsSingleSymbolRenderer(sym1)) self.lines_layer.setRenderer(QgsSingleSymbolRenderer(sym2)) @@ -88,6 +88,7 @@ class TestQgsGeometryGeneratorSymbolLayerV2(unittest.TestCase): sym = self.polys_layer.renderer().symbol() sym_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'centroid($geometry)'}) sym_layer.setSymbolType(QgsSymbol.Marker) + sym_layer.subSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) sym.changeSymbolLayer(0, sym_layer) rendered_layers = [self.polys_layer] @@ -101,12 +102,14 @@ class TestQgsGeometryGeneratorSymbolLayerV2(unittest.TestCase): def test_mixed(self): sym = self.polys_layer.renderer().symbol() - buffer_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'buffer($geometry, "value"/15)'}) + buffer_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'buffer($geometry, "value"/15)', 'outline_color': 'black'}) buffer_layer.setSymbolType(QgsSymbol.Fill) + buffer_layer.subSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) self.assertIsNotNone(buffer_layer.subSymbol()) sym.appendSymbolLayer(buffer_layer) - marker_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'centroid($geometry)'}) + marker_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'centroid($geometry)', 'outline_color': 'black'}) marker_layer.setSymbolType(QgsSymbol.Marker) + marker_layer.subSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) sym.appendSymbolLayer(marker_layer) rendered_layers = [self.polys_layer] @@ -120,7 +123,7 @@ class TestQgsGeometryGeneratorSymbolLayerV2(unittest.TestCase): def test_buffer_lines(self): sym = self.lines_layer.renderer().symbol() - buffer_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'buffer($geometry, "value"/15)'}) + buffer_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'buffer($geometry, "value"/15)', 'outline_color': 'black'}) buffer_layer.setSymbolType(QgsSymbol.Fill) self.assertIsNotNone(buffer_layer.subSymbol()) sym.appendSymbolLayer(buffer_layer) @@ -136,7 +139,7 @@ class TestQgsGeometryGeneratorSymbolLayerV2(unittest.TestCase): def test_buffer_points(self): sym = self.points_layer.renderer().symbol() - buffer_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'buffer($geometry, "staff"/15)'}) + buffer_layer = QgsGeometryGeneratorSymbolLayer.create({'geometryModifier': 'buffer($geometry, "staff"/15)', 'outline_color': 'black'}) buffer_layer.setSymbolType(QgsSymbol.Fill) self.assertIsNotNone(buffer_layer.subSymbol()) sym.appendSymbolLayer(buffer_layer) diff --git a/tests/src/python/test_qgslayoutatlas.py b/tests/src/python/test_qgslayoutatlas.py index 6154bc8a8a1..6477e9d0f3e 100644 --- a/tests/src/python/test_qgslayoutatlas.py +++ b/tests/src/python/test_qgslayoutatlas.py @@ -96,7 +96,7 @@ class TestQgsLayoutAtlas(unittest.TestCase): self.layout.initializeDefaults() # fix the renderer, fill with green - props = {"color": "0,127,0"} + props = {"color": "0,127,0", 'outline_color': 'black'} fillSymbol = QgsFillSymbol.createSimple(props) renderer = QgsSingleSymbolRenderer(fillSymbol) mVectorLayer.setRenderer(renderer) @@ -124,7 +124,7 @@ class TestQgsLayoutAtlas(unittest.TestCase): self.overview.setExtent(nextent) # set the fill symbol of the overview map - props2 = {"color": "127,0,0,127"} + props2 = {"color": "127,0,0,127", 'outline_color': 'black'} fillSymbol2 = QgsFillSymbol.createSimple(props2) self.overview.overview().setFrameSymbol(fillSymbol2) @@ -527,8 +527,8 @@ class TestQgsLayoutAtlas(unittest.TestCase): pr.addFeatures([f1, f2]) # categorized symbology - r = QgsCategorizedSymbolRenderer("attr", [QgsRendererCategory(1, QgsMarkerSymbol.createSimple({"color": "255,0,0"}), "red"), - QgsRendererCategory(2, QgsMarkerSymbol.createSimple({"color": "0,0,255"}), "blue")]) + r = QgsCategorizedSymbolRenderer("attr", [QgsRendererCategory(1, QgsMarkerSymbol.createSimple({"color": "255,0,0", 'outline_color': 'black'}), "red"), + QgsRendererCategory(2, QgsMarkerSymbol.createSimple({"color": "0,0,255", 'outline_color': 'black'}), "blue")]) ptLayer.setRenderer(r) QgsProject.instance().addMapLayer(ptLayer) diff --git a/tests/src/python/test_qgslayoutmapgrid.py b/tests/src/python/test_qgslayoutmapgrid.py index d78edd5641e..040e48bb1a7 100644 --- a/tests/src/python/test_qgslayoutmapgrid.py +++ b/tests/src/python/test_qgslayoutmapgrid.py @@ -124,6 +124,7 @@ class TestQgsLayoutMapGrid(unittest.TestCase): map.grid().setIntervalY(2000) map.grid().setAnnotationEnabled(False) map.grid().setBlendMode(QPainter.CompositionMode_SourceOver) + map.grid().markerSymbol().symbolLayer(0).setStrokeColor(QColor(0, 0, 0)) map.updateBoundingRect() checker = QgsLayoutChecker('composermap_markergrid', layout) diff --git a/tests/src/python/test_qgslinesymbollayers.py b/tests/src/python/test_qgslinesymbollayers.py index e312836b2da..c0c95fa6978 100644 --- a/tests/src/python/test_qgslinesymbollayers.py +++ b/tests/src/python/test_qgslinesymbollayers.py @@ -56,7 +56,7 @@ class TestQgsLineSymbolLayers(unittest.TestCase): def testSimpleLineWithOffset(self): """ test that rendering a simple line symbol with offset""" - layer = QgsSimpleLineSymbolLayer() + layer = QgsSimpleLineSymbolLayer(QColor(0, 0, 0)) layer.setOffset(1) symbol = QgsLineSymbol() diff --git a/tests/src/python/test_qgsrulebasedrenderer.py b/tests/src/python/test_qgsrulebasedrenderer.py index 03e2fe25491..f8523d64780 100644 --- a/tests/src/python/test_qgsrulebasedrenderer.py +++ b/tests/src/python/test_qgsrulebasedrenderer.py @@ -60,9 +60,9 @@ class TestQgsRulebasedRenderer(unittest.TestCase): QgsProject.instance().addMapLayer(layer) # Create rulebased style - sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f'}) - sym2 = QgsFillSymbol.createSimple({'color': '#71bd6c'}) - sym3 = QgsFillSymbol.createSimple({'color': '#1f78b4'}) + sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'}) + sym2 = QgsFillSymbol.createSimple({'color': '#71bd6c', 'outline_color': 'black'}) + sym3 = QgsFillSymbol.createSimple({'color': '#1f78b4', 'outline_color': 'black'}) self.r1 = QgsRuleBasedRenderer.Rule(sym1, 0, 0, '"id" = 1') self.r2 = QgsRuleBasedRenderer.Rule(sym2, 0, 0, '"id" = 2') diff --git a/tests/src/python/test_qgssinglesymbolrenderer.py b/tests/src/python/test_qgssinglesymbolrenderer.py index 429c87a8240..41959744874 100644 --- a/tests/src/python/test_qgssinglesymbolrenderer.py +++ b/tests/src/python/test_qgssinglesymbolrenderer.py @@ -53,7 +53,7 @@ class TestQgsSingleSymbolRenderer(unittest.TestCase): QgsProject.instance().addMapLayer(layer) # Create rulebased style - sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f'}) + sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'}) self.renderer = QgsSingleSymbolRenderer(sym1) layer.setRenderer(self.renderer) diff --git a/tests/src/python/test_qgssymbol.py b/tests/src/python/test_qgssymbol.py index ef04939e7e0..9fcb8b725b6 100644 --- a/tests/src/python/test_qgssymbol.py +++ b/tests/src/python/test_qgssymbol.py @@ -59,9 +59,9 @@ class TestQgsSymbol(unittest.TestCase): def setUp(self): #Create some simple symbols - self.fill_symbol = QgsFillSymbol.createSimple({'color': '#ffffff'}) + self.fill_symbol = QgsFillSymbol.createSimple({'color': '#ffffff', 'outline_color': 'black'}) self.line_symbol = QgsLineSymbol.createSimple({'color': '#ffffff', 'line_width': '3'}) - self.marker_symbol = QgsMarkerSymbol.createSimple({'color': '#ffffff', 'size': '3'}) + self.marker_symbol = QgsMarkerSymbol.createSimple({'color': '#ffffff', 'size': '3', 'outline_color': 'black'}) self.report = "

Python QgsSymbol Tests

\n" def tearDown(self): diff --git a/tests/src/python/test_qgssymbolexpressionvariables.py b/tests/src/python/test_qgssymbolexpressionvariables.py index 75647812867..ffc28636ebf 100644 --- a/tests/src/python/test_qgssymbolexpressionvariables.py +++ b/tests/src/python/test_qgssymbolexpressionvariables.py @@ -69,7 +69,7 @@ class TestQgsSymbolExpressionVariables(unittest.TestCase): def testPartNum(self): # Create rulebased style - sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f'}) + sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'}) renderer = QgsSingleSymbolRenderer(sym1) renderer.symbols(QgsRenderContext())[0].symbolLayers()[0].setDataDefinedProperty(QgsSymbolLayer.PropertyFillColor, QgsProperty.fromExpression('color_rgb( (@geometry_part_num - 1) * 200, 0, 0 )')) @@ -85,7 +85,7 @@ class TestQgsSymbolExpressionVariables(unittest.TestCase): def testPartCount(self): # Create rulebased style - sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f'}) + sym1 = QgsFillSymbol.createSimple({'color': '#fdbf6f', 'outline_color': 'black'}) renderer = QgsSingleSymbolRenderer(sym1) renderer.symbols(QgsRenderContext())[0].symbolLayers()[0].setDataDefinedProperty(QgsSymbolLayer.PropertyFillColor, QgsProperty.fromExpression('color_rgb( (@geometry_part_count - 1) * 200, 0, 0 )')) @@ -101,7 +101,7 @@ class TestQgsSymbolExpressionVariables(unittest.TestCase): def testSymbolColor(self): # Create rulebased style - sym1 = QgsFillSymbol.createSimple({'color': '#ff0000'}) + sym1 = QgsFillSymbol.createSimple({'color': '#ff0000', 'outline_color': 'black'}) renderer = QgsSingleSymbolRenderer(sym1) renderer.symbols(QgsRenderContext())[0].symbolLayers()[0].setDataDefinedProperty(QgsSymbolLayer.PropertyFillColor, QgsProperty.fromExpression('set_color_part( @symbol_color, \'value\', "Value" * 4)')) diff --git a/tests/src/python/test_qgssymbollayer_createsld.py b/tests/src/python/test_qgssymbollayer_createsld.py index 7fc152b36d4..b453b09fb52 100644 --- a/tests/src/python/test_qgssymbollayer_createsld.py +++ b/tests/src/python/test_qgssymbollayer_createsld.py @@ -315,6 +315,7 @@ class TestQgsSymbolLayerCreateSld(unittest.TestCase): symbol = QgsSVGFillSymbolLayer('test/star.svg', 10, 45) symbol.setSvgFillColor(QColor('blue')) symbol.setSvgStrokeWidth(3) + symbol.setSvgStrokeColor(QColor('black')) symbol.setOutputUnit(QgsUnitTypes.RenderPixels) symbol.subSymbol().setWidth(10) diff --git a/tests/testdata/control_images/null_renderer/expected_nullrenderer_selected/expected_nullrenderer_selected_mask.png b/tests/testdata/control_images/null_renderer/expected_nullrenderer_selected/expected_nullrenderer_selected_mask.png index c5c19db169d63778e32c88bf3ad3618d271901f8..d3dafa02338076ba4b31dfb6e55b83ea9fdb47e3 100644 GIT binary patch literal 3458 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 II;Vst0M|D1TmS$7