Skip to content

Commit d464f86

Browse files
committedApr 6, 2016
[FEATURE] Null ("No symbol") renderer
Using this renderer no symbol will be drawn for features, but labeling, diagrams and other non-symbol parts will still be shown. Selections can still be made on the layer in the canvas and selected features will be rendered with a default symbol. Features being edited will also be shown. This is intended as a handy shortcut for layers which you only want to show labels or diagrams for, and avoids the need to render symbols with totally transparent fill/border to achieve this. (fix #12131)
1 parent 86ec27e commit d464f86

File tree

20 files changed

+566
-0
lines changed

20 files changed

+566
-0
lines changed
 

‎ci/travis/linux/qt5/blacklist.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ PyQgsLocalServer
3636
PyQgsMapUnitScale
3737
PyQgsMemoryProvider
3838
PyQgsNetworkContentFetcher
39+
PyQgsNullSymbolRenderer
3940
PyQgsPalLabelingBase
4041
PyQgsPalLabelingCanvas
4142
PyQgsPalLabelingComposer

‎images/images.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@
486486
<file>themes/default/rendererCategorizedSymbol.svg</file>
487487
<file>themes/default/rendererGraduatedSymbol.png</file>
488488
<file>themes/default/rendererGraduatedSymbol.svg</file>
489+
<file>themes/default/rendererNullSymbol.svg</file>
489490
<file>themes/default/rendererSingleSymbol.png</file>
490491
<file>themes/default/rendererSingleSymbol.svg</file>
491492
<file>themes/default/rendererRuleBasedSymbol.svg</file>
Lines changed: 84 additions & 0 deletions

Error rendering embedded code

Invalid image source.

‎python/core/core.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@
289289
%Include symbology-ng/qgsheatmaprenderer.sip
290290
%Include symbology-ng/qgsinvertedpolygonrenderer.sip
291291
%Include symbology-ng/qgslegendsymbolitemv2.sip
292+
%Include symbology-ng/qgsnullsymbolrenderer.sip
292293
%Include symbology-ng/qgspointdisplacementrenderer.sip
293294
%Include symbology-ng/qgsrendererv2.sip
294295
%Include symbology-ng/qgsrendererv2registry.sip
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/** \ingroup core
2+
* \class QgsNullSymbolRenderer
3+
* \brief Null symbol renderer. Renderer which draws no symbols for features by default, but allows for labeling
4+
* and diagrams for the layer. Selected features will also be drawn with a default symbol.
5+
* \note Added in version 2.16
6+
*/
7+
8+
class QgsNullSymbolRenderer : QgsFeatureRendererV2
9+
{
10+
%TypeHeaderCode
11+
#include <qgsnullsymbolrenderer.h>
12+
%End
13+
public:
14+
15+
QgsNullSymbolRenderer();
16+
17+
virtual ~QgsNullSymbolRenderer();
18+
19+
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature, QgsRenderContext& context );
20+
virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature, QgsRenderContext& context );
21+
22+
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false );
23+
virtual void startRender( QgsRenderContext& context, const QgsFields& fields );
24+
virtual void stopRender( QgsRenderContext& context );
25+
virtual bool willRenderFeature( QgsFeature& feat, QgsRenderContext& context );
26+
27+
virtual QList<QString> usedAttributes();
28+
virtual QString dump() const;
29+
virtual QgsFeatureRendererV2* clone() const /Factory/;
30+
virtual QgsSymbolV2List symbols( QgsRenderContext& context ) /PyName=symbols2/;
31+
32+
/** Creates a null renderer from XML element.
33+
* @param element DOM element
34+
* @returns new null symbol renderer
35+
*/
36+
static QgsFeatureRendererV2* create( QDomElement& element ) /Factory/;
37+
38+
virtual QDomElement save( QDomDocument& doc );
39+
40+
/** Creates a QgsNullSymbolRenderer from an existing renderer.
41+
* @param renderer renderer to convert from
42+
* @returns a new renderer if the conversion was possible, otherwise nullptr.
43+
*/
44+
static QgsNullSymbolRenderer* convertFromRenderer( const QgsFeatureRendererV2 *renderer ) /Factory/;
45+
46+
};

