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 : :
|