LCOV - code coverage report
Current view: top level - core/layertree - qgslayertreemodellegendnode.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 20 0.0 %
Date: 2021-03-26 12:19:53 Functions: 0 0 -
Branches: 0 0 -

           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

Generated by: LCOV version 1.14