‎python/core/symbology-ng/qgsrendererv2.sip

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class QgsFeatureRendererV2
5050
sipType = sipType_QgsPointDisplacementRenderer;
5151
else if (sipCpp->type() == "25dRenderer")
5252
sipType = sipType_Qgs25DRenderer;
53+
else if (sipCpp->type() == "nullSymbol")
54+
sipType = sipType_QgsNullSymbolRenderer;
5355
else
5456
sipType = 0;
5557
%End

‎python/gui/gui.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@
208208
%Include symbology-ng/qgsheatmaprendererwidget.sip
209209
%Include symbology-ng/qgsinvertedpolygonrendererwidget.sip
210210
%Include symbology-ng/qgslayerpropertieswidget.sip
211+
%Include symbology-ng/qgsnullsymbolrendererwidget.sip
211212
%Include symbology-ng/qgspenstylecombobox.sip
212213
%Include symbology-ng/qgspointdisplacementrendererwidget.sip
213214
%Include symbology-ng/qgsrendererv2propertiesdialog.sip
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/** \ingroup gui
2+
* \class QgsNullSymbolRendererWidget
3+
* \brief Blank widget for customising QgsNullSymbolRenderer.
4+
* \note Added in version 2.16
5+
*/
6+
7+
class QgsNullSymbolRendererWidget : QgsRendererV2Widget
8+
{
9+
%TypeHeaderCode
10+
#include <qgsnullsymbolrendererwidget.h>
11+
%End
12+
13+
public:
14+
15+
//! Creates a new QgsNullSymbolRendererWidget object
16+
static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ) /Factory/;
17+
18+
//! Constructor for QgsNullSymbolRendererWidget
19+
QgsNullSymbolRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
20+
~QgsNullSymbolRendererWidget();
21+
22+
//! Returns a pointer to the configured renderer
23+
virtual QgsFeatureRendererV2* renderer();
24+
};

