Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgslayertreemodellegendnode.h
3 : : --------------------------------------
4 : : Date : August 2014
5 : : Copyright : (C) 2014 by Martin Dobias
6 : : Email : wonder dot sk at gmail dot com
7 : :
8 : : QgsWMSLegendNode : Sandro Santilli < strk at keybit dot net >
9 : :
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 : : #ifndef QGSLAYERTREEMODELLEGENDNODE_H
20 : : #define QGSLAYERTREEMODELLEGENDNODE_H
21 : :
22 : : #include <QIcon>
23 : : #include <QObject>
24 : :
25 : : #include "qgis_core.h"
26 : : #include "qgis_sip.h"
27 : :
28 : : #include "qgsexpressioncontext.h"
29 : : #include "qgslegendpatchshape.h"
30 : :
31 : : class QgsLayerTreeLayer;
32 : : class QgsLayerTreeModel;
33 : : class QgsLegendSettings;
34 : : class QgsMapSettings;
35 : : class QgsSymbol;
36 : : class QgsRenderContext;
37 : :
38 : : /**
39 : : * \ingroup core
40 : : * \brief The QgsLegendRendererItem class is abstract interface for legend items
41 : : * returned from QgsMapLayerLegend implementation.
42 : : *
43 : : * The objects are used in QgsLayerTreeModel. Custom implementations may offer additional interactivity
44 : : * and customized look.
45 : : *
46 : : * \since QGIS 2.6
47 : : */
48 : 0 : class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
49 : : {
50 : : #ifdef SIP_RUN
51 : : #include "qgscolorramplegendnode.h"
52 : : #endif
53 : :
54 : : #ifdef SIP_RUN
55 : : SIP_CONVERT_TO_SUBCLASS_CODE
56 : : if ( qobject_cast<QgsSymbolLegendNode *> ( sipCpp ) )
57 : : sipType = sipType_QgsSymbolLegendNode;
58 : : else if ( qobject_cast<QgsDataDefinedSizeLegendNode *> ( sipCpp ) )
59 : : sipType = sipType_QgsDataDefinedSizeLegendNode;
60 : : else if ( qobject_cast<QgsImageLegendNode *> ( sipCpp ) )
61 : : sipType = sipType_QgsImageLegendNode;
62 : : else if ( qobject_cast<QgsRasterSymbolLegendNode *> ( sipCpp ) )
63 : : sipType = sipType_QgsRasterSymbolLegendNode;
64 : : else if ( qobject_cast<QgsSimpleLegendNode *> ( sipCpp ) )
65 : : sipType = sipType_QgsSimpleLegendNode;
66 : : else if ( qobject_cast<QgsWmsLegendNode *> ( sipCpp ) )
67 : : sipType = sipType_QgsWmsLegendNode;
68 : : else if ( qobject_cast<QgsColorRampLegendNode *> ( sipCpp ) )
69 : : sipType = sipType_QgsColorRampLegendNode;
70 : : else
71 : : sipType = 0;
72 : : SIP_END
73 : : #endif
74 : :
75 : : Q_OBJECT
76 : :
77 : : public:
78 : :
79 : : //! Legend node data roles
80 : : enum LegendNodeRoles
81 : : {
82 : : RuleKeyRole = Qt::UserRole, //!< Rule key of the node (QString)
83 : : ParentRuleKeyRole, //!< Rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2.8
84 : : NodeTypeRole, //!< Type of node. Added in 3.16
85 : : };
86 : :
87 : : //! Types of legend nodes
88 : : enum NodeTypes
89 : : {
90 : : SimpleLegend, //!< Simple label with icon legend node type
91 : : SymbolLegend, //!< Vector symbol legend node type
92 : : RasterSymbolLegend, //!< Raster symbol legend node type
93 : : ImageLegend, //!< Raster image legend node type
94 : : WmsLegend, //!< WMS legend node type
95 : : DataDefinedSizeLegend, //!< Marker symbol legend node type
96 : : EmbeddedWidget, //!< Embedded widget placeholder node type
97 : : ColorRampLegend, //!< Color ramp legend (since QGIS 3.18)
98 : : };
99 : :
100 : : //! Returns pointer to the parent layer node
101 : 0 : QgsLayerTreeLayer *layerNode() const { return mLayerNode; }
102 : :
103 : : //! Returns pointer to model owning this legend node
104 : : QgsLayerTreeModel *model() const;
105 : :
106 : : //! Returns item flags associated with the item. Default implementation returns Qt::ItemIsEnabled.
107 : : virtual Qt::ItemFlags flags() const;
108 : :
109 : : //! Returns data associated with the item. Must be implemented in derived class.
110 : : virtual QVariant data( int role ) const = 0;
111 : :
112 : : //! Sets some data associated with the item. Default implementation does nothing and returns FALSE.
113 : : virtual bool setData( const QVariant &value, int role );
114 : :
115 : : virtual bool isEmbeddedInParent() const { return mEmbeddedInParent; }
116 : 0 : virtual void setEmbeddedInParent( bool embedded ) { mEmbeddedInParent = embedded; }
117 : :
118 : : virtual QString userLabel() const { return mUserLabel; }
119 : : virtual void setUserLabel( const QString &userLabel ) { mUserLabel = userLabel; }
120 : :
121 : : /**
122 : : * Returns the user (overridden) size for the legend node.
123 : : *
124 : : * If either the width or height are non-zero, they will be used when rendering the legend node instead of the default
125 : : * symbol width or height from QgsLegendSettings.
126 : : *
127 : : * \see setUserPatchSize()
128 : : * \since QGIS 3.14
129 : : */
130 : : virtual QSizeF userPatchSize() const;
131 : :
132 : : /**
133 : : * Sets the user (overridden) \a size for the legend node.
134 : : *
135 : : * If either the width or height are non-zero, they will be used when rendering the legend node instead of the default
136 : : * symbol width or height from QgsLegendSettings.
137 : : *
138 : : * \see userPatchSize()
139 : : * \since QGIS 3.14
140 : : */
141 : : virtual void setUserPatchSize( QSizeF size );
142 : :
143 : : /**
144 : : * Sets whether a forced column break should occur before the node.
145 : : *
146 : : * \see columnBreak()
147 : : * \since QGIS 3.14
148 : : */
149 : : virtual void setColumnBreak( bool breakBeforeNode ) { mColumnBreakBeforeNode = breakBeforeNode; }
150 : :
151 : : /**
152 : : * Returns whether a forced column break should occur before the node.
153 : : *
154 : : * \see setColumnBreak()
155 : : * \since QGIS 3.14
156 : : */
157 : : virtual bool columnBreak() const { return mColumnBreakBeforeNode; }
158 : :
159 : : virtual bool isScaleOK( double scale ) const { Q_UNUSED( scale ) return true; }
160 : :
161 : : /**
162 : : * Notification from model that information from associated map view has changed.
163 : : * Default implementation does nothing.
164 : : */
165 : : virtual void invalidateMapBasedData() {}
166 : :
167 : 0 : struct ItemContext
168 : : {
169 : : Q_NOWARN_DEPRECATED_PUSH //because of deprecated members
170 : 0 : ItemContext() = default;
171 : : Q_NOWARN_DEPRECATED_POP
172 : :
173 : : //! Render context, if available
174 : 0 : QgsRenderContext *context = nullptr;
175 : : //! Painter
176 : 0 : QPainter *painter = nullptr;
177 : :
178 : : /**
179 : : * Top-left corner of the legend item.
180 : : * \deprecated Use top, columnLeft, columnRight instead.
181 : : */
182 : : Q_DECL_DEPRECATED QPointF point;
183 : :
184 : : /**
185 : : * Offset from the left side where label should start.
186 : : * \deprecated use columnLeft, columnRight instead.
187 : : */
188 : 0 : Q_DECL_DEPRECATED double labelXOffset = 0.0;
189 : :
190 : : /**
191 : : * Top y-position of legend item.
192 : : * \since QGIS 3.10
193 : : */
194 : 0 : double top = 0.0;
195 : :
196 : : /**
197 : : * Left side of current legend column. This should be used when determining
198 : : * where to render legend item content, correctly respecting the symbol and text
199 : : * alignment from the legend settings.
200 : : * \since QGIS 3.10
201 : : */
202 : 0 : double columnLeft = 0.0;
203 : :
204 : : /**
205 : : * Right side of current legend column. This should be used when determining
206 : : * where to render legend item content, correctly respecting the symbol and text
207 : : * alignment from the legend settings.
208 : : * \since QGIS 3.10
209 : : */
210 : 0 : double columnRight = 0.0;
211 : :
212 : : /**
213 : : * Largest symbol width, considering all other sibling legend components associated with
214 : : * the current component.
215 : : * \since QGIS 3.10
216 : : */
217 : 0 : double maxSiblingSymbolWidth = 0.0;
218 : :
219 : : /**
220 : : * The patch shape to render for the node.
221 : : *
222 : : * \since QGIS 3.14
223 : : */
224 : : QgsLegendPatchShape patchShape;
225 : :
226 : : /**
227 : : * Symbol patch size to render for the node.
228 : : *
229 : : * If either the width or height are zero, then the default width/height from QgsLegendSettings::symbolSize() should be used instead.
230 : : *
231 : : * \since QGIS 3.14
232 : : */
233 : : QSizeF patchSize;
234 : : };
235 : :
236 : 0 : struct ItemMetrics
237 : : {
238 : : QSizeF symbolSize;
239 : : QSizeF labelSize;
240 : : };
241 : :
242 : : /**
243 : : * Entry point called from QgsLegendRenderer to do the rendering.
244 : : * Default implementation calls drawSymbol() and drawSymbolText() methods.
245 : : *
246 : : * If ctx is NULLPTR, this is just first stage when preparing layout - without actual rendering.
247 : : */
248 : : virtual ItemMetrics draw( const QgsLegendSettings &settings, ItemContext *ctx );
249 : :
250 : : /**
251 : : * Entry point called from QgsLegendRenderer to do the rendering in a
252 : : * JSON object.
253 : : * \param settings Legend layout configuration
254 : : * \param context Rendering context
255 : : * \since QGIS 3.8
256 : : */
257 : : QJsonObject exportToJson( const QgsLegendSettings &settings, const QgsRenderContext &context );
258 : :
259 : : /**
260 : : * Draws symbol on the left side of the item
261 : : * \param settings Legend layout configuration
262 : : * \param ctx Context for rendering - may be NULLPTR if only doing layout without actual rendering
263 : : * \param itemHeight Minimal height of the legend item - used for correct positioning when rendering
264 : : * \returns Real size of the symbol (may be bigger than "normal" symbol size from settings)
265 : : */
266 : : virtual QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const;
267 : :
268 : : /**
269 : : * Adds a symbol in base64 string within a JSON object with the key "icon".
270 : : * \param settings Legend layout configuration
271 : : * \param context Rendering context
272 : : * \since QGIS 3.8
273 : : */
274 : : virtual QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const;
275 : :
276 : : /**
277 : : * Draws label on the right side of the item
278 : : * \param settings Legend layout configuration
279 : : * \param ctx Context for rendering - may be NULLPTR if only doing layout without actual rendering
280 : : * \param symbolSize Real size of the associated symbol - used for correct positioning when rendering
281 : : * \returns Size of the label (may span multiple lines)
282 : : */
283 : : virtual QSizeF drawSymbolText( const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize ) const;
284 : :
285 : : public slots:
286 : :
287 : : /**
288 : : * Checks all checkable items belonging to the same layer as this node.
289 : : * \see uncheckAllItems()
290 : : * \see toggleAllItems()
291 : : * \since QGIS 3.18 (previously was available in QgsSymbolLegendNode subclass only)
292 : : */
293 : : void checkAllItems();
294 : :
295 : : /**
296 : : * Unchecks all checkable items belonging to the same layer as this node.
297 : : * \see checkAllItems()
298 : : * \see toggleAllItems()
299 : : * \since QGIS 3.18 (previously was available in QgsSymbolLegendNode subclass only)
300 : : */
301 : : void uncheckAllItems();
302 : :
303 : : /**
304 : : * Toggle all checkable items belonging to the same layer as this node.
305 : : * \see checkAllItems()
306 : : * \see uncheckAllItems()
307 : : * \since QGIS 3.18 (previously was available in QgsSymbolLegendNode subclass only)
308 : : */
309 : : void toggleAllItems();
310 : :
311 : : signals:
312 : : //! Emitted on internal data change so the layer tree model can forward the signal to views
313 : : void dataChanged();
314 : :
315 : : /**
316 : : * Emitted when the size of this node changes.
317 : : *
318 : : * \since QGIS 3.16
319 : : */
320 : : void sizeChanged();
321 : :
322 : : protected:
323 : : //! Construct the node with pointer to its parent layer node
324 : : explicit QgsLayerTreeModelLegendNode( QgsLayerTreeLayer *nodeL, QObject *parent SIP_TRANSFERTHIS = nullptr );
325 : :
326 : : //! Returns a temporary context or NULLPTR if legendMapViewData are not valid
327 : : QgsRenderContext *createTemporaryRenderContext() const SIP_FACTORY;
328 : :
329 : : protected:
330 : : QgsLayerTreeLayer *mLayerNode = nullptr;
331 : : bool mEmbeddedInParent;
332 : : QString mUserLabel;
333 : : QgsLegendPatchShape mPatchShape;
334 : : QSizeF mUserSize;
335 : : bool mColumnBreakBeforeNode = false;
336 : :
337 : : private:
338 : :
339 : : /**
340 : : * Sets all items belonging to the same layer as this node to the same check state.
341 : : * \param state check state
342 : : */
343 : : void checkAll( bool state );
344 : : };
345 : 0 : Q_DECLARE_METATYPE( QgsLayerTreeModelLegendNode::NodeTypes )
346 : :
347 : : #include "qgslegendsymbolitem.h"
348 : : #include "qgstextformat.h"
349 : :
350 : : /**
351 : : * \ingroup core
352 : : * \brief Implementation of legend node interface for displaying preview of vector symbols and their labels
353 : : * and allowing interaction with the symbol / renderer.
354 : : *
355 : : * \since QGIS 2.6
356 : : */
357 : : class CORE_EXPORT QgsSymbolLegendNode : public QgsLayerTreeModelLegendNode
358 : : {
359 : 0 : Q_OBJECT
360 : :
361 : : public:
362 : :
363 : : static double MINIMUM_SIZE;
364 : : static double MAXIMUM_SIZE;
365 : :
366 : : /**
367 : : * Constructor for QgsSymbolLegendNode.
368 : : * \param nodeLayer layer node
369 : : * \param item the legend symbol item
370 : : * \param parent attach a parent QObject to the legend node.
371 : : */
372 : : QgsSymbolLegendNode( QgsLayerTreeLayer *nodeLayer, const QgsLegendSymbolItem &item, QObject *parent SIP_TRANSFERTHIS = nullptr );
373 : :
374 : : Qt::ItemFlags flags() const override;
375 : : QVariant data( int role ) const override;
376 : : bool setData( const QVariant &value, int role ) override;
377 : :
378 : : QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
379 : :
380 : : QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
381 : :
382 : : void setEmbeddedInParent( bool embedded ) override;
383 : :
384 : : void setUserLabel( const QString &userLabel ) override { mUserLabel = userLabel; updateLabel(); }
385 : :
386 : : bool isScaleOK( double scale ) const override { return mItem.isScaleOK( scale ); }
387 : :
388 : : void invalidateMapBasedData() override;
389 : :
390 : : /**
391 : : * Set the icon size
392 : : * \since QGIS 2.10
393 : : */
394 : 0 : void setIconSize( QSize sz ) { mIconSize = sz; }
395 : : //! \since QGIS 2.10
396 : 0 : QSize iconSize() const { return mIconSize; }
397 : :
398 : : /**
399 : : * Calculates the minimum icon size to prevent cropping. When evaluating
400 : : * the size for multiple icons it is more efficient to create a single
401 : : * render context in advance and use the variant which accepts a QgsRenderContext
402 : : * argument.
403 : : * \since QGIS 2.10
404 : : */
405 : : QSize minimumIconSize() const;
406 : :
407 : : /**
408 : : * Calculates the minimum icon size to prevent cropping. When evaluating
409 : : * the size for multiple icons it is more efficient to create a single
410 : : * render context in advance and call this method instead of minimumIconSize().
411 : : * \since QGIS 2.18
412 : : */
413 : : QSize minimumIconSize( QgsRenderContext *context ) const;
414 : :
415 : : /**
416 : : * Returns the symbol used by the legend node.
417 : : * \see setSymbol()
418 : : * \since QGIS 2.14
419 : : */
420 : : const QgsSymbol *symbol() const;
421 : :
422 : : /**
423 : : * Sets the \a symbol to be used by the legend node. The symbol change is also propagated
424 : : * to the associated vector layer's renderer.
425 : : * \param symbol new symbol for node. Ownership is transferred.
426 : : * \see symbol()
427 : : * \since QGIS 2.14
428 : : */
429 : : void setSymbol( QgsSymbol *symbol SIP_TRANSFER );
430 : :
431 : : /**
432 : : * Returns label of text to be shown on top of the symbol.
433 : : * \since QGIS 3.2
434 : : */
435 : : QString textOnSymbolLabel() const { return mTextOnSymbolLabel; }
436 : :
437 : : /**
438 : : * Sets label of text to be shown on top of the symbol.
439 : : * \since QGIS 3.2
440 : : */
441 : 0 : void setTextOnSymbolLabel( const QString &label ) { mTextOnSymbolLabel = label; }
442 : :
443 : : /**
444 : : * Returns text format of the label to be shown on top of the symbol.
445 : : * \since QGIS 3.2
446 : : */
447 : : QgsTextFormat textOnSymbolTextFormat() const { return mTextOnSymbolTextFormat; }
448 : :
449 : : /**
450 : : * Sets format of text to be shown on top of the symbol.
451 : : * \since QGIS 3.2
452 : : */
453 : 0 : void setTextOnSymbolTextFormat( const QgsTextFormat &format ) { mTextOnSymbolTextFormat = format; }
454 : :
455 : : /**
456 : : * Label of the symbol, user defined label will be used, otherwise will default to the label made by QGIS.
457 : : * \since QGIS 3.10
458 : : */
459 : : QString symbolLabel() const;
460 : :
461 : : /**
462 : : * Returns the symbol patch shape to use when rendering the legend node symbol.
463 : : *
464 : : * \see setPatchShape()
465 : : * \since QGIS 3.14
466 : : */
467 : : QgsLegendPatchShape patchShape() const;
468 : :
469 : : /**
470 : : * Sets the symbol patch \a shape to use when rendering the legend node symbol.
471 : : *
472 : : * \see patchShape()
473 : : * \since QGIS 3.14
474 : : */
475 : : void setPatchShape( const QgsLegendPatchShape &shape );
476 : :
477 : : /**
478 : : * Returns the node's custom symbol.
479 : : *
480 : : * If a non-NULLPTR value is returned, then this symbol will be used for rendering
481 : : * the legend node instead of the default symbol().
482 : : *
483 : : * \see setCustomSymbol()
484 : : * \since QGIS 3.14
485 : : */
486 : : QgsSymbol *customSymbol() const;
487 : :
488 : : /**
489 : : * Sets the node's custom \a symbol.
490 : : *
491 : : * If a non-NULLPTR value is set, then this symbol will be used for rendering
492 : : * the legend node instead of the default symbol().
493 : : *
494 : : * Ownership of \a symbol is transferred.
495 : : *
496 : : * \see customSymbol()
497 : : * \since QGIS 3.14
498 : : */
499 : : void setCustomSymbol( QgsSymbol *symbol SIP_TRANSFER );
500 : :
501 : : /**
502 : : * Evaluates and returns the text label of the current node
503 : : * \param context extra QgsExpressionContext to use for evaluating the expression
504 : : * \param label text to evaluate instead of the layer layertree string
505 : : * \since QGIS 3.10
506 : : */
507 : : QString evaluateLabel( const QgsExpressionContext &context = QgsExpressionContext(), const QString &label = QString() );
508 : :
509 : : private:
510 : : void updateLabel();
511 : :
512 : : private:
513 : : QgsLegendSymbolItem mItem;
514 : : mutable QPixmap mPixmap; // cached symbol preview
515 : : QString mLabel;
516 : : bool mSymbolUsesMapUnits;
517 : :
518 : : QSize mIconSize;
519 : :
520 : : QString mTextOnSymbolLabel;
521 : : QgsTextFormat mTextOnSymbolTextFormat;
522 : :
523 : : std::unique_ptr< QgsSymbol > mCustomSymbol;
524 : :
525 : : // ident the symbol icon to make it look like a tree structure
526 : : static const int INDENT_SIZE = 20;
527 : :
528 : : /**
529 : : * Create an expressionContextScope containing symbol related variables
530 : : * \since QGIS 3.10
531 : : */
532 : : QgsExpressionContextScope *createSymbolScope() const SIP_FACTORY;
533 : :
534 : : };
535 : :
536 : :
537 : : /**
538 : : * \ingroup core
539 : : * \brief Implementation of legend node interface for displaying arbitrary label with icon.
540 : : *
541 : : * \since QGIS 2.6
542 : : */
543 : : class CORE_EXPORT QgsSimpleLegendNode : public QgsLayerTreeModelLegendNode
544 : : {
545 : : Q_OBJECT
546 : :
547 : : public:
548 : :
549 : : /**
550 : : * Constructor for QgsSimpleLegendNode.
551 : : * \param nodeLayer layer node
552 : : * \param label label
553 : : * \param icon icon
554 : : * \param parent attach a parent QObject to the legend node.
555 : : * \param key the rule key
556 : : */
557 : : QgsSimpleLegendNode( QgsLayerTreeLayer *nodeLayer, const QString &label, const QIcon &icon = QIcon(), QObject *parent SIP_TRANSFERTHIS = nullptr, const QString &key = QString() );
558 : :
559 : : QVariant data( int role ) const override;
560 : :
561 : : private:
562 : : QString mLabel;
563 : : QString mId;
564 : : QIcon mIcon;
565 : : QString mKey;
566 : : };
567 : :
568 : :
569 : : /**
570 : : * \ingroup core
571 : : * \brief Implementation of legend node interface for displaying arbitrary raster image
572 : : *
573 : : * \since QGIS 2.6
574 : : */
575 : : class CORE_EXPORT QgsImageLegendNode : public QgsLayerTreeModelLegendNode
576 : : {
577 : : Q_OBJECT
578 : :
579 : : public:
580 : :
581 : : /**
582 : : * Constructor for QgsImageLegendNode.
583 : : * \param nodeLayer layer node
584 : : * \param img the image
585 : : * \param parent attach a parent QObject to the legend node.
586 : : */
587 : : QgsImageLegendNode( QgsLayerTreeLayer *nodeLayer, const QImage &img, QObject *parent SIP_TRANSFERTHIS = nullptr );
588 : :
589 : : QVariant data( int role ) const override;
590 : :
591 : : QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
592 : :
593 : : QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
594 : :
595 : : private:
596 : : QImage mImage;
597 : : };
598 : :
599 : : /**
600 : : * \ingroup core
601 : : * \brief Implementation of legend node interface for displaying raster legend entries
602 : : *
603 : : * \since QGIS 2.6
604 : : */
605 : : class CORE_EXPORT QgsRasterSymbolLegendNode : public QgsLayerTreeModelLegendNode
606 : : {
607 : : Q_OBJECT
608 : :
609 : : public:
610 : :
611 : : /**
612 : : * Constructor for QgsRasterSymbolLegendNode.
613 : : * \param nodeLayer layer node
614 : : * \param color color
615 : : * \param label label
616 : : * \param parent attach a parent QObject to the legend node.
617 : : * \param isCheckable set to TRUE to enable the checkbox for the node (since QGIS 3.18)
618 : : * \param ruleKey optional identifier to allow a unique ID to be assigned to the node by a renderer (since QGIS 3.18)
619 : : */
620 : : QgsRasterSymbolLegendNode( QgsLayerTreeLayer *nodeLayer, const QColor &color, const QString &label, QObject *parent SIP_TRANSFERTHIS = nullptr, bool isCheckable = false, const QString &ruleKey = QString() );
621 : :
622 : : Qt::ItemFlags flags() const override;
623 : : QVariant data( int role ) const override;
624 : : bool setData( const QVariant &value, int role ) override;
625 : : QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
626 : : QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
627 : :
628 : : /**
629 : : * Returns the unique identifier of node for identification of the item within renderer.
630 : : *
631 : : * \since QGIS 3.18
632 : : */
633 : : QString ruleKey() const { return mRuleKey; }
634 : :
635 : : /**
636 : : * Returns whether the item is user-checkable - whether renderer supports enabling/disabling it.
637 : : *
638 : : * \since QGIS 3.18
639 : : */
640 : : bool isCheckable() const { return mCheckable; }
641 : :
642 : : private:
643 : : QColor mColor;
644 : : QString mLabel;
645 : : bool mCheckable = false;
646 : : QString mRuleKey;
647 : : };
648 : :
649 : : class QgsImageFetcher;
650 : :
651 : : /**
652 : : * \ingroup core
653 : : * \brief Implementation of legend node interface for displaying WMS legend entries
654 : : *
655 : : * \since QGIS 2.8
656 : : */
657 : : class CORE_EXPORT QgsWmsLegendNode : public QgsLayerTreeModelLegendNode
658 : : {
659 : 0 : Q_OBJECT
660 : :
661 : : public:
662 : :
663 : : /**
664 : : * Constructor for QgsWmsLegendNode.
665 : : * \param nodeLayer layer node
666 : : * \param parent attach a parent QObject to the legend node.
667 : : */
668 : : QgsWmsLegendNode( QgsLayerTreeLayer *nodeLayer, QObject *parent SIP_TRANSFERTHIS = nullptr );
669 : :
670 : : ~QgsWmsLegendNode() override;
671 : :
672 : : QVariant data( int role ) const override;
673 : :
674 : : QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
675 : :
676 : : QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
677 : :
678 : : void invalidateMapBasedData() override;
679 : :
680 : : private slots:
681 : :
682 : : void getLegendGraphicFinished( const QImage & );
683 : : void getLegendGraphicErrored( const QString & );
684 : : void getLegendGraphicProgress( qint64, qint64 );
685 : :
686 : : private:
687 : :
688 : : // Lazily initializes mImage
689 : : QImage getLegendGraphic() const;
690 : :
691 : : QImage renderMessage( const QString &msg ) const;
692 : :
693 : : QImage mImage;
694 : :
695 : : bool mValid;
696 : :
697 : : mutable std::unique_ptr<QgsImageFetcher> mFetcher;
698 : : };
699 : :
700 : :
701 : : /**
702 : : * \ingroup core
703 : : * \brief Produces legend node with a marker symbol
704 : : * \since QGIS 3.0
705 : : */
706 : : class CORE_EXPORT QgsDataDefinedSizeLegendNode : public QgsLayerTreeModelLegendNode
707 : : {
708 : : Q_OBJECT
709 : :
710 : : public:
711 : : //! Construct the node using QgsDataDefinedSizeLegend as definition of the node's appearance
712 : : QgsDataDefinedSizeLegendNode( QgsLayerTreeLayer *nodeLayer, const QgsDataDefinedSizeLegend &settings, QObject *parent SIP_TRANSFERTHIS = nullptr );
713 : : ~QgsDataDefinedSizeLegendNode() override;
714 : :
715 : : QVariant data( int role ) const override;
716 : :
717 : : ItemMetrics draw( const QgsLegendSettings &settings, ItemContext *ctx ) override;
718 : :
719 : : private:
720 : : void cacheImage() const;
721 : : QgsDataDefinedSizeLegend *mSettings = nullptr;
722 : : mutable QImage mImage;
723 : : };
724 : :
725 : : #endif // QGSLAYERTREEMODELLEGENDNODE_H
|