QGIS API Documentation 3.27.0-Master (f261cc1f8b)
qgslayertreemodellegendnode.h
Go to the documentation of this file.
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
29#include "qgslegendpatchshape.h"
30#include "qgspallabeling.h"
31
35class QgsMapSettings;
36class QgsSymbol;
38
49class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
50{
51#ifdef SIP_RUN
53#endif
54
55#ifdef SIP_RUN
57 if ( qobject_cast<QgsSymbolLegendNode *> ( sipCpp ) )
58 sipType = sipType_QgsSymbolLegendNode;
59 else if ( qobject_cast<QgsDataDefinedSizeLegendNode *> ( sipCpp ) )
60 sipType = sipType_QgsDataDefinedSizeLegendNode;
61 else if ( qobject_cast<QgsImageLegendNode *> ( sipCpp ) )
62 sipType = sipType_QgsImageLegendNode;
63 else if ( qobject_cast<QgsRasterSymbolLegendNode *> ( sipCpp ) )
64 sipType = sipType_QgsRasterSymbolLegendNode;
65 else if ( qobject_cast<QgsSimpleLegendNode *> ( sipCpp ) )
66 sipType = sipType_QgsSimpleLegendNode;
67 else if ( qobject_cast<QgsWmsLegendNode *> ( sipCpp ) )
68 sipType = sipType_QgsWmsLegendNode;
69 else if ( qobject_cast<QgsColorRampLegendNode *> ( sipCpp ) )
70 sipType = sipType_QgsColorRampLegendNode;
71 else
72 sipType = 0;
74#endif
75
76 Q_OBJECT
77
78 public:
79
82 {
83 RuleKeyRole = Qt::UserRole,
86 };
87
90 {
99 };
100
102 QgsLayerTreeLayer *layerNode() const { return mLayerNode; }
103
105 QgsLayerTreeModel *model() const;
106
108 virtual Qt::ItemFlags flags() const;
109
111 virtual QVariant data( int role ) const = 0;
112
114 virtual bool setData( const QVariant &value, int role );
115
116 virtual bool isEmbeddedInParent() const { return mEmbeddedInParent; }
117 virtual void setEmbeddedInParent( bool embedded ) { mEmbeddedInParent = embedded; }
118
119 virtual QString userLabel() const { return mUserLabel; }
120 virtual void setUserLabel( const QString &userLabel ) { mUserLabel = userLabel; }
121
131 virtual QSizeF userPatchSize() const;
132
142 virtual void setUserPatchSize( QSizeF size );
143
150 virtual void setColumnBreak( bool breakBeforeNode ) { mColumnBreakBeforeNode = breakBeforeNode; }
151
158 virtual bool columnBreak() const { return mColumnBreakBeforeNode; }
159
160 virtual bool isScaleOK( double scale ) const { Q_UNUSED( scale ) return true; }
161
166 virtual void invalidateMapBasedData() {}
167
169 {
170 Q_NOWARN_DEPRECATED_PUSH //because of deprecated members
171 ItemContext() = default;
173
175 QgsRenderContext *context = nullptr;
177 QPainter *painter = nullptr;
178
183 Q_DECL_DEPRECATED QPointF point;
184
189 Q_DECL_DEPRECATED double labelXOffset = 0.0;
190
195 double top = 0.0;
196
203 double columnLeft = 0.0;
204
211 double columnRight = 0.0;
212
218 double maxSiblingSymbolWidth = 0.0;
219
226
234 QSizeF patchSize;
235 };
236
238 {
240 QSizeF labelSize;
241 };
242
249 virtual ItemMetrics draw( const QgsLegendSettings &settings, ItemContext *ctx );
250
258 QJsonObject exportToJson( const QgsLegendSettings &settings, const QgsRenderContext &context );
259
267 virtual QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const;
268
275 virtual QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const;
276
284 virtual QSizeF drawSymbolText( const QgsLegendSettings &settings, ItemContext *ctx, QSizeF symbolSize ) const;
285
286 public slots:
287
294 void checkAllItems();
295
302 void uncheckAllItems();
303
310 void toggleAllItems();
311
312 signals:
315
322
323 protected:
325 explicit QgsLayerTreeModelLegendNode( QgsLayerTreeLayer *nodeL, QObject *parent SIP_TRANSFERTHIS = nullptr );
326
328 QgsRenderContext *createTemporaryRenderContext() const SIP_FACTORY;
329
330 protected:
331 QgsLayerTreeLayer *mLayerNode = nullptr;
332 bool mEmbeddedInParent;
333 QString mUserLabel;
335 QSizeF mUserSize;
336 bool mColumnBreakBeforeNode = false;
337
338 private:
339
344 void checkAll( bool state );
345};
347
348#include "qgslegendsymbolitem.h"
349#include "qgstextformat.h"
350
359{
360 Q_OBJECT
361
362 public:
363
364 static double MINIMUM_SIZE;
365 static double MAXIMUM_SIZE;
366
373 QgsSymbolLegendNode( QgsLayerTreeLayer *nodeLayer, const QgsLegendSymbolItem &item, QObject *parent SIP_TRANSFERTHIS = nullptr );
374
375 Qt::ItemFlags flags() const override;
376 QVariant data( int role ) const override;
377 bool setData( const QVariant &value, int role ) override;
378
379 QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
380
381 QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
382
383 void setEmbeddedInParent( bool embedded ) override;
384
385 void setUserLabel( const QString &userLabel ) override { mUserLabel = userLabel; updateLabel(); }
386
387 bool isScaleOK( double scale ) const override { return mItem.isScaleOK( scale ); }
388
389 void invalidateMapBasedData() override;
390
395 void setIconSize( QSize sz ) { mIconSize = sz; }
397 QSize iconSize() const { return mIconSize; }
398
406 QSize minimumIconSize() const;
407
414 QSize minimumIconSize( QgsRenderContext *context ) const;
415
421 const QgsSymbol *symbol() const;
422
430 void setSymbol( QgsSymbol *symbol SIP_TRANSFER );
431
436 QString textOnSymbolLabel() const { return mTextOnSymbolLabel; }
437
442 void setTextOnSymbolLabel( const QString &label ) { mTextOnSymbolLabel = label; }
443
448 QgsTextFormat textOnSymbolTextFormat() const { return mTextOnSymbolTextFormat; }
449
454 void setTextOnSymbolTextFormat( const QgsTextFormat &format ) { mTextOnSymbolTextFormat = format; }
455
460 QString symbolLabel() const;
461
468 QgsLegendPatchShape patchShape() const;
469
476 void setPatchShape( const QgsLegendPatchShape &shape );
477
487 QgsSymbol *customSymbol() const;
488
500 void setCustomSymbol( QgsSymbol *symbol SIP_TRANSFER );
501
508 QString evaluateLabel( const QgsExpressionContext &context = QgsExpressionContext(), const QString &label = QString() );
509
510 private:
511 void updateLabel();
512
513 private:
515 mutable QPixmap mPixmap; // cached symbol preview
516 QString mLabel;
517 bool mSymbolUsesMapUnits;
518
519 QSize mIconSize;
520
521 QString mTextOnSymbolLabel;
522 QgsTextFormat mTextOnSymbolTextFormat;
523
524 std::unique_ptr< QgsSymbol > mCustomSymbol;
525
526 // ident the symbol icon to make it look like a tree structure
527 static const int INDENT_SIZE = 20;
528
533 QgsExpressionContextScope *createSymbolScope() const SIP_FACTORY;
534
535};
536
537
545{
546 Q_OBJECT
547
548 public:
549
558 QgsSimpleLegendNode( QgsLayerTreeLayer *nodeLayer, const QString &label, const QIcon &icon = QIcon(), QObject *parent SIP_TRANSFERTHIS = nullptr, const QString &key = QString() );
559
560 QVariant data( int role ) const override;
561
562 private:
563 QString mLabel;
564 QString mId;
565 QIcon mIcon;
566 QString mKey;
567};
568
569
577{
578 Q_OBJECT
579
580 public:
581
588 QgsImageLegendNode( QgsLayerTreeLayer *nodeLayer, const QImage &img, QObject *parent SIP_TRANSFERTHIS = nullptr );
589
590 QVariant data( int role ) const override;
591
592 QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
593
594 QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
595
596 private:
597 QImage mImage;
598};
599
607{
608 Q_OBJECT
609
610 public:
611
621 QgsRasterSymbolLegendNode( QgsLayerTreeLayer *nodeLayer, const QColor &color, const QString &label, QObject *parent SIP_TRANSFERTHIS = nullptr, bool isCheckable = false, const QString &ruleKey = QString() );
622
623 Qt::ItemFlags flags() const override;
624 QVariant data( int role ) const override;
625 bool setData( const QVariant &value, int role ) override;
626 QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
627 QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
628
634 QString ruleKey() const { return mRuleKey; }
635
641 bool isCheckable() const { return mCheckable; }
642
643 private:
644 QColor mColor;
645 QString mLabel;
646 bool mCheckable = false;
647 QString mRuleKey;
648};
649
650class QgsImageFetcher;
651
659{
660 Q_OBJECT
661
662 public:
663
669 QgsWmsLegendNode( QgsLayerTreeLayer *nodeLayer, QObject *parent SIP_TRANSFERTHIS = nullptr );
670
672
673 QVariant data( int role ) const override;
674
675 QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
676
677 QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
678
679 void invalidateMapBasedData() override;
680
681 private slots:
682
683 void getLegendGraphicFinished( const QImage & );
684 void getLegendGraphicErrored( const QString & );
685 void getLegendGraphicProgress( qint64, qint64 );
686
687 private:
688
689 // Lazily initializes mImage
690 QImage getLegendGraphic() const;
691
692 QImage renderMessage( const QString &msg ) const;
693
694 QImage mImage;
695
696 bool mValid;
697
698 mutable std::unique_ptr<QgsImageFetcher> mFetcher;
699};
700
701
708{
709 Q_OBJECT
710
711 public:
713 QgsDataDefinedSizeLegendNode( QgsLayerTreeLayer *nodeLayer, const QgsDataDefinedSizeLegend &settings, QObject *parent SIP_TRANSFERTHIS = nullptr );
715
716 QVariant data( int role ) const override;
717
718 ItemMetrics draw( const QgsLegendSettings &settings, ItemContext *ctx ) override;
719
720 private:
721 void cacheImage() const;
722 QgsDataDefinedSizeLegend *mSettings = nullptr;
723 mutable QImage mImage;
724};
725
732{
733 Q_OBJECT
734 public:
735
742 QgsVectorLabelLegendNode( QgsLayerTreeLayer *nodeLayer, const QgsPalLayerSettings &labelSettings, QObject *parent = nullptr );
743 ~QgsVectorLabelLegendNode() override;
744
750 QVariant data( int role ) const override;
751
759 QSizeF drawSymbol( const QgsLegendSettings &settings, ItemContext *ctx, double itemHeight ) const override;
760
767 QJsonObject exportSymbolToJson( const QgsLegendSettings &settings, const QgsRenderContext &context ) const override;
768
769 private:
770 QgsPalLayerSettings mLabelSettings;
771 QSizeF drawSymbol( const QgsLegendSettings &settings, const QgsRenderContext &renderContext, double xOffset = 0.0, double yOffset = 0.0 ) const;
772 void textWidthHeight( double &width, double &height, QgsRenderContext &ctx, const QgsTextFormat &textFormat, const QStringList &textLines ) const;
773};
774
775
776#endif // QGSLAYERTREEMODELLEGENDNODE_H
Produces legend node with a marker symbol.
Object that keeps configuration of appearance of marker symbol's data-defined size in legend.
Single scope for storing variables and functions for use within a QgsExpressionContext.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Handles asynchronous download of images.
Implementation of legend node interface for displaying arbitrary raster image.
Layer tree node points to a map layer.
The QgsLegendRendererItem class is abstract interface for legend items returned from QgsMapLayerLegen...
virtual QVariant data(int role) const =0
Returns data associated with the item. Must be implemented in derived class.
virtual bool columnBreak() const
Returns whether a forced column break should occur before the node.
@ SimpleLegend
Simple label with icon legend node type.
@ RasterSymbolLegend
Raster symbol legend node type.
@ ImageLegend
Raster image legend node type.
@ DataDefinedSizeLegend
Marker symbol legend node type.
@ EmbeddedWidget
Embedded widget placeholder node type.
@ ColorRampLegend
Color ramp legend (since QGIS 3.18)
@ SymbolLegend
Vector symbol legend node type.
virtual bool isScaleOK(double scale) const
virtual void setColumnBreak(bool breakBeforeNode)
Sets whether a forced column break should occur before the node.
virtual void invalidateMapBasedData()
Notification from model that information from associated map view has changed.
@ ParentRuleKeyRole
Rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2....
@ NodeTypeRole
Type of node. Added in 3.16.
void sizeChanged()
Emitted when the size of this node changes.
void dataChanged()
Emitted on internal data change so the layer tree model can forward the signal to views.
QgsLayerTreeLayer * layerNode() const
Returns pointer to the parent layer node.
virtual void setEmbeddedInParent(bool embedded)
virtual void setUserLabel(const QString &userLabel)
The QgsLayerTreeModel class is model implementation for Qt item views framework.
Represents a patch shape for use in map legends.
The QgsLegendSettings class stores the appearance and layout settings for legend drawing with QgsLege...
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
The QgsMapSettings class contains configuration for rendering of the map.
Contains settings for how a map layer will be labeled.
Implementation of legend node interface for displaying raster legend entries.
QString ruleKey() const
Returns the unique identifier of node for identification of the item within renderer.
bool isCheckable() const
Returns whether the item is user-checkable - whether renderer supports enabling/disabling it.
Contains information about the context of a rendering operation.
Implementation of legend node interface for displaying arbitrary label with icon.
Implementation of legend node interface for displaying preview of vector symbols and their labels and...
QString textOnSymbolLabel() const
Returns label of text to be shown on top of the symbol.
void setIconSize(QSize sz)
Set the icon size.
void setUserLabel(const QString &userLabel) override
void setTextOnSymbolTextFormat(const QgsTextFormat &format)
Sets format of text to be shown on top of the symbol.
void setTextOnSymbolLabel(const QString &label)
Sets label of text to be shown on top of the symbol.
bool isScaleOK(double scale) const override
QgsTextFormat textOnSymbolTextFormat() const
Returns text format of the label to be shown on top of the symbol.
Abstract base class for all rendered symbols.
Definition: qgssymbol.h:93
Container for all settings relating to text rendering.
Definition: qgstextformat.h:41
Produces legend node for a labeling text symbol.
Implementation of legend node interface for displaying WMS legend entries.
~QgsWmsLegendNode() override
#define Q_NOWARN_DEPRECATED_POP
Definition: qgis.h:2951
#define Q_NOWARN_DEPRECATED_PUSH
Definition: qgis.h:2950
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:186
#define SIP_TRANSFERTHIS
Definition: qgis_sip.h:53
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_END
Definition: qgis_sip.h:203
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
Q_NOWARN_DEPRECATED_PUSH ItemContext()=default
QgsLegendPatchShape patchShape
The patch shape to render for the node.
QSizeF patchSize
Symbol patch size to render for the node.
Q_DECL_DEPRECATED QPointF point
Top-left corner of the legend item.