/** * The QgsLegendRendererItem class is abstract interface for legend items * returned from QgsMapLayerLegend implementation. * * The objects are used in QgsLayerTreeModel. Custom implementations may offer additional interactivity * and customized look. * * @note added in 2.6 */ class QgsLayerTreeModelLegendNode : QObject { %TypeHeaderCode #include %End public: ~QgsLayerTreeModelLegendNode(); enum LegendNodeRoles { RuleKeyRole, //!< rule key of the node (QString) ParentRuleKeyRole //!< rule key of the parent legend node - for legends with tree hierarchy (QString). Added in 2.8 }; /** Return pointer to the parent layer node */ QgsLayerTreeLayer* layerNode() const; /** Return pointer to model owning this legend node */ QgsLayerTreeModel* model() const; /** Return item flags associated with the item. Default implementation returns Qt::ItemIsEnabled. */ virtual Qt::ItemFlags flags() const; /** Return data associated with the item. Must be implemented in derived class. */ virtual QVariant data( int role ) const = 0; /** Set some data associated with the item. Default implementation does nothing and returns false. */ virtual bool setData( const QVariant& value, int role ); virtual bool isEmbeddedInParent() const; virtual void setEmbeddedInParent( bool embedded ); virtual QString userLabel() const; virtual void setUserLabel( const QString& userLabel ); virtual bool isScaleOK( double scale ) const; /** Notification from model that information from associated map view has changed. * Default implementation does nothing. */ virtual void invalidateMapBasedData(); struct ItemContext { //! Painter QPainter* painter; //! Top-left corner of the legend item QPointF point; //! offset from the left side where label should start double labelXOffset; }; struct ItemMetrics { QSizeF symbolSize; QSizeF labelSize; }; /** Entry point called from QgsLegendRenderer to do the rendering. * Default implementation calls drawSymbol() and drawSymbolText() methods. * * If ctx is null, this is just first stage when preparing layout - without actual rendering. */ virtual ItemMetrics draw( const QgsLegendSettings& settings, ItemContext* ctx ); /** * Draws symbol on the left side of the item * @param settings Legend layout configuration * @param ctx Context for rendering - may be null if only doing layout without actual rendering * @param itemHeight Minimal height of the legend item - used for correct positioning when rendering * @return Real size of the symbol (may be bigger than "normal" symbol size from settings) */ virtual QSizeF drawSymbol( const QgsLegendSettings& settings, ItemContext* ctx, double itemHeight ) const; /** * Draws label on the right side of the item * @param settings Legend layout configuration * @param ctx Context for rendering - may be null if only doing layout without actual rendering * @param symbolSize Real size of the associated symbol - used for correct positioning when rendering * @return Size of the label (may span multiple lines) */ virtual QSizeF drawSymbolText( const QgsLegendSettings& settings, ItemContext* ctx, QSizeF symbolSize ) const; signals: //! Emitted on internal data change so the layer tree model can forward the signal to views void dataChanged(); protected: /** Construct the node with pointer to its parent layer node */ explicit QgsLayerTreeModelLegendNode( QgsLayerTreeLayer* nodeL, QObject* parent /TransferThis/ = 0 ); private: QgsLayerTreeModelLegendNode(const QgsLayerTreeModelLegendNode &); }; /** * Implementation of legend node interface for displaying preview of vector symbols and their labels * and allowing interaction with the symbol / renderer. * * @note added in 2.6 */ class QgsSymbolLegendNode : QgsLayerTreeModelLegendNode { %TypeHeaderCode #include %End public: QgsSymbolLegendNode( QgsLayerTreeLayer* nodeLayer, const QgsLegendSymbolItem& item, QObject* parent /TransferThis/ = 0 ); ~QgsSymbolLegendNode(); virtual Qt::ItemFlags flags() const; virtual QVariant data( int role ) const; virtual bool setData( const QVariant& value, int role ); QSizeF drawSymbol( const QgsLegendSettings& settings, ItemContext* ctx, double itemHeight ) const; virtual void setEmbeddedInParent( bool embedded ); void setUserLabel( const QString& userLabel ); virtual bool isScaleOK( double scale ) const; virtual void invalidateMapBasedData(); //! Set the icon size //! @note added in 2.10 void setIconSize( QSize sz ); //! @note added in 2.10 QSize iconSize() const; /** * Calculates the minimum icon size to prevent cropping. When evaluating * the size for multiple icons it is more efficient to create a single * render context in advance and use the variant which accepts a QgsRenderContext * argument. * @note added in 2.10 */ QSize minimumIconSize() const; /** * Calculates the minimum icon size to prevent cropping. When evaluating * the size for multiple icons it is more efficient to create a single * render context in advance and call this method instead of minimumIconSize(). * @note added in QGIS 2.18 */ QSize minimumIconSize( QgsRenderContext* context ) const; /** Returns the symbol used by the legend node. * @see setSymbol() * @note added in QGIS 2.14 */ const QgsSymbol* symbol() const; /** Sets the symbol to be used by the legend node. The symbol change is also propagated * to the associated vector layer's renderer. * @param symbol new symbol for node. Ownership is transferred. * @see symbol() * @note added in QGIS 2.14 */ void setSymbol( QgsSymbol* symbol /Transfer/ ); public slots: /** Checks all items belonging to the same layer as this node. * @note added in QGIS 2.14 * @see uncheckAllItems() */ void checkAllItems(); /** Unchecks all items belonging to the same layer as this node. * @note added in QGIS 2.14 * @see checkAllItems() */ void uncheckAllItems(); }; /** * Implementation of legend node interface for displaying arbitrary label with icon. * * @note added in 2.6 */ class QgsSimpleLegendNode : QgsLayerTreeModelLegendNode { %TypeHeaderCode #include %End public: QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon = QIcon(), QObject* parent /TransferThis/ = 0, const QString& key = QString() ); virtual QVariant data( int role ) const; }; /** * Implementation of legend node interface for displaying arbitrary raster image * * @note added in 2.6 */ class QgsImageLegendNode : QgsLayerTreeModelLegendNode { %TypeHeaderCode #include %End public: QgsImageLegendNode( QgsLayerTreeLayer* nodeLayer, const QImage& img, QObject* parent /TransferThis/ = 0 ); virtual QVariant data( int role ) const; QSizeF drawSymbol( const QgsLegendSettings& settings, ItemContext* ctx, double itemHeight ) const; }; /** * Implementation of legend node interface for displaying raster legend entries * * @note added in 2.6 */ class QgsRasterSymbolLegendNode : QgsLayerTreeModelLegendNode { %TypeHeaderCode #include %End public: QgsRasterSymbolLegendNode( QgsLayerTreeLayer* nodeLayer, const QColor& color, const QString& label, QObject* parent /TransferThis/ = 0 ); virtual QVariant data( int role ) const; QSizeF drawSymbol( const QgsLegendSettings& settings, ItemContext* ctx, double itemHeight ) const; }; /** * Implementation of legend node interface for displaying WMS legend entries * * @note added in 2.8 */ class QgsWmsLegendNode : QgsLayerTreeModelLegendNode { %TypeHeaderCode #include %End public: /** Constructor for QgsWmsLegendNode. * @param nodeLayer layer node * @param parent parent object */ QgsWmsLegendNode( QgsLayerTreeLayer* nodeLayer, QObject* parent /TransferThis/ = nullptr ); virtual QVariant data( int role ) const; virtual QSizeF drawSymbol( const QgsLegendSettings& settings, ItemContext* ctx, double itemHeight ) const; virtual void invalidateMapBasedData(); };