‎src/core/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ SET(QGIS_CORE_SRCS
2828
symbology-ng/qgslegendsymbolitemv2.cpp
2929
symbology-ng/qgslinesymbollayerv2.cpp
3030
symbology-ng/qgsmarkersymbollayerv2.cpp
31+
symbology-ng/qgsnullsymbolrenderer.cpp
3132
symbology-ng/qgspointdisplacementrenderer.cpp
3233
symbology-ng/qgsrendererv2.cpp
3334
symbology-ng/qgsrendererv2registry.cpp
@@ -796,6 +797,7 @@ SET(QGIS_CORE_HDRS
796797
symbology-ng/qgssinglesymbolrendererv2.h
797798
symbology-ng/qgsheatmaprenderer.h
798799
symbology-ng/qgsinvertedpolygonrenderer.h
800+
symbology-ng/qgsnullsymbolrenderer.h
799801
symbology-ng/qgssymbollayerv2.h
800802
symbology-ng/qgssymbollayerv2registry.h
801803
symbology-ng/qgssymbollayerv2utils.h
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/***************************************************************************
2+
qgsnullsymbolrenderer.cpp
3+
---------------------
4+
begin : November 2014
5+
copyright : (C) 2014 by Nyall Dawson
6+
email : nyall dot dawson at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
16+
#include "qgsnullsymbolrenderer.h"
17+
#include "qgssymbolv2.h"
18+
19+
#include <QDomDocument>
20+
#include <QDomElement>
21+
22+
QgsNullSymbolRenderer::QgsNullSymbolRenderer()
23+
: QgsFeatureRendererV2( "nullSymbol" )
24+
{
25+
}
26+
27+
QgsNullSymbolRenderer::~QgsNullSymbolRenderer()
28+
{
29+
}
30+
31+
QgsSymbolV2* QgsNullSymbolRenderer::symbolForFeature( QgsFeature& , QgsRenderContext& )
32+
{
33+
return nullptr;
34+
}
35+
36+
QgsSymbolV2* QgsNullSymbolRenderer::originalSymbolForFeature( QgsFeature&, QgsRenderContext& )
37+
{
38+
return nullptr;
39+
}
40+
41+
bool QgsNullSymbolRenderer::renderFeature( QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker )
42+
{
43+
//render selected features or features being edited only
44+
if ( !selected && !drawVertexMarker )
45+
{
46+
return true;
47+
}
48+
49+
if ( !feature.constGeometry() ||
50+
feature.constGeometry()->type() == QGis::NoGeometry ||
51+
feature.constGeometry()->type() == QGis::UnknownGeometry )
52+
return true;
53+
54+
if ( mSymbol.isNull() )
55+
{
56+
//create default symbol
57+
mSymbol.reset( QgsSymbolV2::defaultSymbol( feature.constGeometry()->type() ) );
58+
mSymbol->startRender( context );
59+
}
60+
61+
mSymbol->renderFeature( feature, context, layer, selected, drawVertexMarker, mCurrentVertexMarkerType, mCurrentVertexMarkerSize );
62+
63+
return true;
64+
}
65+
66+
void QgsNullSymbolRenderer::startRender( QgsRenderContext& context, const QgsFields& fields )
67+
{
68+
Q_UNUSED( context );
69+
Q_UNUSED( fields );
70+
}
71+
72+
void QgsNullSymbolRenderer::stopRender( QgsRenderContext& context )
73+
{
74+
if ( mSymbol.data() )
75+
{
76+
mSymbol->stopRender( context );
77+
}
78+
}
79+
80+
bool QgsNullSymbolRenderer::willRenderFeature( QgsFeature&, QgsRenderContext& )
81+
{
82+
//return true for every feature - so they are still selectable
83+
return true;
84+
}
85+
86+
QList<QString> QgsNullSymbolRenderer::usedAttributes()
87+
{
88+
return QList<QString>();
89+
}
90+
91+
QString QgsNullSymbolRenderer::dump() const
92+
{
93+
return QString( "NULL" );
94+
}
95+
96+
QgsFeatureRendererV2* QgsNullSymbolRenderer::clone() const
97+
{
98+
QgsNullSymbolRenderer* r = new QgsNullSymbolRenderer();
99+
return r;
100+
}
101+
102+
QgsSymbolV2List QgsNullSymbolRenderer::symbols( QgsRenderContext& )
103+
{
104+
return QgsSymbolV2List();
105+
}
106+
107+
QgsFeatureRendererV2* QgsNullSymbolRenderer::create( QDomElement& element )
108+
{
109+
Q_UNUSED( element );
110+
QgsNullSymbolRenderer* r = new QgsNullSymbolRenderer();
111+
return r;
112+
}
113+
114+
QDomElement QgsNullSymbolRenderer::save( QDomDocument& doc )
115+
{
116+
QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
117+
rendererElem.setAttribute( "type", "nullSymbol" );
118+
return rendererElem;
119+
}
120+
121+
QgsNullSymbolRenderer* QgsNullSymbolRenderer::convertFromRenderer( const QgsFeatureRendererV2 *renderer )
122+
{
123+
Q_UNUSED( renderer );
124+
return new QgsNullSymbolRenderer();
125+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/***************************************************************************
2+
qgsnullsymbolrenderer.h
3+
---------------------
4+
begin : November 2014
5+
copyright : (C) 2014 by Nyall Dawson
6+
email : nyall dot dawson at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
#ifndef QGSNULLSYMBOLRENDERER_H
16+
#define QGSNULLSYMBOLRENDERER_H
17+
18+
#include "qgis.h"
19+
#include "qgsrendererv2.h"
20+
#include "qgssymbolv2.h"
21+
22+
/** \ingroup core
23+
* \class QgsNullSymbolRenderer
24+
* \brief Null symbol renderer. Renderer which draws no symbols for features by default, but allows for labeling
25+
* and diagrams for the layer. Selected features will also be drawn with a default symbol.
26+
* \note Added in version 2.16
27+
*/
28+
29+
class CORE_EXPORT QgsNullSymbolRenderer : public QgsFeatureRendererV2
30+
{
31+
public:
32+
33+
QgsNullSymbolRenderer();
34+
35+
virtual ~QgsNullSymbolRenderer();
36+
37+
virtual QgsSymbolV2* symbolForFeature( QgsFeature& feature, QgsRenderContext& context ) override;
38+
virtual QgsSymbolV2* originalSymbolForFeature( QgsFeature& feature, QgsRenderContext& context ) override;
39+
40+
virtual bool renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool selected = false, bool drawVertexMarker = false ) override;
41+
virtual void startRender( QgsRenderContext& context, const QgsFields& fields ) override;
42+
virtual void stopRender( QgsRenderContext& context ) override;
43+
virtual bool willRenderFeature( QgsFeature& feat, QgsRenderContext& context ) override;
44+
45+
virtual QList<QString> usedAttributes() override;
46+
virtual QString dump() const override;
47+
virtual QgsFeatureRendererV2* clone() const override;
48+
virtual QgsSymbolV2List symbols( QgsRenderContext& context ) override;
49+
50+
/** Creates a null renderer from XML element.
51+
* @param element DOM element
52+
* @returns new null symbol renderer
53+
*/
54+
static QgsFeatureRendererV2* create( QDomElement& element );
55+
56+
virtual QDomElement save( QDomDocument& doc ) override;
57+
58+
/** Creates a QgsNullSymbolRenderer from an existing renderer.
59+
* @param renderer renderer to convert from
60+
* @returns a new renderer if the conversion was possible, otherwise nullptr.
61+
*/
62+
static QgsNullSymbolRenderer* convertFromRenderer( const QgsFeatureRendererV2 *renderer );
63+
64+
private:
65+
66+
//! Symbol to use for rendering selected features
67+
QScopedPointer<QgsSymbolV2> mSymbol;
68+
69+
};
70+
71+
#endif // QGSNULLSYMBOLRENDERER_H

‎src/core/symbology-ng/qgsrendererv2registry.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "qgsinvertedpolygonrenderer.h"
2424
#include "qgsheatmaprenderer.h"
2525
#include "qgs25drenderer.h"
26+
#include "qgsnullsymbolrenderer.h"
2627

2728
QgsRendererV2Registry::QgsRendererV2Registry()
2829
{
@@ -61,6 +62,10 @@ QgsRendererV2Registry::QgsRendererV2Registry()
6162
addRenderer( new QgsRendererV2Metadata( "25dRenderer",
6263
QObject::tr( "2.5 D" ),
6364
Qgs25DRenderer::create ) );
65+
66+
addRenderer( new QgsRendererV2Metadata( "nullSymbol",
67+
QObject::tr( "No Symbols" ),
68+
QgsNullSymbolRenderer::create ) );
6469
}
6570

6671
QgsRendererV2Registry::~QgsRendererV2Registry()

‎src/gui/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ SET(QGIS_GUI_SRCS
2222
symbology-ng/qgsheatmaprendererwidget.cpp
2323
symbology-ng/qgsinvertedpolygonrendererwidget.cpp
2424
symbology-ng/qgslayerpropertieswidget.cpp
25+
symbology-ng/qgsnullsymbolrendererwidget.cpp
2526
symbology-ng/qgspenstylecombobox.cpp
2627
symbology-ng/qgspointdisplacementrendererwidget.cpp
2728
symbology-ng/qgsrendererv2propertiesdialog.cpp
@@ -427,6 +428,7 @@ SET(QGIS_GUI_MOC_HDRS
427428
symbology-ng/qgsheatmaprendererwidget.h
428429
symbology-ng/qgsinvertedpolygonrendererwidget.h
429430
symbology-ng/qgslayerpropertieswidget.h
431+
symbology-ng/qgsnullsymbolrendererwidget.h
430432
symbology-ng/qgspenstylecombobox.h
431433
symbology-ng/qgspointdisplacementrendererwidget.h
432434
symbology-ng/qgsrendererv2propertiesdialog.h
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/***************************************************************************
2+
qgsnullsymbolrendererwidget.cpp
3+
---------------------
4+
begin : November 2014
5+
copyright : (C) 2014 by Nyall Dawson
6+
email : nyall dot dawson at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
#include "qgsnullsymbolrendererwidget.h"
16+
17+
#include "qgsnullsymbolrenderer.h"
18+
#include "qgssymbolv2.h"
19+
#include <QLayout>
20+
#include <QLabel>
21+
22+
QgsRendererV2Widget* QgsNullSymbolRendererWidget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
23+
{
24+
return new QgsNullSymbolRendererWidget( layer, style, renderer );
25+
}
26+
27+
QgsNullSymbolRendererWidget::QgsNullSymbolRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
28+
: QgsRendererV2Widget( layer, style )
29+
{
30+
if ( renderer )
31+
{
32+
mRenderer = QgsNullSymbolRenderer::convertFromRenderer( renderer );
33+
}
34+
if ( !mRenderer )
35+
{
36+
mRenderer = new QgsNullSymbolRenderer();
37+
}
38+
39+
QGridLayout* layout = new QGridLayout( this );
40+
QLabel* label = new QLabel( tr( "No symbols will be rendered for features in this layer." ) );
41+
layout->addWidget( label );
42+
}
43+
44+
QgsNullSymbolRendererWidget::~QgsNullSymbolRendererWidget()
45+
{
46+
delete mRenderer;
47+
}
48+
49+
QgsFeatureRendererV2* QgsNullSymbolRendererWidget::renderer()
50+
{
51+
return mRenderer;
52+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/***************************************************************************
2+
qgsnullsymbolrendererwidget.h
3+
---------------------
4+
begin : November 2014
5+
copyright : (C) 2014 by Nyall Dawson
6+
email : nyall dot dawson at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
#ifndef QGSNULLSYMBOLRENDERERWIDGET_H
16+
#define QGSNULLSYMBOLRENDERERWIDGET_H
17+
18+
#include "qgsrendererv2widget.h"
19+
20+
class QgsNullSymbolRenderer;
21+
class QgsSymbolV2SelectorDialog;
22+
23+
class QMenu;
24+
25+
/** \ingroup gui
26+
* \class QgsNullSymbolRendererWidget
27+
* \brief Blank widget for customising QgsNullSymbolRenderer.
28+
* \note Added in version 2.16
29+
*/
30+
31+
class GUI_EXPORT QgsNullSymbolRendererWidget : public QgsRendererV2Widget
32+
{
33+
Q_OBJECT
34+
35+
public:
36+
37+
//! Creates a new QgsNullSymbolRendererWidget object
38+
static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
39+
40+
//! Constructor for QgsNullSymbolRendererWidget
41+
QgsNullSymbolRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
42+
~QgsNullSymbolRendererWidget();
43+
44+
//! Returns a pointer to the configured renderer
45+
virtual QgsFeatureRendererV2* renderer();
46+
47+
protected:
48+
49+
//! Renderer being configured by the widget
50+
QgsNullSymbolRenderer* mRenderer;
51+
52+
};
53+
54+
55+
#endif // QGSNULLSYMBOLRENDERERWIDGET_H

‎src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "qgsinvertedpolygonrendererwidget.h"
2727
#include "qgsheatmaprendererwidget.h"
2828
#include "qgs25drendererwidget.h"
29+
#include "qgsnullsymbolrendererwidget.h"
2930

3031
#include "qgsorderbydialog.h"
3132
#include "qgsapplication.h"
@@ -73,6 +74,7 @@ static void _initRendererWidgetFunctions()
7374
_initRenderer( "invertedPolygonRenderer", QgsInvertedPolygonRendererWidget::create, "rendererInvertedSymbol.svg" );
7475
_initRenderer( "heatmapRenderer", QgsHeatmapRendererWidget::create, "rendererHeatmapSymbol.svg" );
7576
_initRenderer( "25dRenderer", Qgs25DRendererWidget::create, "renderer25dSymbol.svg" );
77+
_initRenderer( "nullSymbol", QgsNullSymbolRendererWidget::create, "rendererNullSymbol.svg" );
7678
initialized = true;
7779
}
7880

‎tests/src/python/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ ADD_PYTHON_TEST(PyQgsGraduatedSymbolRendererV2 test_qgsgraduatedsymbolrendererv2
4444
ADD_PYTHON_TEST(PyQgsMapUnitScale test_qgsmapunitscale.py)
4545
ADD_PYTHON_TEST(PyQgsMemoryProvider test_provider_memory.py)
4646
ADD_PYTHON_TEST(PyQgsNetworkContentFetcher test_qgsnetworkcontentfetcher.py)
47+
ADD_PYTHON_TEST(PyQgsNullSymbolRenderer test_qgsnullsymbolrenderer.py)
4748
ADD_PYTHON_TEST(PyQgsPalLabelingBase test_qgspallabeling_base.py)
4849
ADD_PYTHON_TEST(PyQgsPalLabelingCanvas test_qgspallabeling_canvas.py)
4950
ADD_PYTHON_TEST(PyQgsPalLabelingComposer test_qgspallabeling_composer.py)
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
test_qgsnullsymbolrenderer.py
6+
-----------------------------
7+
Date : April 2016
8+
Copyright : (C) 2016 by Nyall Dawson
9+
Email : nyall dot dawson at gmail dot com
10+
***************************************************************************
11+
* *
12+
* This program is free software; you can redistribute it and/or modify *
13+
* it under the terms of the GNU General Public License as published by *
14+
* the Free Software Foundation; either version 2 of the License, or *
15+
* (at your option) any later version. *
16+
* *
17+
***************************************************************************
18+
"""
19+
20+
__author__ = 'Nyall Dawson'
21+
__date__ = 'April 2016'
22+
__copyright__ = '(C) 2016, Nyall Dawson'
23+
# This will get replaced with a git SHA1 when you do a git archive
24+
__revision__ = '$Format:%H$'
25+
26+
import qgis # NOQA
27+
28+
import os
29+
30+
from PyQt.QtCore import QSize
31+
32+
from qgis.core import (QgsVectorLayer,
33+
QgsMapLayerRegistry,
34+
QgsRectangle,
35+
QgsMultiRenderChecker,
36+
QgsNullSymbolRenderer,
37+
QgsFeatureRequest
38+
)
39+
from qgis.testing import start_app, unittest
40+
from qgis.testing.mocked import get_iface
41+
from utilities import unitTestDataPath
42+
43+
# Convenience instances in case you may need them
44+
# not used in this test
45+
start_app()
46+
TEST_DATA_DIR = unitTestDataPath()
47+
48+
49+
class TestQgsNullSymbolRenderer(unittest.TestCase):
50+
51+
def setUp(self):
52+
self.iface = get_iface()
53+
myShpFile = os.path.join(TEST_DATA_DIR, 'polys.shp')
54+
self.layer = QgsVectorLayer(myShpFile, 'Polys', 'ogr')
55+
QgsMapLayerRegistry.instance().addMapLayer(self.layer)
56+
57+
self.renderer = QgsNullSymbolRenderer()
58+
self.layer.setRendererV2(self.renderer)
59+
60+
rendered_layers = [self.layer.id()]
61+
self.mapsettings = self.iface.mapCanvas().mapSettings()
62+
self.mapsettings.setOutputSize(QSize(400, 400))
63+
self.mapsettings.setOutputDpi(96)
64+
self.mapsettings.setExtent(QgsRectangle(-163, 22, -70, 52))
65+
self.mapsettings.setLayers(rendered_layers)
66+
67+
def tearDown(self):
68+
QgsMapLayerRegistry.instance().removeAllMapLayers()
69+
70+
def testRender(self):
71+
# test no features are rendered
72+
renderchecker = QgsMultiRenderChecker()
73+
renderchecker.setMapSettings(self.mapsettings)
74+
renderchecker.setControlPathPrefix('null_renderer')
75+
renderchecker.setControlName('expected_nullrenderer_render')
76+
result = renderchecker.runTest('nullrenderer_render')
77+
assert result
78+
79+
def testSelected(self):
80+
# select a feature and render
81+
self.layer.select([1, 2, 3])
82+
renderchecker = QgsMultiRenderChecker()
83+
renderchecker.setMapSettings(self.mapsettings)
84+
renderchecker.setControlPathPrefix('null_renderer')
85+
renderchecker.setControlName('expected_nullrenderer_selected')
86+
result = renderchecker.runTest('nullrenderer_selected')
87+
assert result
88+
89+
90+
if __name__ == '__main__':
91+
unittest.main()

Error rendering embedded code

Invalid image source.

Error rendering embedded code

Invalid image source.

0 commit comments

Comments
 (0)
Please sign in to comment.