LCOV - code coverage report
Current view: top level - core/layout - qgslayoutitem.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 18 0.0 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :                               qgslayoutitem.h
       3                 :            :                              -------------------
       4                 :            :     begin                : June 2017
       5                 :            :     copyright            : (C) 2017 by Nyall Dawson
       6                 :            :     email                : nyall dot dawson at gmail dot com
       7                 :            :  ***************************************************************************/
       8                 :            : /***************************************************************************
       9                 :            :  *                                                                         *
      10                 :            :  *   This program is free software; you can redistribute it and/or modify  *
      11                 :            :  *   it under the terms of the GNU General Public License as published by  *
      12                 :            :  *   the Free Software Foundation; either version 2 of the License, or     *
      13                 :            :  *   (at your option) any later version.                                   *
      14                 :            :  *                                                                         *
      15                 :            :  ***************************************************************************/
      16                 :            : 
      17                 :            : #ifndef QGSLAYOUTITEM_H
      18                 :            : #define QGSLAYOUTITEM_H
      19                 :            : 
      20                 :            : #include "qgis_core.h"
      21                 :            : #include "qgslayoutobject.h"
      22                 :            : #include "qgslayoutsize.h"
      23                 :            : #include "qgslayoutpoint.h"
      24                 :            : #include "qgsrendercontext.h"
      25                 :            : #include "qgslayoutundocommand.h"
      26                 :            : #include "qgslayoutmeasurement.h"
      27                 :            : #include "qgsapplication.h"
      28                 :            : #include <QGraphicsRectItem>
      29                 :            : #include <QIcon>
      30                 :            : #include <QPainter>
      31                 :            : 
      32                 :            : class QgsLayout;
      33                 :            : class QPainter;
      34                 :            : class QgsLayoutItemGroup;
      35                 :            : class QgsLayoutEffect;
      36                 :            : class QgsStyleEntityVisitorInterface;
      37                 :            : 
      38                 :            : /**
      39                 :            :  * \ingroup core
      40                 :            :  * \class QgsLayoutItemRenderContext
      41                 :            :  * \brief Contains settings and helpers relating to a render of a QgsLayoutItem.
      42                 :            :  * \since QGIS 3.0
      43                 :            :  */
      44                 :            : class CORE_EXPORT QgsLayoutItemRenderContext
      45                 :            : {
      46                 :            :   public:
      47                 :            : 
      48                 :            :     /**
      49                 :            :      * Constructor for QgsLayoutItemRenderContext.
      50                 :            :      *
      51                 :            :      * The \a renderContext parameter specifies a QgsRenderContext for use within
      52                 :            :      * the QgsLayoutItemRenderContext.
      53                 :            :      *
      54                 :            :      * The \a viewScaleFactor gives the current view zoom (scale factor). It can be
      55                 :            :      * used to scale render graphics so that they always appear a constant size,
      56                 :            :      * regardless of the current view zoom.
      57                 :            :      */
      58                 :            :     QgsLayoutItemRenderContext( QgsRenderContext &context, double viewScaleFactor = 1.0 );
      59                 :            : 
      60                 :            :     //! QgsLayoutItemRenderContext cannot be copied.
      61                 :            :     QgsLayoutItemRenderContext( const QgsLayoutItemRenderContext &other ) = delete;
      62                 :            : 
      63                 :            :     //! QgsLayoutItemRenderContext cannot be copied.
      64                 :            :     QgsLayoutItemRenderContext &operator=( const QgsLayoutItemRenderContext &other ) = delete;
      65                 :            : 
      66                 :            :     /**
      67                 :            :      * Returns a reference to the context's render context.
      68                 :            :      *
      69                 :            :      * Note that the context's painter has been scaled so that painter units are pixels.
      70                 :            :      * Use the QgsRenderContext methods to convert from millimeters or other units to the painter's units.
      71                 :            :      */
      72                 :          0 :     QgsRenderContext &renderContext() { return mRenderContext; }
      73                 :            : 
      74                 :            :     /**
      75                 :            :      * Returns a reference to the context's render context.
      76                 :            :      *
      77                 :            :      * Note that the context's painter has been scaled so that painter units are pixels.
      78                 :            :      * Use the QgsRenderContext methods to convert from millimeters or other units to the painter's units.
      79                 :            :      *
      80                 :            :      * \note Not available in Python bindings.
      81                 :            :      */
      82                 :            :     const QgsRenderContext &renderContext() const { return mRenderContext; } SIP_SKIP
      83                 :            : 
      84                 :            :     /**
      85                 :            :      * Returns the current view zoom (scale factor). It can be
      86                 :            :      * used to scale render graphics so that they always appear a constant size,
      87                 :            :      * regardless of the current view zoom.
      88                 :            :      *
      89                 :            :      * E.g. a value of 0.5 indicates that the view is zoomed out to 50% size, so rendered
      90                 :            :      * items must be scaled by 200% in order to have a constant visible size. A value
      91                 :            :      * of 2.0 indicates that the view is zoomed in 200%, so rendered items must be
      92                 :            :      * scaled by 50% in order to have a constant visible size.
      93                 :            :      */
      94                 :          0 :     double viewScaleFactor() const { return mViewScaleFactor; }
      95                 :            : 
      96                 :            :   private:
      97                 :            : 
      98                 :            : #ifdef SIP_RUN
      99                 :            :     QgsLayoutItemRenderContext( const QgsLayoutItemRenderContext &rh ) SIP_FORCE;
     100                 :            : #endif
     101                 :            : 
     102                 :            :     QgsRenderContext &mRenderContext;
     103                 :            :     double mViewScaleFactor = 1.0;
     104                 :            : };
     105                 :            : 
     106                 :            : /**
     107                 :            :  * \ingroup core
     108                 :            :  * \class QgsLayoutItem
     109                 :            :  * \brief Base class for graphical items within a QgsLayout.
     110                 :            :  * \since QGIS 3.0
     111                 :            :  */
     112                 :            : class CORE_EXPORT QgsLayoutItem : public QgsLayoutObject, public QGraphicsRectItem, public QgsLayoutUndoObjectInterface
     113                 :            : {
     114                 :            : #ifdef SIP_RUN
     115                 :            : #include "qgslayoutitemgroup.h"
     116                 :            : #include "qgslayoutitemmap.h"
     117                 :            : #include "qgslayoutitempicture.h"
     118                 :            : #include "qgslayoutitemlabel.h"
     119                 :            : #include "qgslayoutitemlegend.h"
     120                 :            : #include "qgslayoutitempolygon.h"
     121                 :            : #include "qgslayoutitempolyline.h"
     122                 :            : #include "qgslayoutitemscalebar.h"
     123                 :            : #include "qgslayoutframe.h"
     124                 :            : #include "qgslayoutitemshape.h"
     125                 :            : #include "qgslayoutitempage.h"
     126                 :            : #endif
     127                 :            : 
     128                 :            : #ifdef SIP_RUN
     129                 :            :     SIP_CONVERT_TO_SUBCLASS_CODE
     130                 :            : 
     131                 :            :     // FREAKKKKIIN IMPORTANT!!!!!!!!!!!
     132                 :            :     // IF YOU PUT SOMETHING HERE, PUT IT IN QgsLayoutObject CASTING *****ALSO******
     133                 :            :     // (it's not enough for it to be in only one of the places, as sip inconsistently
     134                 :            :     // decides which casting code to perform here)
     135                 :            : 
     136                 :            :     // the conversions have to be static, because they're using multiple inheritance
     137                 :            :     // (seen in PyQt4 .sip files for some QGraphicsItem classes)
     138                 :            :     switch ( sipCpp->type() )
     139                 :            :     {
     140                 :            :       // really, these *should* use the constants from QgsLayoutItemRegistry, but sip doesn't like that!
     141                 :            :       case QGraphicsItem::UserType + 101:
     142                 :            :         sipType = sipType_QgsLayoutItemGroup;
     143                 :            :         *sipCppRet = static_cast<QgsLayoutItemGroup *>( sipCpp );
     144                 :            :         break;
     145                 :            :       case QGraphicsItem::UserType + 102:
     146                 :            :         sipType = sipType_QgsLayoutItemPage;
     147                 :            :         *sipCppRet = static_cast<QgsLayoutItemPage *>( sipCpp );
     148                 :            :         break;
     149                 :            :       case QGraphicsItem::UserType + 103:
     150                 :            :         sipType = sipType_QgsLayoutItemMap;
     151                 :            :         *sipCppRet = static_cast<QgsLayoutItemMap *>( sipCpp );
     152                 :            :         break;
     153                 :            :       case QGraphicsItem::UserType + 104:
     154                 :            :         sipType = sipType_QgsLayoutItemPicture;
     155                 :            :         *sipCppRet = static_cast<QgsLayoutItemPicture *>( sipCpp );
     156                 :            :         break;
     157                 :            :       case QGraphicsItem::UserType + 105:
     158                 :            :         sipType = sipType_QgsLayoutItemLabel;
     159                 :            :         *sipCppRet = static_cast<QgsLayoutItemLabel *>( sipCpp );
     160                 :            :         break;
     161                 :            :       case QGraphicsItem::UserType + 106:
     162                 :            :         sipType = sipType_QgsLayoutItemLegend;
     163                 :            :         *sipCppRet = static_cast<QgsLayoutItemLegend *>( sipCpp );
     164                 :            :         break;
     165                 :            :       case QGraphicsItem::UserType + 107:
     166                 :            :         sipType = sipType_QgsLayoutItemShape;
     167                 :            :         *sipCppRet = static_cast<QgsLayoutItemShape *>( sipCpp );
     168                 :            :         break;
     169                 :            :       case QGraphicsItem::UserType + 108:
     170                 :            :         sipType = sipType_QgsLayoutItemPolygon;
     171                 :            :         *sipCppRet = static_cast<QgsLayoutItemPolygon *>( sipCpp );
     172                 :            :         break;
     173                 :            :       case QGraphicsItem::UserType + 109:
     174                 :            :         sipType = sipType_QgsLayoutItemPolyline;
     175                 :            :         *sipCppRet = static_cast<QgsLayoutItemPolyline *>( sipCpp );
     176                 :            :         break;
     177                 :            :       case QGraphicsItem::UserType + 110:
     178                 :            :         sipType = sipType_QgsLayoutItemScaleBar;
     179                 :            :         *sipCppRet = static_cast<QgsLayoutItemScaleBar *>( sipCpp );
     180                 :            :         break;
     181                 :            :       case QGraphicsItem::UserType + 111:
     182                 :            :         sipType = sipType_QgsLayoutFrame;
     183                 :            :         *sipCppRet = static_cast<QgsLayoutFrame *>( sipCpp );
     184                 :            :         break;
     185                 :            : 
     186                 :            :       // did you read that comment above? NO? Go read it now. You're about to break stuff.
     187                 :            : 
     188                 :            :       default:
     189                 :            :         sipType = NULL;
     190                 :            :     }
     191                 :            :     SIP_END
     192                 :            : #endif
     193                 :            : 
     194                 :            : 
     195                 :          0 :     Q_OBJECT
     196                 :            :     Q_PROPERTY( bool locked READ isLocked WRITE setLocked NOTIFY lockChanged )
     197                 :            : 
     198                 :            :   public:
     199                 :            : 
     200                 :            :     //! Fixed position reference point
     201                 :            :     enum ReferencePoint
     202                 :            :     {
     203                 :            :       UpperLeft, //!< Upper left corner of item
     204                 :            :       UpperMiddle, //!< Upper center of item
     205                 :            :       UpperRight, //!< Upper right corner of item
     206                 :            :       MiddleLeft, //!< Middle left of item
     207                 :            :       Middle, //!< Center of item
     208                 :            :       MiddleRight, //!< Middle right of item
     209                 :            :       LowerLeft, //!< Lower left corner of item
     210                 :            :       LowerMiddle, //!< Lower center of item
     211                 :            :       LowerRight, //!< Lower right corner of item
     212                 :            :     };
     213                 :            : 
     214                 :            :     //! Layout item undo commands, used for collapsing undo commands
     215                 :            :     enum UndoCommand
     216                 :            :     {
     217                 :            :       UndoNone = -1, //!< No command suppression
     218                 :            :       UndoIncrementalMove = 1, //!< Layout item incremental movement, e.g. as a result of a keypress
     219                 :            :       UndoIncrementalResize, //!< Incremental resize
     220                 :            :       UndoStrokeColor, //!< Stroke color adjustment
     221                 :            :       UndoStrokeWidth, //!< Stroke width adjustment
     222                 :            :       UndoBackgroundColor, //!< Background color adjustment
     223                 :            :       UndoOpacity, //!< Opacity adjustment
     224                 :            :       UndoSetId, //!< Change item ID
     225                 :            :       UndoRotation, //!< Rotation adjustment
     226                 :            :       UndoShapeStyle, //!< Shape symbol style
     227                 :            :       UndoShapeCornerRadius, //!< Shape corner radius
     228                 :            :       UndoNodeMove, //!< Node move
     229                 :            :       UndoAtlasMargin, //!< Map atlas margin changed
     230                 :            :       UndoMapRotation, //!< Map rotation changed
     231                 :            :       UndoZoomContent, //!< Item content zoomed
     232                 :            :       UndoOverviewStyle, //!< Map overview style
     233                 :            :       UndoGridFramePenColor, //!< Map grid frame pen color
     234                 :            :       UndoMapGridFrameFill1Color, //!< Map grid frame fill color 1
     235                 :            :       UndoMapGridFrameFill2Color, //!< Map grid frame fill color 2
     236                 :            :       UndoMapAnnotationDistance, //!< Map frame annotation distance
     237                 :            :       UndoMapGridAnnotationFontColor, //!< Map frame annotation color
     238                 :            :       UndoMapGridLineSymbol, //!< Grid line symbol
     239                 :            :       UndoMapGridMarkerSymbol, //!< Grid marker symbol
     240                 :            :       UndoMapGridIntervalRange, //!< Grid interval range
     241                 :            :       UndoMapLabelMargin, //!< Margin for labels from edge of map
     242                 :            :       UndoPictureRotation, //!< Picture rotation
     243                 :            :       UndoPictureFillColor, //!< Picture fill color
     244                 :            :       UndoPictureStrokeColor, //!< Picture stroke color
     245                 :            :       UndoPictureStrokeWidth, //!< Picture stroke width
     246                 :            :       UndoPictureNorthOffset, //!< Picture north offset
     247                 :            :       UndoLabelText, //!< Label text
     248                 :            :       UndoLabelFont, //!< Label font
     249                 :            :       UndoLabelMargin, //!< Label margin
     250                 :            :       UndoLabelFontColor, //!< Label color
     251                 :            :       UndoLegendText, //!< Legend text
     252                 :            :       UndoLegendColumnCount, //!< Legend column count
     253                 :            :       UndoLegendSymbolWidth, //!< Legend symbol width
     254                 :            :       UndoLegendSymbolHeight, //!< Legend symbol height
     255                 :            :       UndoLegendMaxSymbolSize, //!< Legend maximum symbol size
     256                 :            :       UndoLegendMinSymbolSize, //!< Legend minimum symbol size
     257                 :            :       UndoLegendWmsLegendWidth, //!< Legend WMS width
     258                 :            :       UndoLegendWmsLegendHeight, //!< Legend WMS height
     259                 :            :       UndoLegendTitleSpaceBottom, //!< Legend title space
     260                 :            :       UndoLegendGroupSpace, //!< Legend group spacing
     261                 :            :       UndoLegendLayerSpace, //!< Legend layer spacing
     262                 :            :       UndoLegendSymbolSpace, //!< Legend symbol spacing
     263                 :            :       UndoLegendIconSymbolSpace, //!< Legend icon symbol space
     264                 :            :       UndoLegendFontColor, //!< Legend font color
     265                 :            :       UndoLegendBoxSpace, //!< Legend box space
     266                 :            :       UndoLegendColumnSpace, //!< Legend column space
     267                 :            :       UndoLegendLineSpacing, //!< Legend line spacing
     268                 :            :       UndoLegendRasterStrokeWidth, //!< Legend raster stroke width
     269                 :            :       UndoLegendRasterStrokeColor, //!< Legend raster stroke color
     270                 :            :       UndoLegendTitleFont, //!< Legend title font
     271                 :            :       UndoLegendGroupFont, //!< Legend group font
     272                 :            :       UndoLegendLayerFont, //!< Legend layer font
     273                 :            :       UndoLegendItemFont, //!< Legend item font
     274                 :            :       UndoScaleBarLineWidth, //!< Scalebar line width
     275                 :            :       UndoScaleBarSegmentSize, //!< Scalebar segment size
     276                 :            :       UndoScaleBarSegmentsLeft, //!< Scalebar segments left
     277                 :            :       UndoScaleBarSegments, //!< Scalebar number of segments
     278                 :            :       UndoScaleBarHeight, //!< Scalebar height
     279                 :            :       UndoScaleBarSubdivisions, //!< Scalebar number of subdivisions
     280                 :            :       UndoScaleBarSubdivisionsHeight, //!< Scalebar subdivisions height
     281                 :            :       UndoScaleBarFontColor, //!< Scalebar font color
     282                 :            :       UndoScaleBarFillColor, //!< Scalebar fill color
     283                 :            :       UndoScaleBarFillColor2, //!< Scalebar secondary fill color
     284                 :            :       UndoScaleBarStrokeColor, //!< Scalebar stroke color
     285                 :            :       UndoScaleBarUnitText, //!< Scalebar unit text
     286                 :            :       UndoScaleBarMapUnitsSegment, //!< Scalebar map units per segment
     287                 :            :       UndoScaleBarLabelBarSize, //!< Scalebar label bar size
     288                 :            :       UndoScaleBarBoxContentSpace, //!< Scalebar box context space
     289                 :            :       UndoArrowStrokeWidth, //!< Arrow stroke width
     290                 :            :       UndoArrowHeadWidth, //!< Arrow head width
     291                 :            :       UndoArrowHeadFillColor, //!< Arrow head fill color
     292                 :            :       UndoArrowHeadStrokeColor, //!< Arrow head stroke color
     293                 :            : 
     294                 :            :       UndoCustomCommand, //!< Base id for plugin based item undo commands
     295                 :            :     };
     296                 :            : 
     297                 :            :     /**
     298                 :            :      * Flags for controlling how an item behaves.
     299                 :            :      * \since QGIS 3.4.3
     300                 :            :      */
     301                 :            :     enum Flag
     302                 :            :     {
     303                 :            :       FlagOverridesPaint = 1 << 1,  //!< Item overrides the default layout item painting method
     304                 :            :       FlagProvidesClipPath = 1 << 2, //!< Item can act as a clipping path provider (see clipPath())
     305                 :            :     };
     306                 :            :     Q_DECLARE_FLAGS( Flags, Flag )
     307                 :            : 
     308                 :            :     /**
     309                 :            :      * Constructor for QgsLayoutItem, with the specified parent \a layout.
     310                 :            :      *
     311                 :            :      * If \a manageZValue is TRUE, the z-Value of this item will be managed by the layout.
     312                 :            :      * Generally this is the desired behavior.
     313                 :            :      */
     314                 :            :     explicit QgsLayoutItem( QgsLayout *layout, bool manageZValue = true );
     315                 :            : 
     316                 :            :     ~QgsLayoutItem() override;
     317                 :            : 
     318                 :            :     /**
     319                 :            :      * Called just before a batch of items are deleted, allowing them to run cleanup
     320                 :            :      * tasks.
     321                 :            :      */
     322                 :            :     virtual void cleanup();
     323                 :            : 
     324                 :            :     /**
     325                 :            :      * Returns a unique graphics item type identifier.
     326                 :            :      *
     327                 :            :      * Plugin based subclasses should return an identifier greater than QgsLayoutItemRegistry::PluginItem.
     328                 :            :      */
     329                 :            :     int type() const override;
     330                 :            : 
     331                 :            :     /**
     332                 :            :      * Returns the item's icon.
     333                 :            :      */
     334                 :            :     virtual QIcon icon() const { return QgsApplication::getThemeIcon( QStringLiteral( "/mLayoutItem.svg" ) ); }
     335                 :            : 
     336                 :            :     /**
     337                 :            :      * Returns the item identification string. This is a unique random string set for the item
     338                 :            :      * upon creation.
     339                 :            :      * \note There is no corresponding setter for the uuid - it's created automatically.
     340                 :            :      * \see id()
     341                 :            :      * \see setId()
     342                 :            :     */
     343                 :            :     virtual QString uuid() const { return mUuid; }
     344                 :            : 
     345                 :            :     /**
     346                 :            :      * Returns the item's flags, which indicate how the item behaves.
     347                 :            :      * \since QGIS 3.4.3
     348                 :            :      */
     349                 :            :     virtual Flags itemFlags() const;
     350                 :            : 
     351                 :            :     /**
     352                 :            :      * Returns the item's ID name. This is not necessarily unique, and duplicate ID names may exist
     353                 :            :      * for a layout.
     354                 :            :      * \see setId()
     355                 :            :      * \see uuid()
     356                 :            :      */
     357                 :          0 :     QString id() const { return mId; }
     358                 :            : 
     359                 :            :     /**
     360                 :            :      * Set the item's \a id name. This is not necessarily unique, and duplicate ID names may exist
     361                 :            :      * for a layout.
     362                 :            :      * \see id()
     363                 :            :      * \see uuid()
     364                 :            :      */
     365                 :            :     virtual void setId( const QString &id );
     366                 :            : 
     367                 :            :     /**
     368                 :            :      * Gets item display name. This is the item's id if set, and if
     369                 :            :      * not, a user-friendly string identifying item type.
     370                 :            :      * \see id()
     371                 :            :      * \see setId()
     372                 :            :      */
     373                 :            :     virtual QString displayName() const;
     374                 :            : 
     375                 :            :     /**
     376                 :            :      * Sets whether the item should be selected.
     377                 :            :      */
     378                 :            :     virtual void setSelected( bool selected );
     379                 :            : 
     380                 :            :     /**
     381                 :            :      * Sets whether the item is \a visible.
     382                 :            :      * \note QGraphicsItem::setVisible should not be called directly
     383                 :            :      * on a QgsLayoutItem, as some item types (e.g., groups) need to override
     384                 :            :      * the visibility toggle.
     385                 :            :      */
     386                 :            :     virtual void setVisibility( bool visible );
     387                 :            : 
     388                 :            :     /**
     389                 :            :      * Sets whether the item is \a locked, preventing mouse interactions with the item.
     390                 :            :      * \see isLocked()
     391                 :            :      * \see lockChanged()
     392                 :            :      */
     393                 :            :     void setLocked( bool locked );
     394                 :            : 
     395                 :            :     /**
     396                 :            :      * Returns TRUE if the item is locked, and cannot be interacted with using the mouse.
     397                 :            :      * \see setLocked()
     398                 :            :      * \see lockChanged()
     399                 :            :      */
     400                 :          0 :     bool isLocked() const { return mIsLocked; }
     401                 :            : 
     402                 :            :     /**
     403                 :            :      * Returns TRUE if the item is part of a QgsLayoutItemGroup group.
     404                 :            :      * \see parentGroup()
     405                 :            :      * \see setParentGroup()
     406                 :            :      */
     407                 :            :     bool isGroupMember() const;
     408                 :            : 
     409                 :            :     /**
     410                 :            :      * Returns the item's parent group, if the item is part of a QgsLayoutItemGroup group.
     411                 :            :      * \see isGroupMember()
     412                 :            :      * \see setParentGroup()
     413                 :            :      */
     414                 :            :     QgsLayoutItemGroup *parentGroup() const;
     415                 :            : 
     416                 :            :     /**
     417                 :            :      * Sets the item's parent \a group.
     418                 :            :      * \see isGroupMember()
     419                 :            :      * \see parentGroup()
     420                 :            :      */
     421                 :            :     void setParentGroup( QgsLayoutItemGroup *group );
     422                 :            : 
     423                 :            :     /**
     424                 :            :      * Behavior of item when exporting to layered outputs.
     425                 :            :      * \since QGIS 3.10
     426                 :            :      */
     427                 :            :     enum ExportLayerBehavior
     428                 :            :     {
     429                 :            :       CanGroupWithAnyOtherItem, //!< Item can be placed on a layer with any other item (default behavior)
     430                 :            :       CanGroupWithItemsOfSameType, //!< Item can only be placed on layers with other items of the same type, but multiple items of this type can be grouped together
     431                 :            :       MustPlaceInOwnLayer, //!< Item must be placed in its own individual layer
     432                 :            :       ItemContainsSubLayers, //!< Item contains multiple sublayers which must be individually exported
     433                 :            :     };
     434                 :            : 
     435                 :            :     /**
     436                 :            :      * Returns the behavior of this item during exporting to layered exports (e.g. SVG).
     437                 :            :      * \see numberExportLayers()
     438                 :            :      * \see exportLayerDetails()
     439                 :            :      * \since QGIS 3.10
     440                 :            :      */
     441                 :            :     virtual ExportLayerBehavior exportLayerBehavior() const;
     442                 :            : 
     443                 :            :     /**
     444                 :            :      * Returns the number of layers that this item requires for exporting during layered exports (e.g. SVG).
     445                 :            :      * Returns 0 if this item is to be placed on the same layer as the previous item,
     446                 :            :      * 1 if it should be placed on its own layer, and >1 if it requires multiple export layers.
     447                 :            :      *
     448                 :            :      * Items which require multiply layers should check QgsLayoutContext::currentExportLayer() during
     449                 :            :      * their rendering to determine which layer should be drawn.
     450                 :            :      *
     451                 :            :      * \see exportLayerBehavior()
     452                 :            :      * \see exportLayerDetails()
     453                 :            :      *
     454                 :            :      * \deprecated Use nextExportPart() and exportLayerBehavior() instead.
     455                 :            :      */
     456                 :            :     Q_DECL_DEPRECATED virtual int numberExportLayers() const SIP_DEPRECATED;
     457                 :            : 
     458                 :            :     /**
     459                 :            :      * Starts a multi-layer export operation.
     460                 :            :      *
     461                 :            :      * \see stopLayeredExport()
     462                 :            :      * \see nextExportPart()
     463                 :            :      * \since QGIS 3.10
     464                 :            :      */
     465                 :            :     virtual void startLayeredExport();
     466                 :            : 
     467                 :            :     /**
     468                 :            :      * Stops a multi-layer export operation.
     469                 :            :      *
     470                 :            :      * \see startLayeredExport()
     471                 :            :      * \see nextExportPart()
     472                 :            :      * \since QGIS 3.10
     473                 :            :      */
     474                 :            :     virtual void stopLayeredExport();
     475                 :            : 
     476                 :            :     /**
     477                 :            :      * Moves to the next export part for a multi-layered export item, during a multi-layered export.
     478                 :            :      *
     479                 :            :      * \see startLayeredExport()
     480                 :            :      * \see stopLayeredExport()
     481                 :            :      * \since QGIS 3.10
     482                 :            :      */
     483                 :            :     virtual bool nextExportPart();
     484                 :            : 
     485                 :            :     /**
     486                 :            :      * \brief Contains details of a particular export layer relating to a layout item.
     487                 :            :      * \ingroup core
     488                 :            :      * \since QGIS 3.10
     489                 :            :      */
     490                 :          0 :     struct CORE_EXPORT ExportLayerDetail
     491                 :            :     {
     492                 :            :       //! User-friendly name for the export layer
     493                 :            :       QString name;
     494                 :            : 
     495                 :            :       //! Associated map layer ID, or an empty string if this export layer is not associated with a map layer
     496                 :            :       QString mapLayerId;
     497                 :            : 
     498                 :            :       /**
     499                 :            :        * Associated composition mode if this layer is associated with a map layer
     500                 :            :        * \since QGIS 3.14
     501                 :            :        */
     502                 :          0 :       QPainter::CompositionMode compositionMode = QPainter::CompositionMode_SourceOver;
     503                 :            : 
     504                 :            :       /**
     505                 :            :        * Associated opacity, if this layer is associated with a map layer
     506                 :            :        * \since QGIS 3.14
     507                 :            :        */
     508                 :          0 :       double opacity = 1.0;
     509                 :            : 
     510                 :            :       //! Associated map theme, or an empty string if this export layer does not need to be associated with a map theme
     511                 :            :       QString mapTheme;
     512                 :            :     };
     513                 :            : 
     514                 :            :     /**
     515                 :            :      * Returns the details for the specified current export layer.
     516                 :            :      *
     517                 :            :      * Only valid between calls to startLayeredExport() and stopLayeredExport()
     518                 :            :      *
     519                 :            :      * \since QGIS 3.10
     520                 :            :      */
     521                 :            :     virtual QgsLayoutItem::ExportLayerDetail exportLayerDetails() const;
     522                 :            : 
     523                 :            :     /**
     524                 :            :      * Handles preparing a paint surface for the layout item and painting the item's
     525                 :            :      * content. Derived classes must not override this method, but instead implement
     526                 :            :      * the pure virtual method QgsLayoutItem::draw.
     527                 :            :      */
     528                 :            :     void paint( QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget ) override;
     529                 :            : 
     530                 :            :     /**
     531                 :            :      * Sets the reference \a point for positioning of the layout item. This point is also
     532                 :            :      * fixed during resizing of the item, and any size changes will be performed
     533                 :            :      * so that the position of the reference point within the layout remains unchanged.
     534                 :            :      * \see referencePoint()
     535                 :            :      */
     536                 :            :     void setReferencePoint( ReferencePoint point );
     537                 :            : 
     538                 :            :     /**
     539                 :            :      * Returns the reference point for positioning of the layout item. This point is also
     540                 :            :      * fixed during resizing of the item, and any size changes will be performed
     541                 :            :      * so that the position of the reference point within the layout remains unchanged.
     542                 :            :      * \see setReferencePoint()
     543                 :            :      */
     544                 :            :     ReferencePoint referencePoint() const { return mReferencePoint; }
     545                 :            : 
     546                 :            :     /**
     547                 :            :      * Returns the fixed size of the item, if applicable, or an empty size if item can be freely
     548                 :            :      * resized.
     549                 :            :      * \see setFixedSize()
     550                 :            :      * \see minimumSize()
     551                 :            :     */
     552                 :            :     virtual QgsLayoutSize fixedSize() const { return mFixedSize; }
     553                 :            : 
     554                 :            :     /**
     555                 :            :      * Returns the minimum allowed size of the item, if applicable, or an empty size if item can be freely
     556                 :            :      * resized.
     557                 :            :      * \see setMinimumSize()
     558                 :            :      * \see fixedSize()
     559                 :            :     */
     560                 :            :     virtual QgsLayoutSize minimumSize() const { return mMinimumSize; }
     561                 :            : 
     562                 :            :     /**
     563                 :            :      * Attempts to resize the item to a specified target \a size. Note that the final size of the
     564                 :            :      * item may not match the specified target size, as items with a fixed or minimum
     565                 :            :      * size will place restrictions on the allowed item size. Data defined item size overrides
     566                 :            :      * will also override the specified target size.
     567                 :            :      *
     568                 :            :      * If \a includesFrame is TRUE, then the size specified by \a size includes the
     569                 :            :      * item's frame.
     570                 :            :      *
     571                 :            :      * \see minimumSize()
     572                 :            :      * \see fixedSize()
     573                 :            :      * \see attemptMove()
     574                 :            :      * \see sizeWithUnits()
     575                 :            :     */
     576                 :            :     virtual void attemptResize( const QgsLayoutSize &size, bool includesFrame = false );
     577                 :            : 
     578                 :            :     /**
     579                 :            :      * Attempts to move the item to a specified \a point.
     580                 :            :      *
     581                 :            :      * If \a useReferencePoint is TRUE, this method will respect the item's
     582                 :            :      * reference point, in that the item will be moved so that its current reference
     583                 :            :      * point is placed at the specified target point.
     584                 :            :      *
     585                 :            :      * If \a useReferencePoint is FALSE, the item will be moved so that \a point
     586                 :            :      * falls at the top-left corner of the item.
     587                 :            :      *
     588                 :            :      * If \a includesFrame is TRUE, then the position specified by \a point represents the
     589                 :            :      * point at which to place the outside of the item's frame.
     590                 :            :      *
     591                 :            :      * If \a page is not left at the default -1 value, then the position specified by \a point
     592                 :            :      * refers to the relative position on the corresponding layout \a page (where a \a page
     593                 :            :      * of 0 represents the first page).
     594                 :            :      *
     595                 :            :      * Note that the final position of the item may not match the specified target position,
     596                 :            :      * as data defined item position may override the specified value.
     597                 :            :      *
     598                 :            :      * \see attemptMoveBy()
     599                 :            :      * \see attemptResize()
     600                 :            :      * \see referencePoint()
     601                 :            :      * \see positionWithUnits()
     602                 :            :     */
     603                 :            :     virtual void attemptMove( const QgsLayoutPoint &point, bool useReferencePoint = true, bool includesFrame = false, int page = -1 );
     604                 :            : 
     605                 :            :     /**
     606                 :            :      * Attempts to update the item's position and size to match the passed \a rect in layout
     607                 :            :      * coordinates.
     608                 :            :      *
     609                 :            :      * If \a includesFrame is TRUE, then the position and size specified by \a rect represents the
     610                 :            :      * position and size at for the outside of the item's frame.
     611                 :            :      *
     612                 :            :      * Note that the final position and size of the item may not match the specified target rect,
     613                 :            :      * as data defined item position and size may override the specified value.
     614                 :            :      *
     615                 :            :      * \see attemptResize()
     616                 :            :      * \see attemptMove()
     617                 :            :      * \see referencePoint()
     618                 :            :      * \see positionWithUnits()
     619                 :            :      */
     620                 :            :     void attemptSetSceneRect( const QRectF &rect, bool includesFrame = false );
     621                 :            : 
     622                 :            :     /**
     623                 :            :      * Attempts to shift the item's position by a specified \a deltaX and \a deltaY, in layout
     624                 :            :      * units.
     625                 :            :      *
     626                 :            :      * Note that the final position of the item may not match the specified offsets,
     627                 :            :      * as data defined item position and size may override the specified value.
     628                 :            :      *
     629                 :            :      * \see attemptResize()
     630                 :            :      * \see attemptMove()
     631                 :            :      * \see referencePoint()
     632                 :            :      * \see positionWithUnits()
     633                 :            :      */
     634                 :            :     void attemptMoveBy( double deltaX, double deltaY );
     635                 :            : 
     636                 :            :     /**
     637                 :            :      * Returns the item's current position, including units. The position returned
     638                 :            :      * is the position of the item's reference point, which may not necessarily be the top
     639                 :            :      * left corner of the item.
     640                 :            :      * \see attemptMove()
     641                 :            :      * \see referencePoint()
     642                 :            :      * \see sizeWithUnits()
     643                 :            :     */
     644                 :          0 :     QgsLayoutPoint positionWithUnits() const { return mItemPosition; }
     645                 :            : 
     646                 :            :     /**
     647                 :            :      * Returns the page the item is currently on, with the first page returning 0.
     648                 :            :      * \see pagePos()
     649                 :            :      */
     650                 :            :     int page() const;
     651                 :            : 
     652                 :            :     /**
     653                 :            :      * Returns the item's position (in layout units) relative to the top left corner of its current page.
     654                 :            :      * \see page()
     655                 :            :      * \see pagePositionWithUnits()
     656                 :            :      */
     657                 :            :     QPointF pagePos() const;
     658                 :            : 
     659                 :            :     /**
     660                 :            :      * Returns the item's position (in item units) relative to the top left corner of its current page.
     661                 :            :      * \see page()
     662                 :            :      * \see pagePos()
     663                 :            :      */
     664                 :            :     QgsLayoutPoint pagePositionWithUnits() const;
     665                 :            : 
     666                 :            :     /**
     667                 :            :      * Returns the item's current size, including units.
     668                 :            :      * \see attemptResize()
     669                 :            :      * \see positionWithUnits()
     670                 :            :      */
     671                 :          0 :     QgsLayoutSize sizeWithUnits() const { return mItemSize; }
     672                 :            : 
     673                 :            :     /**
     674                 :            :      * Returns the current rotation for the item, in degrees clockwise.
     675                 :            :      *
     676                 :            :      * Note that this method will always return the user-set rotation for the item,
     677                 :            :      * which may differ from the current item rotation (if data defined rotation
     678                 :            :      * settings are present). Use QGraphicsItem::rotation() to obtain the current
     679                 :            :      * item rotation.
     680                 :            :      *
     681                 :            :      * \see setItemRotation()
     682                 :            :      */
     683                 :            :     double itemRotation() const;
     684                 :            : 
     685                 :            :     /**
     686                 :            :      * Stores the item state in a DOM element.
     687                 :            :      * \param parentElement parent DOM element (e.g. 'Layout' element)
     688                 :            :      * \param document DOM document
     689                 :            :      * \param context read write context
     690                 :            :      * \see readXml()
     691                 :            :      */
     692                 :            :     bool writeXml( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context ) const;
     693                 :            : 
     694                 :            :     /**
     695                 :            :      * Sets the item state from a DOM element.
     696                 :            :      * \param itemElement is the DOM node corresponding to item (e.g. 'LayoutItem' element)
     697                 :            :      * \param document DOM document
     698                 :            :      * \param context read write context
     699                 :            :      *
     700                 :            :      * Note that item subclasses should not rely on all other items being present in the
     701                 :            :      * layout at the time this method is called. Instead, any connections and links to
     702                 :            :      * other items must be made in the finalizeRestoreFromXml() method. E.g. when restoring
     703                 :            :      * a scalebar, the connection to the linked map's signals should be implemented
     704                 :            :      * in finalizeRestoreFromXml(), not readXml().
     705                 :            :      *
     706                 :            :      * \see writeXml()
     707                 :            :      * \see finalizeRestoreFromXml()
     708                 :            :      */
     709                 :            :     bool readXml( const QDomElement &itemElement, const QDomDocument &document, const QgsReadWriteContext &context );
     710                 :            : 
     711                 :            :     /**
     712                 :            :      * Called after all pending items have been restored from XML. Items can use
     713                 :            :      * this method to run steps which must take place after all items have been restored to the layout,
     714                 :            :      * such as connecting to signals emitted by other items, which may not have existed in the layout
     715                 :            :      * at the time readXml() was called. E.g. a scalebar can use this to connect to its linked
     716                 :            :      * map item after restoration from XML.
     717                 :            :      * \see readXml()
     718                 :            :      */
     719                 :            :     virtual void finalizeRestoreFromXml();
     720                 :            : 
     721                 :            :     QgsAbstractLayoutUndoCommand *createCommand( const QString &text, int id, QUndoCommand *parent = nullptr ) override SIP_FACTORY;
     722                 :            : 
     723                 :            :     /**
     724                 :            :      * Returns TRUE if the item includes a frame.
     725                 :            :      * \see setFrameEnabled()
     726                 :            :      * \see frameStrokeWidth()
     727                 :            :      * \see frameJoinStyle()
     728                 :            :      * \see frameStrokeColor()
     729                 :            :      */
     730                 :          0 :     bool frameEnabled() const { return mFrame; }
     731                 :            : 
     732                 :            :     /**
     733                 :            :      * Sets whether this item has a frame drawn around it or not.
     734                 :            :      * \see frameEnabled()
     735                 :            :      * \see setFrameStrokeWidth()
     736                 :            :      * \see setFrameJoinStyle()
     737                 :            :      * \see setFrameStrokeColor()
     738                 :            :      */
     739                 :            :     virtual void setFrameEnabled( bool drawFrame );
     740                 :            : 
     741                 :            :     /**
     742                 :            :      * Sets the frame stroke \a color.
     743                 :            :      * \see frameStrokeColor()
     744                 :            :      * \see setFrameEnabled()
     745                 :            :      * \see setFrameJoinStyle()
     746                 :            :      * \see setFrameStrokeWidth()
     747                 :            :      */
     748                 :            :     void setFrameStrokeColor( const QColor &color );
     749                 :            : 
     750                 :            :     /**
     751                 :            :      * Returns the frame's stroke color. This is only used if frameEnabled() returns TRUE.
     752                 :            :      * \see frameEnabled()
     753                 :            :      * \see setFrameStrokeColor()
     754                 :            :      * \see frameJoinStyle()
     755                 :            :      * \see setFrameStrokeColor()
     756                 :            :      */
     757                 :          0 :     QColor frameStrokeColor() const { return mFrameColor; }
     758                 :            : 
     759                 :            :     /**
     760                 :            :      * Sets the frame stroke \a width.
     761                 :            :      * \see frameStrokeWidth()
     762                 :            :      * \see setFrameEnabled()
     763                 :            :      * \see setFrameJoinStyle()
     764                 :            :      * \see setFrameStrokeColor()
     765                 :            :      */
     766                 :            :     virtual void setFrameStrokeWidth( QgsLayoutMeasurement width );
     767                 :            : 
     768                 :            :     /**
     769                 :            :      * Returns the frame's stroke width. This is only used if frameEnabled() returns TRUE.
     770                 :            :      * \see frameEnabled()
     771                 :            :      * \see setFrameStrokeWidth()
     772                 :            :      * \see frameJoinStyle()
     773                 :            :      * \see frameStrokeColor()
     774                 :            :      */
     775                 :          0 :     QgsLayoutMeasurement frameStrokeWidth() const { return mFrameWidth; }
     776                 :            : 
     777                 :            :     /**
     778                 :            :      * Returns the join style used for drawing the item's frame.
     779                 :            :      * \see frameEnabled()
     780                 :            :      * \see setFrameJoinStyle()
     781                 :            :      * \see frameStrokeWidth()
     782                 :            :      * \see frameStrokeColor()
     783                 :            :      */
     784                 :          0 :     Qt::PenJoinStyle frameJoinStyle() const { return mFrameJoinStyle; }
     785                 :            : 
     786                 :            :     /**
     787                 :            :      * Sets the join \a style used when drawing the item's frame.
     788                 :            :      * \see setFrameEnabled()
     789                 :            :      * \see frameJoinStyle()
     790                 :            :      * \see setFrameStrokeWidth()
     791                 :            :      * \see setFrameStrokeColor()
     792                 :            :      */
     793                 :            :     void setFrameJoinStyle( Qt::PenJoinStyle style );
     794                 :            : 
     795                 :            :     /**
     796                 :            :      * Returns TRUE if the item has a background.
     797                 :            :      * \see setBackgroundEnabled()
     798                 :            :      * \see backgroundColor()
     799                 :            :      */
     800                 :          0 :     bool hasBackground() const { return mBackground; }
     801                 :            : 
     802                 :            :     /**
     803                 :            :      * Sets whether this item has a background drawn under it or not.
     804                 :            :      * \see hasBackground()
     805                 :            :      * \see setBackgroundColor()
     806                 :            :      */
     807                 :            :     void setBackgroundEnabled( bool drawBackground );
     808                 :            : 
     809                 :            :     /**
     810                 :            :      * Returns the background color for this item. This is only used if hasBackground()
     811                 :            :      * returns TRUE.
     812                 :            :      * \see setBackgroundColor()
     813                 :            :      * \see hasBackground()
     814                 :            :      */
     815                 :          0 :     QColor backgroundColor() const { return mBackgroundColor; }
     816                 :            : 
     817                 :            :     /**
     818                 :            :      * Sets the background \a color for this item.
     819                 :            :      * \see backgroundColor()
     820                 :            :      * \see setBackgroundEnabled()
     821                 :            :      */
     822                 :            :     void setBackgroundColor( const QColor &color );
     823                 :            : 
     824                 :            :     /**
     825                 :            :      * Returns the item's composition blending mode.
     826                 :            :      * \see setBlendMode()
     827                 :            :      */
     828                 :          0 :     QPainter::CompositionMode blendMode() const { return mBlendMode; }
     829                 :            : 
     830                 :            :     /**
     831                 :            :      * Sets the item's composition blending \a mode.
     832                 :            :      * \see blendMode()
     833                 :            :      */
     834                 :            :     void setBlendMode( QPainter::CompositionMode mode );
     835                 :            : 
     836                 :            :     /**
     837                 :            :      * Returns the item's opacity. This method should be used instead of
     838                 :            :      * QGraphicsItem::opacity() as any data defined overrides will be
     839                 :            :      * respected.
     840                 :            :      * \returns opacity as double between 1.0 (opaque) and 0 (transparent).
     841                 :            :      * \see setItemOpacity()
     842                 :            :      */
     843                 :          0 :     double itemOpacity() const { return mOpacity; }
     844                 :            : 
     845                 :            :     /**
     846                 :            :      * Sets the item's \a opacity. This method should be used instead of
     847                 :            :      * QGraphicsItem::setOpacity() as any data defined overrides will be
     848                 :            :      * respected.
     849                 :            :      * \param opacity double between 1.0 (opaque) and 0 (transparent).
     850                 :            :      * \see itemOpacity()
     851                 :            :      */
     852                 :            :     void setItemOpacity( double opacity );
     853                 :            : 
     854                 :            :     /**
     855                 :            :      * Returns whether the item should be excluded from layout exports and prints.
     856                 :            :      * \see setExcludeFromExports()
     857                 :            :      */
     858                 :            :     bool excludeFromExports() const;
     859                 :            : 
     860                 :            :     /**
     861                 :            :      * Sets whether the item should be excluded from layout exports and prints.
     862                 :            :      * \see excludeFromExports()
     863                 :            :      */
     864                 :            :     void setExcludeFromExports( bool exclude );
     865                 :            : 
     866                 :            :     /**
     867                 :            :      * Returns TRUE if the item contains contents with blend modes or transparency
     868                 :            :      * effects which can only be reproduced by rastering the item.
     869                 :            :      *
     870                 :            :      * Subclasses should ensure that implemented overrides of this method
     871                 :            :      * also check the base class result.
     872                 :            :      *
     873                 :            :      * \see requiresRasterization()
     874                 :            :      */
     875                 :            :     virtual bool containsAdvancedEffects() const;
     876                 :            : 
     877                 :            :     /**
     878                 :            :      * Returns TRUE if the item is drawn in such a way that forces the whole layout
     879                 :            :      * to be rasterized when exporting to vector formats.
     880                 :            :      * \see containsAdvancedEffects()
     881                 :            :      */
     882                 :            :     virtual bool requiresRasterization() const;
     883                 :            : 
     884                 :            :     /**
     885                 :            :      * Returns the estimated amount the item's frame bleeds outside the item's
     886                 :            :      * actual rectangle. For instance, if the item has a 2mm frame stroke, then
     887                 :            :      * 1mm of this frame is drawn outside the item's rect. In this case the
     888                 :            :      * return value will be 1.0.
     889                 :            :      *
     890                 :            :      * Returned values are in layout units.
     891                 :            : 
     892                 :            :      * \see rectWithFrame()
     893                 :            :      */
     894                 :            :     virtual double estimatedFrameBleed() const;
     895                 :            : 
     896                 :            :     /**
     897                 :            :      * Returns the item's rectangular bounds, including any bleed caused by the item's frame.
     898                 :            :      * The bounds are returned in the item's coordinate system (see Qt's QGraphicsItem docs for
     899                 :            :      * more details about QGraphicsItem coordinate systems). The results differ from Qt's rect()
     900                 :            :      * function, as rect() makes no allowances for the portion of outlines which are drawn
     901                 :            :      * outside of the item.
     902                 :            :      *
     903                 :            :      * \see estimatedFrameBleed()
     904                 :            :      */
     905                 :            :     virtual QRectF rectWithFrame() const;
     906                 :            : 
     907                 :            :     /**
     908                 :            :      * Moves the content of the item, by a specified \a dx and \a dy in layout units.
     909                 :            :      * The default implementation has no effect.
     910                 :            :      * \see setMoveContentPreviewOffset()
     911                 :            :      * \see zoomContent()
     912                 :            :      */
     913                 :            :     virtual void moveContent( double dx, double dy );
     914                 :            : 
     915                 :            :     /**
     916                 :            :      * Sets temporary offset for the item, by a specified \a dx and \a dy in layout units.
     917                 :            :      * This is useful for live updates when moving item content in a QgsLayoutView.
     918                 :            :      * The default implementation has no effect.
     919                 :            :      * \see moveContent()
     920                 :            :      */
     921                 :            :     virtual void setMoveContentPreviewOffset( double dx, double dy );
     922                 :            : 
     923                 :            :     /**
     924                 :            :      * Zooms content of item. Does nothing by default.
     925                 :            :      * \param factor zoom factor, where > 1 results in a zoom in and < 1 results in a zoom out
     926                 :            :      * \param point item point for zoom center
     927                 :            :      * \see moveContent()
     928                 :            :      */
     929                 :            :     virtual void zoomContent( double factor, QPointF point );
     930                 :            : 
     931                 :            :     /**
     932                 :            :      * Starts new undo command for this item.
     933                 :            :      * The \a commandText should be a capitalized, imperative tense description (e.g. "Add Map Item").
     934                 :            :      * If specified, multiple consecutive commands for this item with the same \a command will
     935                 :            :      * be collapsed into a single undo command in the layout history.
     936                 :            :      * \see endCommand()
     937                 :            :      * \see cancelCommand()
     938                 :            :     */
     939                 :            :     void beginCommand( const QString &commandText, UndoCommand command = UndoNone );
     940                 :            : 
     941                 :            :     /**
     942                 :            :      * Completes the current item command and push it onto the layout's undo stack.
     943                 :            :      * \see beginCommand()
     944                 :            :      * \see cancelCommand()
     945                 :            :      */
     946                 :            :     void endCommand();
     947                 :            : 
     948                 :            :     /**
     949                 :            :      * Cancels the current item command and discards it.
     950                 :            :      * \see beginCommand()
     951                 :            :      * \see endCommand()
     952                 :            :      */
     953                 :            :     void cancelCommand();
     954                 :            : 
     955                 :            :     /**
     956                 :            :      * Returns whether the item should be drawn in the current context.
     957                 :            :      */
     958                 :            :     bool shouldDrawItem() const;
     959                 :            : 
     960                 :            :     QgsExpressionContext createExpressionContext() const override;
     961                 :            : 
     962                 :            :     /**
     963                 :            :      * Accepts the specified style entity \a visitor, causing it to visit all style entities associated
     964                 :            :      * with the layout item.
     965                 :            :      *
     966                 :            :      * Returns TRUE if the visitor should continue visiting other objects, or FALSE if visiting
     967                 :            :      * should be canceled.
     968                 :            :      *
     969                 :            :      * \since QGIS 3.10
     970                 :            :      */
     971                 :            :     virtual bool accept( QgsStyleEntityVisitorInterface *visitor ) const;
     972                 :            : 
     973                 :            :     /**
     974                 :            :      * Returns the clipping path generated by this item, in layout coordinates.
     975                 :            :      *
     976                 :            :      * \note Not all items can function as clipping paths. The FlagProvidesClipPath flag
     977                 :            :      * indicates if a particular item can function as a clipping path provider.
     978                 :            :      *
     979                 :            :      * \since QGIS 3.16
     980                 :            :      */
     981                 :            :     virtual QgsGeometry clipPath() const;
     982                 :            : 
     983                 :            :   public slots:
     984                 :            : 
     985                 :            :     /**
     986                 :            :      * Refreshes the item, causing a recalculation of any property overrides and
     987                 :            :      * recalculation of its position and size.
     988                 :            :      */
     989                 :            :     void refresh() override;
     990                 :            : 
     991                 :            :     /**
     992                 :            :      * Forces a deferred update of any cached image the item uses.
     993                 :            :      */
     994                 :            :     virtual void invalidateCache();
     995                 :            : 
     996                 :            :     /**
     997                 :            :      * Triggers a redraw (update) of the item.
     998                 :            :      */
     999                 :            :     virtual void redraw();
    1000                 :            : 
    1001                 :            :     /**
    1002                 :            :      * Refreshes a data defined \a property for the item by reevaluating the property's value
    1003                 :            :      * and redrawing the item with this new value. If \a property is set to
    1004                 :            :      * QgsLayoutObject::AllProperties then all data defined properties for the item will be
    1005                 :            :      * refreshed.
    1006                 :            :     */
    1007                 :            :     virtual void refreshDataDefinedProperty( QgsLayoutObject::DataDefinedProperty property = QgsLayoutObject::AllProperties );
    1008                 :            : 
    1009                 :            :     /**
    1010                 :            :      * Sets the layout item's \a rotation, in degrees clockwise.
    1011                 :            :      *
    1012                 :            :      * If \a adjustPosition is TRUE, then this rotation occurs around the center of the item.
    1013                 :            :      * If \a adjustPosition is FALSE, rotation occurs around the item origin.
    1014                 :            :      *
    1015                 :            :      * \see itemRotation()
    1016                 :            :      * \see rotateItem()
    1017                 :            :     */
    1018                 :            :     virtual void setItemRotation( double rotation, bool adjustPosition = true );
    1019                 :            : 
    1020                 :            :     /**
    1021                 :            :      * Rotates the item by a specified \a angle in degrees clockwise around a specified reference point.
    1022                 :            :      * \see setItemRotation()
    1023                 :            :      * \see itemRotation()
    1024                 :            :     */
    1025                 :            :     virtual void rotateItem( double angle, QPointF transformOrigin );
    1026                 :            : 
    1027                 :            :   signals:
    1028                 :            : 
    1029                 :            :     /**
    1030                 :            :      * Emitted if the item's frame style changes.
    1031                 :            :      */
    1032                 :            :     void frameChanged();
    1033                 :            : 
    1034                 :            :     /**
    1035                 :            :      * Emitted if the item's lock status changes.
    1036                 :            :      * \see isLocked()
    1037                 :            :      * \see setLocked()
    1038                 :            :      */
    1039                 :            :     void lockChanged();
    1040                 :            : 
    1041                 :            :     /**
    1042                 :            :      * Emitted on item rotation change.
    1043                 :            :      */
    1044                 :            :     void rotationChanged( double newRotation );
    1045                 :            : 
    1046                 :            :     /**
    1047                 :            :      * Emitted when the item's size or position changes.
    1048                 :            :      */
    1049                 :            :     void sizePositionChanged();
    1050                 :            : 
    1051                 :            :     /**
    1052                 :            :      * Emitted whenever the number of background tasks an item is executing changes.
    1053                 :            :      *
    1054                 :            :      * \since QGIS 3.10
    1055                 :            :      */
    1056                 :            :     void backgroundTaskCountChanged( int count );
    1057                 :            : 
    1058                 :            :     /**
    1059                 :            :      * Emitted when the item's clipping path has changed.
    1060                 :            :      *
    1061                 :            :      * \see clipPath()
    1062                 :            :      *
    1063                 :            :      * \since QGIS 3.16
    1064                 :            :      */
    1065                 :            :     void clipPathChanged();
    1066                 :            : 
    1067                 :            :   protected:
    1068                 :            : 
    1069                 :            :     /**
    1070                 :            :      * Draws a debugging rectangle of the item's current bounds within the specified
    1071                 :            :      * painter.
    1072                 :            :      * \param painter destination QPainter
    1073                 :            :      */
    1074                 :            :     virtual void drawDebugRect( QPainter *painter );
    1075                 :            : 
    1076                 :            :     /**
    1077                 :            :      * Draws the item's contents using the specified item render \a context.
    1078                 :            :      *
    1079                 :            :      * Note that the context's painter has been scaled so that painter units are pixels.
    1080                 :            :      * Use the QgsRenderContext methods to convert from millimeters or other units to the painter's units.
    1081                 :            :      */
    1082                 :            :     virtual void draw( QgsLayoutItemRenderContext &context ) = 0;
    1083                 :            : 
    1084                 :            :     /**
    1085                 :            :      * Returns the path to use when drawing the item's frame or background.
    1086                 :            :      *
    1087                 :            :      * \see drawFrame()
    1088                 :            :      * \see drawBackground()
    1089                 :            :      * \since QGIS 3.16
    1090                 :            :      */
    1091                 :            :     virtual QPainterPath framePath() const;
    1092                 :            : 
    1093                 :            :     /**
    1094                 :            :      * Draws the frame around the item.
    1095                 :            :      *
    1096                 :            :      * \see framePath()
    1097                 :            :      */
    1098                 :            :     virtual void drawFrame( QgsRenderContext &context );
    1099                 :            : 
    1100                 :            :     /**
    1101                 :            :      * Draws the background for the item.
    1102                 :            :      *
    1103                 :            :      * \see framePath()
    1104                 :            :      */
    1105                 :            :     virtual void drawBackground( QgsRenderContext &context );
    1106                 :            : 
    1107                 :            :     /**
    1108                 :            :      * Sets a fixed \a size for the layout item, which prevents it from being freely
    1109                 :            :      * resized. Set an empty size if item can be freely resized.
    1110                 :            :      * \see fixedSize()
    1111                 :            :      * \see setMinimumSize()
    1112                 :            :     */
    1113                 :            :     virtual void setFixedSize( const QgsLayoutSize &size );
    1114                 :            : 
    1115                 :            :     /**
    1116                 :            :      * Sets the minimum allowed \a size for the layout item. Set an empty size if item can be freely
    1117                 :            :      * resized.
    1118                 :            :      * \see minimumSize()
    1119                 :            :      * \see setFixedSize()
    1120                 :            :     */
    1121                 :            :     virtual void setMinimumSize( const QgsLayoutSize &size );
    1122                 :            : 
    1123                 :            :     /**
    1124                 :            :      * Applies any item-specific size constraint handling to a given \a targetSize in layout units.
    1125                 :            :      * Subclasses can override this method if they need to apply advanced logic regarding item
    1126                 :            :      * sizes, which cannot be covered by setFixedSize() or setMinimumSize().
    1127                 :            :      * Item size constraints are applied after fixed, minimum and data defined size constraints.
    1128                 :            :      * \see setFixedSize()
    1129                 :            :      * \see setMinimumSize()
    1130                 :            :      */
    1131                 :            :     virtual QSizeF applyItemSizeConstraint( QSizeF targetSize );
    1132                 :            : 
    1133                 :            :     /**
    1134                 :            :      * Refreshes an item's size by rechecking it against any possible item fixed
    1135                 :            :      * or minimum sizes.
    1136                 :            :      * \see setFixedSize()
    1137                 :            :      * \see setMinimumSize()
    1138                 :            :      * \see refreshItemPosition()
    1139                 :            :      */
    1140                 :            :     void refreshItemSize();
    1141                 :            : 
    1142                 :            :     /**
    1143                 :            :      * Refreshes an item's position by rechecking it against any possible overrides
    1144                 :            :      * such as data defined positioning.
    1145                 :            :      * \see refreshItemSize()
    1146                 :            :     */
    1147                 :            :     void refreshItemPosition();
    1148                 :            : 
    1149                 :            :     /**
    1150                 :            :      * Refreshes an item's rotation by rechecking it against any possible overrides
    1151                 :            :      * such as data defined rotation.
    1152                 :            :      *
    1153                 :            :      * The optional \a origin point specifies the origin (in item coordinates)
    1154                 :            :      * around which the rotation should be applied.
    1155                 :            :      *
    1156                 :            :      * \see refreshItemSize()
    1157                 :            :      * \see refreshItemPosition()
    1158                 :            :      */
    1159                 :            :     void refreshItemRotation( QPointF *origin = nullptr );
    1160                 :            : 
    1161                 :            :     /**
    1162                 :            :      * Refresh item's opacity, considering data defined opacity.
    1163                 :            :       * If \a updateItem is set to FALSE the item will not be automatically
    1164                 :            :       * updated after the opacity is set and a later call to update() must be made.
    1165                 :            :      */
    1166                 :            :     void refreshOpacity( bool updateItem = true );
    1167                 :            : 
    1168                 :            :     /**
    1169                 :            :      * Refresh item's frame, considering data defined colors and frame size.
    1170                 :            :      * If \a updateItem is set to FALSE, the item will not be automatically updated
    1171                 :            :      * after the frame is set and a later call to update() must be made.
    1172                 :            :      */
    1173                 :            :     void refreshFrame( bool updateItem = true );
    1174                 :            : 
    1175                 :            :     /**
    1176                 :            :      * Refresh item's background color, considering data defined colors.
    1177                 :            :      * If \a updateItem is set to FALSE, the item will not be automatically updated
    1178                 :            :      * after the frame color is set and a later call to update() must be made.
    1179                 :            :      */
    1180                 :            :     void refreshBackgroundColor( bool updateItem = true );
    1181                 :            : 
    1182                 :            :     /**
    1183                 :            :      * Refresh item's blend mode, considering data defined blend mode.
    1184                 :            :      */
    1185                 :            :     void refreshBlendMode();
    1186                 :            : 
    1187                 :            :     /**
    1188                 :            :      * Adjusts the specified \a point at which a \a reference position of the item
    1189                 :            :      * sits and returns the top left corner of the item, if reference point were placed at the specified position.
    1190                 :            :      */
    1191                 :            :     QPointF adjustPointForReferencePosition( QPointF point, QSizeF size, ReferencePoint reference ) const;
    1192                 :            : 
    1193                 :            :     /**
    1194                 :            :      * Returns the current position (in layout units) of a \a reference point for the item.
    1195                 :            :     */
    1196                 :            :     QPointF positionAtReferencePoint( ReferencePoint reference ) const;
    1197                 :            : 
    1198                 :            :     /**
    1199                 :            :      * Returns the position for the reference point of the item, if the top-left of the item
    1200                 :            :      * was placed at the specified \a point.
    1201                 :            :     */
    1202                 :            :     QgsLayoutPoint topLeftToReferencePoint( const QgsLayoutPoint &point ) const;
    1203                 :            : 
    1204                 :            :     /**
    1205                 :            :      * Stores item state within an XML DOM element.
    1206                 :            :      * \param element is the DOM element to store the item's properties in
    1207                 :            :      * \param document DOM document
    1208                 :            :      * \param context read write context
    1209                 :            :      * \see writeXml()
    1210                 :            :      * \see readPropertiesFromElement()
    1211                 :            :      */
    1212                 :            :     virtual bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;
    1213                 :            : 
    1214                 :            :     /**
    1215                 :            :      * Sets item state from a DOM element.
    1216                 :            :      * \param element is the DOM element for the item
    1217                 :            :      * \param document DOM document
    1218                 :            :      * \param context read write context
    1219                 :            :      *
    1220                 :            :      * Note that item subclasses should not rely on all other items being present in the
    1221                 :            :      * layout at the time this method is called. Instead, any connections and links to
    1222                 :            :      * other items must be made in the finalizeRestoreFromXml() method. E.g. when restoring
    1223                 :            :      * a scalebar, the connection to the linked map's signals should be implemented
    1224                 :            :      * in finalizeRestoreFromXml(), not readPropertiesFromElement().
    1225                 :            :      *
    1226                 :            :      * \see writePropertiesToElement()
    1227                 :            :      * \see readXml()
    1228                 :            :      */
    1229                 :            :     virtual bool readPropertiesFromElement( const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context );
    1230                 :            : 
    1231                 :            :     /**
    1232                 :            :      * Applies any present data defined size overrides to the specified layout \a size.
    1233                 :            :      */
    1234                 :            :     QgsLayoutSize applyDataDefinedSize( const QgsLayoutSize &size );
    1235                 :            : 
    1236                 :            :   private:
    1237                 :            : 
    1238                 :            :     // true if layout manages the z value for this item
    1239                 :            :     bool mLayoutManagesZValue = false;
    1240                 :            : 
    1241                 :            :     //! id (not necessarily unique)
    1242                 :            :     QString mId;
    1243                 :            : 
    1244                 :            :     //! Unique id
    1245                 :            :     QString mUuid;
    1246                 :            : 
    1247                 :            :     //! Original uuid from template
    1248                 :            :     QString mTemplateUuid;
    1249                 :            : 
    1250                 :            :     //! Parent group unique id
    1251                 :            :     QString mParentGroupUuid;
    1252                 :            : 
    1253                 :            :     ReferencePoint mReferencePoint = UpperLeft;
    1254                 :            :     QgsLayoutSize mFixedSize;
    1255                 :            :     QgsLayoutSize mMinimumSize;
    1256                 :            : 
    1257                 :            :     QgsLayoutSize mItemSize;
    1258                 :            :     QgsLayoutPoint mItemPosition;
    1259                 :            :     double mItemRotation = 0.0;
    1260                 :            : 
    1261                 :            :     //! Whether item should be excluded in exports
    1262                 :            :     bool mExcludeFromExports = false;
    1263                 :            : 
    1264                 :            :     /**
    1265                 :            :      * Temporary evaluated item exclusion. Data defined properties may mean
    1266                 :            :      * this value differs from mExcludeFromExports.
    1267                 :            :      */
    1268                 :            :     bool mEvaluatedExcludeFromExports = false;
    1269                 :            : 
    1270                 :            :     //! Composition blend mode for item
    1271                 :            :     QPainter::CompositionMode mBlendMode = QPainter::CompositionMode_SourceOver;
    1272                 :            :     std::unique_ptr< QgsLayoutEffect > mEffect;
    1273                 :            : 
    1274                 :            :     //! Item opacity, between 0 and 1
    1275                 :            :     double mOpacity = 1.0;
    1276                 :            :     double mEvaluatedOpacity = 1.0;
    1277                 :            : 
    1278                 :            :     QImage mItemCachedImage;
    1279                 :            :     double mItemCacheDpi = -1;
    1280                 :            : 
    1281                 :            :     bool mIsLocked = false;
    1282                 :            : 
    1283                 :            :     //! True if item has a frame
    1284                 :            :     bool mFrame = false;
    1285                 :            :     //! Item frame color
    1286                 :            :     QColor mFrameColor = QColor( 0, 0, 0 );
    1287                 :            :     //! Item frame width
    1288                 :            :     QgsLayoutMeasurement mFrameWidth = QgsLayoutMeasurement( 0.3, QgsUnitTypes::LayoutMillimeters );
    1289                 :            :     //! Frame join style
    1290                 :            :     Qt::PenJoinStyle mFrameJoinStyle = Qt::MiterJoin;
    1291                 :            : 
    1292                 :            :     //! True if item has a background
    1293                 :            :     bool mBackground = true;
    1294                 :            :     //! Background color
    1295                 :            :     QColor mBackgroundColor = QColor( 255, 255, 255 );
    1296                 :            : 
    1297                 :            :     bool mBlockUndoCommands = false;
    1298                 :            : 
    1299                 :            :     void initConnectionsToLayout();
    1300                 :            : 
    1301                 :            :     //! Prepares a painter by setting rendering flags
    1302                 :            :     void preparePainter( QPainter *painter );
    1303                 :            :     bool shouldDrawAntialiased() const;
    1304                 :            :     bool shouldDrawDebugRect() const;
    1305                 :            :     QSizeF applyMinimumSize( QSizeF targetSize );
    1306                 :            :     QSizeF applyFixedSize( QSizeF targetSize );
    1307                 :            :     QgsLayoutPoint applyDataDefinedPosition( const QgsLayoutPoint &position );
    1308                 :            : 
    1309                 :            :     double applyDataDefinedRotation( double rotation );
    1310                 :            :     void updateStoredItemPosition();
    1311                 :            :     QPointF itemPositionAtReferencePoint( ReferencePoint reference, QSizeF size ) const;
    1312                 :            :     void setScenePos( QPointF destinationPos );
    1313                 :            :     bool shouldBlockUndoCommands() const;
    1314                 :            : 
    1315                 :            :     void applyDataDefinedOrientation( double &width, double &height, const QgsExpressionContext &context );
    1316                 :            : 
    1317                 :            :     friend class TestQgsLayoutItem;
    1318                 :            :     friend class TestQgsLayoutView;
    1319                 :            :     friend class QgsLayout;
    1320                 :            :     friend class QgsLayoutItemGroup;
    1321                 :            :     friend class QgsCompositionConverter;
    1322                 :            : };
    1323                 :            : 
    1324                 :            : Q_DECLARE_OPERATORS_FOR_FLAGS( QgsLayoutItem::Flags )
    1325                 :            : 
    1326                 :            : #endif //QGSLAYOUTITEM_H
    1327                 :            : 
    1328                 :            : 
    1329                 :            : 

Generated by: LCOV version 1.14