Skip to content

Commit 7cd517c

Browse files
authored
[FEATURE] Legend for markers with data-defined size
(Merge pull request #4752 from wonder-sk/legend-data-defined-size)
2 parents df07772 + 863b7d2 commit 7cd517c

52 files changed

Lines changed: 2176 additions & 272 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎doc/api_break.dox‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,7 @@ QgsDiagramRenderer {#qgis_api_break_3_0_QgsDiagramRenderer}
987987
- renderDiagram() now takes an optional data defined overrides collection argument.
988988
- readXml(), _readXml(), writeXml(), _writeXml() do not take QgsVectorLayer as an argument anymore.
989989
- readXml(), _readXml(), writeXml(), _writeXml() require a new argument: a reference to QgsReadWriteContext
990-
990+
- sizeLegend(), setSizeLegend(), sizeLegendSymbol() and setSizeLegendSymbol() have been replaced by dataDefinedSizeLegend() and setDataDefinedSizeLegend() methods in QgsLinearlyInterpolatedDiagramRenderer.
991991

992992

993993
QgsDiagramLayerSettings {#qgis_api_break_3_0_QgsDiagramLayerSettings}
@@ -2110,6 +2110,7 @@ QgsSingleSymbolRendererWidget {#qgis_api_break_3_0_QgsSingleSymbolRendere
21102110

21112111
- sizeScaleFieldChanged() and scaleMethodChanged() were removed. These settings are no longer exposed in the widget's GUI.
21122112
- The Mode enum was removed.
2113+
- changeSingleSymbol() and showSymbolLevels() slots were made private.
21132114

21142115
QgsSlider {#qgis_api_break_3_0_QgsSlider}
21152116
---------

‎python/core/core.sip‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
%Include qgscoordinatetransform.sip
3737
%Include qgscredentials.sip
3838
%Include qgscrscache.sip
39+
%Include qgsdatadefinedsizelegend.sip
3940
%Include qgsdataitem.sip
4041
%Include qgsdataitemprovider.sip
4142
%Include qgsdataitemproviderregistry.sip

‎python/core/layertree/qgslayertreemodellegendnode.sip‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ Emitted on internal data change so the layer tree model can forward the signal t
151151
Construct the node with pointer to its parent layer node
152152
%End
153153

154+
QgsRenderContext *createTemporaryRenderContext() const /Factory/;
155+
%Docstring
156+
Returns a temporary context or null if legendMapViewData are not valid
157+
:rtype: QgsRenderContext
158+
%End
159+
154160
protected:
155161
};
156162

@@ -371,6 +377,30 @@ class QgsWmsLegendNode : QgsLayerTreeModelLegendNode
371377
372378
};
373379
380+
381+
class QgsDataDefinedSizeLegendNode : QgsLayerTreeModelLegendNode
382+
{
383+
%Docstring
384+
Produces legend node with a marker symbol
385+
.. versionadded:: 3.0
386+
%End
387+
388+
%TypeHeaderCode
389+
#include "qgslayertreemodellegendnode.h"
390+
%End
391+
public:
392+
QgsDataDefinedSizeLegendNode( QgsLayerTreeLayer *nodeLayer, const QgsDataDefinedSizeLegend &settings, QObject *parent /TransferThis/ = 0 );
393+
%Docstring
394+
Construct the node using QgsDataDefinedSizeLegend as definition of the node's appearance
395+
%End
396+
397+
virtual QVariant data( int role ) const;
398+
399+
virtual ItemMetrics draw( const QgsLegendSettings &settings, ItemContext *ctx );
400+
401+
402+
};
403+
374404
/************************************************************************
375405
* This file has been generated automatically from *
376406
* *
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
/************************************************************************
2+
* This file has been generated automatically from *
3+
* *
4+
* src/core/qgsdatadefinedsizelegend.h *
5+
* *
6+
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
7+
************************************************************************/
8+
9+
10+
11+
12+
13+
14+
class QgsDataDefinedSizeLegend
15+
{
16+
%Docstring
17+
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
18+
For example: the list of classes (size values), whether the classes should appear in separate
19+
legend nodes or whether to collapse them into one legend node.
20+
21+
.. versionadded:: 3.0
22+
%End
23+
24+
%TypeHeaderCode
25+
#include "qgsdatadefinedsizelegend.h"
26+
%End
27+
public:
28+
QgsDataDefinedSizeLegend();
29+
30+
QgsDataDefinedSizeLegend( const QgsDataDefinedSizeLegend &other );
31+
%Docstring
32+
Copy constructor
33+
%End
34+
35+
enum LegendType
36+
{
37+
LegendSeparated,
38+
LegendCollapsed,
39+
};
40+
41+
enum VerticalAlignment
42+
{
43+
AlignCenter,
44+
AlignBottom,
45+
};
46+
47+
struct SizeClass
48+
{
49+
SizeClass( double size, const QString &label );
50+
51+
double size; //!< Marker size in units used by the symbol (usually millimeters)
52+
QString label; //!< Label to be shown with the particular symbol size
53+
};
54+
55+
void setLegendType( LegendType type );
56+
%Docstring
57+
Sets how the legend should be rendered
58+
%End
59+
LegendType legendType() const;
60+
%Docstring
61+
Returns how the legend should be rendered
62+
:rtype: LegendType
63+
%End
64+
65+
void setSymbol( QgsMarkerSymbol *symbol /Transfer/ );
66+
%Docstring
67+
Sets marker symbol that will be used to draw markers in legend
68+
%End
69+
QgsMarkerSymbol *symbol() const;
70+
%Docstring
71+
Returns marker symbol that will be used to draw markers in legend
72+
:rtype: QgsMarkerSymbol
73+
%End
74+
75+
void setClasses( const QList<QgsDataDefinedSizeLegend::SizeClass> &classes );
76+
%Docstring
77+
Sets list of classes: each class is a pair of symbol size (in units used by the symbol) and label
78+
%End
79+
QList<QgsDataDefinedSizeLegend::SizeClass> classes() const;
80+
%Docstring
81+
Returns list of classes: each class is a pair of symbol size (in units used by the symbol) and label
82+
:rtype: list of QgsDataDefinedSizeLegend.SizeClass
83+
%End
84+
85+
void setTitle( const QString &title );
86+
%Docstring
87+
Sets title label for data-defined size legend
88+
%End
89+
QString title() const;
90+
%Docstring
91+
Returns title label for data-defined size legend
92+
:rtype: str
93+
%End
94+
95+
void setVerticalAlignment( VerticalAlignment vAlign );
96+
%Docstring
97+
Sets vertical alignment of symbols - only valid for collapsed legend
98+
%End
99+
VerticalAlignment verticalAlignment() const;
100+
%Docstring
101+
Returns vertical alignment of symbols - only valid for collapsed legend
102+
:rtype: VerticalAlignment
103+
%End
104+
105+
void setFont( const QFont &font );
106+
%Docstring
107+
Sets font used for rendering of labels - only valid for collapsed legend
108+
%End
109+
QFont font() const;
110+
%Docstring
111+
Returns font used for rendering of labels - only valid for collapsed legend
112+
:rtype: QFont
113+
%End
114+
115+
void setTextColor( const QColor &color );
116+
%Docstring
117+
Sets text color for rendering of labels - only valid for collapsed legend
118+
%End
119+
QColor textColor() const;
120+
%Docstring
121+
Returns text color for rendering of labels - only valid for collapsed legend
122+
:rtype: QColor
123+
%End
124+
125+
void setTextAlignment( Qt::AlignmentFlag flag );
126+
%Docstring
127+
Sets horizontal text alignment for rendering of labels - only valid for collapsed legend
128+
%End
129+
Qt::AlignmentFlag textAlignment() const;
130+
%Docstring
131+
Returns horizontal text alignment for rendering of labels - only valid for collapsed legend
132+
:rtype: Qt.AlignmentFlag
133+
%End
134+
135+
136+
void updateFromSymbolAndProperty( const QgsMarkerSymbol *symbol, const QgsProperty &ddSize );
137+
%Docstring
138+
Updates the list of classes, source symbol and title label from given symbol and property
139+
%End
140+
141+
QgsLegendSymbolList legendSymbolList() const;
142+
%Docstring
143+
Generates legend symbol items according to the configuration
144+
:rtype: QgsLegendSymbolList
145+
%End
146+
147+
void drawCollapsedLegend( QgsRenderContext &context, QSize *outputSize /Out/ = 0, int *labelXOffset /Out/ = 0 ) const;
148+
%Docstring
149+
Does nothing if legend is not configured as collapsed.
150+
%End
151+
152+
QImage collapsedLegendImage( QgsRenderContext &context, const QColor &backgroundColor = Qt::transparent, double paddingMM = 1 ) const;
153+
%Docstring
154+
Returns output image that would be shown in the legend. Returns invalid image if legend is not configured as collapsed.
155+
:rtype: QImage
156+
%End
157+
158+
static QgsDataDefinedSizeLegend *readXml( const QDomElement &elem, const QgsReadWriteContext &context ) /Factory/;
159+
%Docstring
160+
Creates instance from given element and returns it (caller takes ownership). Returns null on error.
161+
:rtype: QgsDataDefinedSizeLegend
162+
%End
163+
164+
void writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const;
165+
%Docstring
166+
Writes configuration to the given XML element.
167+
%End
168+
169+
};
170+
171+
/************************************************************************
172+
* This file has been generated automatically from *
173+
* *
174+
* src/core/qgsdatadefinedsizelegend.h *
175+
* *
176+
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
177+
************************************************************************/

‎python/core/qgsdiagramrenderer.sip‎

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,15 @@ class QgsDiagramRenderer
450450
451451
%TypeHeaderCode
452452
#include "qgsdiagramrenderer.h"
453+
%End
454+
455+
%ConvertToSubClassCode
456+
if ( sipCpp->rendererName() == QStringLiteral( "SingleCategory" ) )
457+
sipType = sipType_QgsSingleCategoryDiagramRenderer;
458+
else if ( sipCpp->rendererName() == QStringLiteral( "LinearlyInterpolated" ) )
459+
sipType = sipType_QgsLinearlyInterpolatedDiagramRenderer;
460+
else
461+
sipType = NULL;
453462
%End
454463
public:
455464
@@ -545,44 +554,6 @@ Returns list with all diagram settings in the renderer
545554
.. versionadded:: 2.16
546555
.. seealso:: attributeLegend()
547556
.. seealso:: setSizeLegend()
548-
%End
549-
550-
bool sizeLegend() const;
551-
%Docstring
552-
Returns true if renderer will show legend items for diagram sizes.
553-
.. versionadded:: 2.16
554-
.. seealso:: setSizeLegend()
555-
.. seealso:: attributeLegend()
556-
.. seealso:: sizeLegendSymbol()
557-
:rtype: bool
558-
%End
559-
560-
void setSizeLegend( bool enabled );
561-
%Docstring
562-
Sets whether the renderer will show legend items for diagram sizes.
563-
\param enabled set to true to show diagram size legend
564-
.. versionadded:: 2.16
565-
.. seealso:: sizeLegend()
566-
.. seealso:: setAttributeLegend()
567-
.. seealso:: setSizeLegendSymbol()
568-
%End
569-
570-
QgsMarkerSymbol *sizeLegendSymbol() const;
571-
%Docstring
572-
Returns the marker symbol used for rendering the diagram size legend.
573-
.. versionadded:: 2.16
574-
.. seealso:: setSizeLegendSymbol()
575-
.. seealso:: sizeLegend()
576-
:rtype: QgsMarkerSymbol
577-
%End
578-
579-
void setSizeLegendSymbol( QgsMarkerSymbol *symbol /Transfer/ );
580-
%Docstring
581-
Sets the marker symbol used for rendering the diagram size legend.
582-
\param symbol marker symbol, ownership is transferred to the renderer.
583-
.. versionadded:: 2.16
584-
.. seealso:: sizeLegendSymbol()
585-
.. seealso:: setSizeLegend()
586557
%End
587558
588559
protected:
@@ -628,8 +599,6 @@ Returns the paint device dpi (or -1 in case of error
628599
%End
629600
630601
631-
632-
633602
};
634603
635604
class QgsSingleCategoryDiagramRenderer : QgsDiagramRenderer
@@ -760,13 +729,31 @@ Returns list with all diagram settings in the renderer
760729
virtual QList< QgsLayerTreeModelLegendNode * > legendItems( QgsLayerTreeLayer *nodeLayer ) const /Factory/;
761730
762731
732+
void setDataDefinedSizeLegend( QgsDataDefinedSizeLegend *settings /Transfer/ );
733+
%Docstring
734+
Configures appearance of legend. Takes ownership of the passed settings objects.
735+
.. versionadded:: 3.0
736+
%End
737+
738+
QgsDataDefinedSizeLegend *dataDefinedSizeLegend() const;
739+
%Docstring
740+
Returns configuration of appearance of legend. Will return null if no configuration has been set.
741+
.. versionadded:: 3.0
742+
:rtype: QgsDataDefinedSizeLegend
743+
%End
744+
763745
protected:
764746
virtual bool diagramSettings( const QgsFeature &feature, const QgsRenderContext &c, QgsDiagramSettings &s ) const;
765747
766748
767749
virtual QSizeF diagramSize( const QgsFeature &, const QgsRenderContext &c ) const;
768750
769751
752+
QgsLinearlyInterpolatedDiagramRenderer( const QgsLinearlyInterpolatedDiagramRenderer &other );
753+
%Docstring
754+
Copy constructor
755+
%End
756+
770757
};
771758
772759
/************************************************************************

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class QgsCategorizedSymbolRenderer : QgsFeatureRenderer
7878
public:
7979

8080
QgsCategorizedSymbolRenderer( const QString &attrName = QString(), const QgsCategoryList &categories = QgsCategoryList() );
81+
~QgsCategorizedSymbolRenderer();
8182

8283
virtual QgsSymbol *symbolForFeature( QgsFeature &feature, QgsRenderContext &context );
8384
virtual QgsSymbol *originalSymbolForFeature( QgsFeature &feature, QgsRenderContext &context );
@@ -220,10 +221,31 @@ create renderer from XML element
220221
:rtype: QgsCategorizedSymbolRenderer
221222
%End
222223

224+
void setDataDefinedSizeLegend( QgsDataDefinedSizeLegend *settings /Transfer/ );
225+
%Docstring
226+
Configures appearance of legend when renderer is configured to use data-defined size for marker symbols.
227+
This allows to configure for what values (symbol sizes) should be shown in the legend, whether to display
228+
different symbol sizes collapsed in one legend node or separated across multiple legend nodes etc.
229+
230+
When renderer does not use data-defined size or does not use marker symbols, these settings will be ignored.
231+
Takes ownership of the passed settings objects. Null pointer is a valid input that disables data-defined
232+
size legend.
233+
.. versionadded:: 3.0
234+
%End
235+
236+
QgsDataDefinedSizeLegend *dataDefinedSizeLegend() const;
237+
%Docstring
238+
Returns configuration of appearance of legend when using data-defined size for marker symbols.
239+
Will return null if the functionality is disabled.
240+
.. versionadded:: 3.0
241+
:rtype: QgsDataDefinedSizeLegend
242+
%End
243+
223244
protected:
224245

225246

226247

248+
227249
void rebuildHash();
228250
%Docstring
229251
hashtable for faster access to symbols

0 commit comments

Comments
 (0)