35#include <QStyleOptionGraphicsItem>
38#define CACHE_SIZE_LIMIT 5000
41 : mRenderContext( context )
42 , mViewScaleFactor( viewScaleFactor )
50 , QGraphicsRectItem( nullptr )
51 , mUuid( QUuid::createUuid().toString() )
56 setFlags( flags() | QGraphicsItem::ItemUsesExtendedStyleOption | QGraphicsItem::ItemIsSelectable );
58 setCacheMode( QGraphicsItem::DeviceCoordinateCache );
62 mItemPosition =
QgsLayoutPoint( scenePos().x(), scenePos().y(), initialUnits );
63 mItemSize =
QgsLayoutSize( rect().width(), rect().height(), initialUnits );
69 initConnectionsToLayout();
74 mLayoutManagesZValue =
true;
75 mLayout->itemsModel()->addItemAtTop(
this );
79 mLayoutManagesZValue =
false;
89 mEffect->setEnabled( flags & QgsLayoutRenderContext::FlagUseAdvancedEffects );
92 setGraphicsEffect( mEffect.get() );
102 if (
mLayout && mLayoutManagesZValue )
104 mLayout->itemsModel()->removeItem(
this );
111 if ( !
id().isEmpty() )
119 return tr(
"<%1>" ).arg( metadata->visibleName() );
122 return tr(
"<item>" );
137 return QgsLayoutItem::Flags();
147 if ( !shouldBlockUndoCommands() )
148 mLayout->undoStack()->beginCommand(
this, tr(
"Change Item ID" ) );
152 if ( !shouldBlockUndoCommands() )
153 mLayout->undoStack()->endCommand();
160 mLayout->itemsModel()->updateItemDisplayName(
this );
168 QGraphicsRectItem::setSelected( selected );
172 mLayout->itemsModel()->updateItemSelectStatus(
this );
178 if ( visible == isVisible() )
184 std::unique_ptr< QgsAbstractLayoutUndoCommand > command;
185 if ( !shouldBlockUndoCommands() )
187 command.reset(
createCommand( visible ? tr(
"Show Item" ) : tr(
"Hide Item" ), 0 ) );
188 command->saveBeforeState();
191 QGraphicsItem::setVisible( visible );
195 command->saveAfterState();
196 mLayout->undoStack()->push( command.release() );
202 mLayout->itemsModel()->updateItemVisibility(
this );
208 if (
locked == mIsLocked )
213 if ( !shouldBlockUndoCommands() )
214 mLayout->undoStack()->beginCommand(
this,
locked ? tr(
"Lock Item" ) : tr(
"Unlock Item" ) );
218 if ( !shouldBlockUndoCommands() )
219 mLayout->undoStack()->endCommand();
224 mLayout->itemsModel()->updateItemLockStatus(
this );
233 return !mParentGroupUuid.isEmpty() &&
mLayout &&
static_cast< bool >(
mLayout->itemByUuid( mParentGroupUuid ) );
238 if ( !
mLayout || mParentGroupUuid.isEmpty() )
241 return qobject_cast< QgsLayoutItemGroup * >(
mLayout->itemByUuid( mParentGroupUuid ) );
247 mParentGroupUuid.clear();
249 mParentGroupUuid = group->
uuid();
250 setFlag( QGraphicsItem::ItemIsSelectable, !
static_cast< bool>( group ) );
276 if ( !
mLayout ||
mLayout->renderContext().currentExportLayer() == -1 )
282 return mLayout->renderContext().currentExportLayer() < layers;
300 if ( shouldDrawDebugRect() )
306 const bool previewRender = !
mLayout ||
mLayout->renderContext().isPreviewRender();
308 const bool useImageCache =
false;
311 if ( useImageCache || forceRasterOutput )
313 double widthInPixels = 0;
314 double heightInPixels = 0;
323 const double layoutUnitsToPixels =
mLayout ?
mLayout->convertFromLayoutUnits( 1, Qgis::LayoutUnit::Pixels ).length() : destinationDpi / 25.4;
324 widthInPixels = boundingRect().width() * layoutUnitsToPixels;
325 heightInPixels = boundingRect().height() * layoutUnitsToPixels;
332 if ( widthInPixels > heightInPixels )
336 heightInPixels /= scale;
342 widthInPixels /= scale;
344 destinationDpi = destinationDpi / scale;
347 if ( previewRender && !mItemCachedImage.isNull() &&
qgsDoubleNear( mItemCacheDpi, destinationDpi ) )
352 preparePainter( painter );
353 const double cacheScale = destinationDpi / mItemCacheDpi;
355 painter->drawImage( boundingRect().x() * context.
scaleFactor() / cacheScale,
356 boundingRect().y() * context.
scaleFactor() / cacheScale, mItemCachedImage );
361 QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
362 image.fill( Qt::transparent );
363 image.setDotsPerMeterX( 1000 * destinationDpi * 25.4 );
364 image.setDotsPerMeterY( 1000 * destinationDpi * 25.4 );
365 QPainter p( &image );
367 preparePainter( &p );
379 draw( itemRenderContext );
390 painter->drawImage( boundingRect().x() * context.
scaleFactor(),
391 boundingRect().y() * context.
scaleFactor(), image );
395 mItemCacheDpi = destinationDpi;
396 mItemCachedImage = image;
404 preparePainter( painter );
414 draw( itemRenderContext );
423 if ( point == mReferencePoint )
428 mReferencePoint = point;
431 updateStoredItemPosition();
455 const QSizeF targetSizeLayoutUnits =
mLayout->convertToLayoutUnits( evaluatedSize );
456 QSizeF actualSizeLayoutUnits = applyMinimumSize( targetSizeLayoutUnits );
457 actualSizeLayoutUnits = applyFixedSize( actualSizeLayoutUnits );
460 if ( actualSizeLayoutUnits == rect().size() )
466 mItemSize = actualSizeTargetUnits;
468 setRect( 0, 0, actualSizeLayoutUnits.width(), actualSizeLayoutUnits.height() );
485 point =
mLayout->pageCollection()->pagePositionToAbsolute(
page, p );
492 point.
setX( point.
x() + bleed );
493 point.
setY( point.
y() + bleed );
497 if ( !useReferencePoint )
502 evaluatedPoint = applyDataDefinedPosition( evaluatedPoint );
503 const QPointF evaluatedPointLayoutUnits =
mLayout->convertToLayoutUnits( evaluatedPoint );
505 if ( topLeftPointLayoutUnits == scenePos() && point.
units() == mItemPosition.
units() )
512 mItemPosition = referencePointTargetUnits;
513 setScenePos( topLeftPointLayoutUnits );
519 const QPointF newPos = rect.topLeft();
521 blockSignals(
true );
529 blockSignals(
false );
537 moveBy( deltaX, deltaY );
543 itemPos.
setX( itemPos.
x() + deltaPos.
x() );
544 itemPos.
setY( itemPos.
y() + deltaPos.
y() );
553 return mLayout->pageCollection()->pageNumberForPoint( pos() );
568 p.ry() -= pageItem->pos().y();
578 return mLayout->convertFromLayoutUnits( p, mItemPosition.
units() );
581void QgsLayoutItem::setScenePos(
const QPointF destinationPos )
586 if (
auto *lParentItem = parentItem() )
587 setPos( pos() + ( destinationPos - scenePos() ) + lParentItem->scenePos() );
589 setPos( pos() + ( destinationPos - scenePos() ) );
592bool QgsLayoutItem::shouldBlockUndoCommands()
const
609 return !mEvaluatedExcludeFromExports;
614 return mItemRotation;
619 QDomElement element = doc.createElement( QStringLiteral(
"LayoutItem" ) );
620 element.setAttribute( QStringLiteral(
"type" ), QString::number(
type() ) );
622 element.setAttribute( QStringLiteral(
"uuid" ), mUuid );
623 element.setAttribute( QStringLiteral(
"templateUuid" ), mUuid );
624 element.setAttribute( QStringLiteral(
"id" ), mId );
625 element.setAttribute( QStringLiteral(
"referencePoint" ), QString::number(
static_cast< int >( mReferencePoint ) ) );
626 element.setAttribute( QStringLiteral(
"position" ), mItemPosition.
encodePoint() );
628 element.setAttribute( QStringLiteral(
"size" ), mItemSize.
encodeSize() );
629 element.setAttribute( QStringLiteral(
"itemRotation" ), QString::number( mItemRotation ) );
630 element.setAttribute( QStringLiteral(
"groupUuid" ), mParentGroupUuid );
632 element.setAttribute( QStringLiteral(
"zValue" ), QString::number( zValue() ) );
633 element.setAttribute( QStringLiteral(
"visibility" ), isVisible() );
637 element.setAttribute( QStringLiteral(
"positionLock" ), QStringLiteral(
"true" ) );
641 element.setAttribute( QStringLiteral(
"positionLock" ), QStringLiteral(
"false" ) );
647 element.setAttribute( QStringLiteral(
"frame" ), QStringLiteral(
"true" ) );
651 element.setAttribute( QStringLiteral(
"frame" ), QStringLiteral(
"false" ) );
657 element.setAttribute( QStringLiteral(
"background" ), QStringLiteral(
"true" ) );
661 element.setAttribute( QStringLiteral(
"background" ), QStringLiteral(
"false" ) );
665 QDomElement frameColorElem = doc.createElement( QStringLiteral(
"FrameColor" ) );
666 frameColorElem.setAttribute( QStringLiteral(
"red" ), QString::number( mFrameColor.red() ) );
667 frameColorElem.setAttribute( QStringLiteral(
"green" ), QString::number( mFrameColor.green() ) );
668 frameColorElem.setAttribute( QStringLiteral(
"blue" ), QString::number( mFrameColor.blue() ) );
669 frameColorElem.setAttribute( QStringLiteral(
"alpha" ), QString::number( mFrameColor.alpha() ) );
670 element.appendChild( frameColorElem );
671 element.setAttribute( QStringLiteral(
"outlineWidthM" ), mFrameWidth.
encodeMeasurement() );
675 QDomElement bgColorElem = doc.createElement( QStringLiteral(
"BackgroundColor" ) );
676 bgColorElem.setAttribute( QStringLiteral(
"red" ), QString::number( mBackgroundColor.red() ) );
677 bgColorElem.setAttribute( QStringLiteral(
"green" ), QString::number( mBackgroundColor.green() ) );
678 bgColorElem.setAttribute( QStringLiteral(
"blue" ), QString::number( mBackgroundColor.blue() ) );
679 bgColorElem.setAttribute( QStringLiteral(
"alpha" ), QString::number( mBackgroundColor.alpha() ) );
680 element.appendChild( bgColorElem );
686 element.setAttribute( QStringLiteral(
"opacity" ), QString::number( mOpacity ) );
688 element.setAttribute( QStringLiteral(
"excludeFromExports" ), mExcludeFromExports );
693 parentElement.appendChild( element );
700 if ( element.nodeName() != QLatin1String(
"LayoutItem" ) )
707 mBlockUndoCommands =
true;
708 mUuid = element.attribute( QStringLiteral(
"uuid" ), QUuid::createUuid().toString() );
709 setId( element.attribute( QStringLiteral(
"id" ) ) );
710 mReferencePoint =
static_cast< ReferencePoint >( element.attribute( QStringLiteral(
"referencePoint" ) ).toInt() );
711 setItemRotation( element.attribute( QStringLiteral(
"itemRotation" ), QStringLiteral(
"0" ) ).toDouble() );
715 mParentGroupUuid = element.attribute( QStringLiteral(
"groupUuid" ) );
716 if ( !mParentGroupUuid.isEmpty() )
720 group->addItem(
this );
723 mTemplateUuid = element.attribute( QStringLiteral(
"templateUuid" ) );
726 const QString positionLock = element.attribute( QStringLiteral(
"positionLock" ) );
727 if ( positionLock.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
736 setVisibility( element.attribute( QStringLiteral(
"visibility" ), QStringLiteral(
"1" ) ) != QLatin1String(
"0" ) );
737 setZValue( element.attribute( QStringLiteral(
"zValue" ) ).toDouble() );
740 const QString frame = element.attribute( QStringLiteral(
"frame" ) );
741 if ( frame.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
751 const QString background = element.attribute( QStringLiteral(
"background" ) );
752 if ( background.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
764 const QDomNodeList frameColorList = element.elementsByTagName( QStringLiteral(
"FrameColor" ) );
765 if ( !frameColorList.isEmpty() )
767 const QDomElement frameColorElem = frameColorList.at( 0 ).toElement();
769 bool greenOk =
false;
771 bool alphaOk =
false;
772 int penRed, penGreen, penBlue, penAlpha;
774 penRed = frameColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
775 penGreen = frameColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
776 penBlue = frameColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
777 penAlpha = frameColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
779 if ( redOk && greenOk && blueOk && alphaOk )
781 mFrameColor = QColor( penRed, penGreen, penBlue, penAlpha );
787 const QDomNodeList bgColorList = element.elementsByTagName( QStringLiteral(
"BackgroundColor" ) );
788 if ( !bgColorList.isEmpty() )
790 const QDomElement bgColorElem = bgColorList.at( 0 ).toElement();
791 bool redOk, greenOk, blueOk, alphaOk;
792 int bgRed, bgGreen, bgBlue, bgAlpha;
793 bgRed = bgColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
794 bgGreen = bgColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
795 bgBlue = bgColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
796 bgAlpha = bgColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
797 if ( redOk && greenOk && blueOk && alphaOk )
799 mBackgroundColor = QColor( bgRed, bgGreen, bgBlue, bgAlpha );
800 setBrush( QBrush( mBackgroundColor, Qt::SolidPattern ) );
810 if ( element.hasAttribute( QStringLiteral(
"opacity" ) ) )
812 setItemOpacity( element.attribute( QStringLiteral(
"opacity" ), QStringLiteral(
"1" ) ).toDouble() );
816 setItemOpacity( 1.0 - element.attribute( QStringLiteral(
"transparency" ), QStringLiteral(
"0" ) ).toInt() / 100.0 );
819 mExcludeFromExports = element.attribute( QStringLiteral(
"excludeFromExports" ), QStringLiteral(
"0" ) ).toInt();
820 mEvaluatedExcludeFromExports = mExcludeFromExports;
824 mBlockUndoCommands =
false;
837 return new QgsLayoutItemUndoCommand(
this, text,
id, parent );
855 if ( mFrameColor == color )
868 if ( mFrameWidth == width )
880 if ( mFrameJoinStyle == style )
885 mFrameJoinStyle = style;
887 QPen itemPen = pen();
888 itemPen.setJoinStyle( mFrameJoinStyle );
901 mBackgroundColor = color;
917 if ( !mItemCachedImage.isNull() )
923 return mExcludeFromExports;
928 mExcludeFromExports = exclude;
934 return itemFlags() & Flag::FlagOverridesPaint ? false : mEvaluatedOpacity < 1.0;
940 blendMode() != QPainter::CompositionMode_SourceOver;
950 return pen().widthF() / 2.0;
956 return rect().adjusted( -frameBleed, -frameBleed, frameBleed, frameBleed );
979 mLayout->undoStack()->beginCommand(
this, commandText, command );
985 mLayout->undoStack()->endCommand();
991 mLayout->undoStack()->cancelCommand();
1007void QgsLayoutItem::applyDataDefinedOrientation(
double &width,
double &height,
const QgsExpressionContext &context )
1011 if ( ok && !orientationString.isEmpty() )
1016 double heightD = 0.0, widthD = 0.0;
1017 switch ( orientation )
1021 heightD = std::max( height, width );
1022 widthD = std::min( height, width );
1027 heightD = std::min( height, width );
1028 widthD = std::max( height, width );
1057 double evaluatedWidth = size.
width();
1058 double evaluatedHeight = size.
height();
1062 evaluatedWidth = convertedSize.
width();
1063 evaluatedHeight = convertedSize.
height();
1071 applyDataDefinedOrientation( evaluatedWidth, evaluatedHeight, context );
1076double QgsLayoutItem::applyDataDefinedRotation(
const double rotation )
1085 return evaluatedRotation;
1125 const bool exclude = mExcludeFromExports;
1142 const double rotationRequired =
angle - rotation();
1145 mItemRotation =
angle;
1148void QgsLayoutItem::updateStoredItemPosition()
1151 mItemPosition =
mLayout->convertFromLayoutUnits( layoutPosReferencePoint, mItemPosition.
units() );
1156 double evaluatedAngle =
angle + rotation();
1158 mItemRotation = evaluatedAngle;
1160 QPointF itemTransformOrigin = mapFromScene( transformOrigin );
1174 Q_UNUSED( visitor );
1193 if ( !mItemCachedImage.isNull() )
1195 mItemCachedImage = QImage();
1214 painter->setRenderHint( QPainter::Antialiasing,
false );
1215 painter->setPen( Qt::NoPen );
1216 painter->setBrush( QColor( 100, 255, 100, 200 ) );
1217 painter->drawRect( rect() );
1223 path.addRect( QRectF( 0, 0, rect().width(), rect().height() ) );
1229 if ( !mFrame || !context.
painter() )
1232 QPainter *p = context.
painter();
1237 p->setBrush( Qt::NoBrush );
1245 if ( !mBackground || !context.
painter() )
1250 QPainter *p = context.
painter();
1251 p->setBrush( brush() );
1252 p->setPen( Qt::NoPen );
1266 mMinimumSize = size;
1285QPointF QgsLayoutItem::itemPositionAtReferencePoint(
const ReferencePoint reference,
const QSizeF size )
const
1287 switch ( reference )
1290 return QPointF( size.width() / 2.0, 0 );
1292 return QPointF( size.width(), 0 );
1294 return QPointF( 0, size.height() / 2.0 );
1296 return QPointF( size.width() / 2.0, size.height() / 2.0 );
1298 return QPointF( size.width(), size.height() / 2.0 );
1300 return QPointF( 0, size.height() );
1302 return QPointF( size.width() / 2.0, size.height() );
1304 return QPointF( size.width(), size.height() );
1306 return QPointF( 0, 0 );
1309 return QPointF( 0, 0 );
1314 const QPointF itemPosition = mapFromScene( position );
1315 const QPointF adjustedPointInsideItem = itemPosition - itemPositionAtReferencePoint( reference, size );
1316 return mapToScene( adjustedPointInsideItem );
1321 const QPointF pointWithinItem = itemPositionAtReferencePoint( reference, rect().size() );
1322 return mapToScene( pointWithinItem );
1327 const QPointF topLeft =
mLayout->convertToLayoutUnits( point );
1328 const QPointF refPoint = topLeft + itemPositionAtReferencePoint( mReferencePoint, rect().size() );
1329 return mLayout->convertFromLayoutUnits( refPoint, point.
units() );
1343void QgsLayoutItem::initConnectionsToLayout()
1350void QgsLayoutItem::preparePainter( QPainter *painter )
1352 if ( !painter || !painter->device() )
1357 painter->setRenderHint( QPainter::Antialiasing, shouldDrawAntialiased() );
1362bool QgsLayoutItem::shouldDrawAntialiased()
const
1371bool QgsLayoutItem::shouldDrawDebugRect()
const
1376QSizeF QgsLayoutItem::applyMinimumSize(
const QSizeF targetSize )
1382 const QSizeF minimumSizeLayoutUnits =
mLayout->convertToLayoutUnits(
minimumSize() );
1383 return targetSize.expandedTo( minimumSizeLayoutUnits );
1386QSizeF QgsLayoutItem::applyFixedSize(
const QSizeF targetSize )
1393 QSizeF size = targetSize;
1394 const QSizeF fixedSizeLayoutUnits =
mLayout->convertToLayoutUnits(
fixedSize() );
1395 if ( fixedSizeLayoutUnits.width() > 0 )
1396 size.setWidth( fixedSizeLayoutUnits.width() );
1397 if ( fixedSizeLayoutUnits.height() > 0 )
1398 size.setHeight( fixedSizeLayoutUnits.height() );
1405 double r = mItemRotation;
1417 if ( !transformPoint.isNull() )
1421 QLineF refLine = QLineF( mapToScene( transformPoint ), mapToScene( QPointF( 0, 0 ) ) );
1423 refLine.setAngle( refLine.angle() - r + rotation() );
1425 const QPointF rotatedReferencePoint = refLine.p2();
1426 setPos( rotatedReferencePoint );
1429 setTransformOriginPoint( 0, 0 );
1430 QGraphicsItem::setRotation( r );
1433 updateStoredItemPosition();
1448 mEvaluatedOpacity = opacity / 100.0;
1454 setOpacity( mEvaluatedOpacity );
1467 setPen( Qt::NoPen );
1477 itemPen = QPen( frameColor );
1481 itemPen = QPen( mFrameColor );
1483 itemPen.setJoinStyle( mFrameJoinStyle );
1486 itemPen.setWidthF(
mLayout->convertToLayoutUnits( mFrameWidth ) );
1488 itemPen.setWidthF( mFrameWidth.
length() );
1509 setBrush( QBrush( mBackgroundColor, Qt::SolidPattern ) );
1519 QPainter::CompositionMode
blendMode = mBlendMode;
1524 if ( ok && !blendStr.isEmpty() )
1526 const QString blendstr = blendStr.trimmed();
1532 mEffect->setCompositionMode(
blendMode );
LayoutUnit
Layout measurement units.
BlendMode
Blending modes defining the available composition modes that can be used when painting.
Base class for commands to undo/redo layout and layout object changes.
QColor valueAsColor(int key, const QgsExpressionContext &context, const QColor &defaultColor=QColor(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a color.
bool valueAsBool(int key, const QgsExpressionContext &context, bool defaultValue=false, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as an boolean.
double valueAsDouble(int key, const QgsExpressionContext &context, double defaultValue=0.0, bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a double.
QString valueAsString(int key, const QgsExpressionContext &context, const QString &defaultString=QString(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a string.
static QgsPageSizeRegistry * pageSizeRegistry()
Returns the application's page size registry, used for managing layout page sizes.
static QgsLayoutItemRegistry * layoutItemRegistry()
Returns the application's layout item registry, used for layout item types.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsExpressionContextScope * layoutItemScope(const QgsLayoutItem *item)
Creates a new scope which contains variables and functions relating to a QgsLayoutItem.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
A geometry is the spatial representation of a feature.
static void multiplyOpacity(QImage &image, double factor, QgsFeedback *feedback=nullptr)
Multiplies opacity of image pixel values by a factor.
A QGraphicsEffect subclass used for rendering layout items onto a scene with custom composition modes...
A container for grouping several QgsLayoutItems.
Item representing the paper in a layout.
Orientation
Page orientation.
@ Landscape
Landscape orientation.
@ Portrait
Portrait orientation.
@ LayoutItem
Base class for items.
Contains settings and helpers relating to a render of a QgsLayoutItem.
QgsLayoutItemRenderContext(QgsRenderContext &context, double viewScaleFactor=1.0)
Constructor for QgsLayoutItemRenderContext.
virtual void drawDebugRect(QPainter *painter)
Draws a debugging rectangle of the item's current bounds within the specified painter.
virtual void drawFrame(QgsRenderContext &context)
Draws the frame around the item.
QgsAbstractLayoutUndoCommand * createCommand(const QString &text, int id, QUndoCommand *parent=nullptr) override
Creates a new layout undo command with the specified text and parent.
virtual QgsGeometry clipPath() const
Returns the clipping path generated by this item, in layout coordinates.
virtual QPainterPath framePath() const
Returns the path to use when drawing the item's frame or background.
virtual void cleanup()
Called just before a batch of items are deleted, allowing them to run cleanup tasks.
bool isGroupMember() const
Returns true if the item is part of a QgsLayoutItemGroup group.
bool writeXml(QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context) const
Stores the item state in a DOM element.
virtual void setFrameStrokeWidth(QgsLayoutMeasurement width)
Sets the frame stroke width.
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
void refreshItemRotation(QPointF *origin=nullptr)
Refreshes an item's rotation by rechecking it against any possible overrides such as data defined rot...
UndoCommand
Layout item undo commands, used for collapsing undo commands.
QgsLayoutItemGroup * parentGroup() const
Returns the item's parent group, if the item is part of a QgsLayoutItemGroup group.
double itemRotation() const
Returns the current rotation for the item, in degrees clockwise.
QgsLayoutItem(QgsLayout *layout, bool manageZValue=true)
Constructor for QgsLayoutItem, with the specified parent layout.
virtual void setSelected(bool selected)
Sets whether the item should be selected.
QPointF adjustPointForReferencePosition(QPointF point, QSizeF size, ReferencePoint reference) const
Adjusts the specified point at which a reference position of the item sits and returns the top left c...
virtual void zoomContent(double factor, QPointF point)
Zooms content of item.
virtual void setItemRotation(double rotation, bool adjustPosition=true)
Sets the layout item's rotation, in degrees clockwise.
void rotationChanged(double newRotation)
Emitted on item rotation change.
virtual QgsLayoutItem::ExportLayerDetail exportLayerDetails() const
Returns the details for the specified current export layer.
void setBackgroundColor(const QColor &color)
Sets the background color for this item.
virtual QIcon icon() const
Returns the item's icon.
void paint(QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget) override
Handles preparing a paint surface for the layout item and painting the item's content.
bool excludeFromExports() const
Returns whether the item should be excluded from layout exports and prints.
virtual bool nextExportPart()
Moves to the next export part for a multi-layered export item, during a multi-layered export.
double itemOpacity() const
Returns the item's opacity.
virtual QRectF rectWithFrame() const
Returns the item's rectangular bounds, including any bleed caused by the item's frame.
void beginCommand(const QString &commandText, UndoCommand command=UndoNone)
Starts new undo command for this item.
void cancelCommand()
Cancels the current item command and discards it.
void setItemOpacity(double opacity)
Sets the item's opacity.
virtual void setVisibility(bool visible)
Sets whether the item is visible.
virtual void redraw()
Triggers a redraw (update) of the item.
QgsLayoutPoint positionWithUnits() const
Returns the item's current position, including units.
QgsLayoutPoint topLeftToReferencePoint(const QgsLayoutPoint &point) const
Returns the position for the reference point of the item, if the top-left of the item was placed at t...
ReferencePoint
Fixed position reference point.
@ LowerMiddle
Lower center of item.
@ MiddleLeft
Middle left of item.
@ UpperRight
Upper right corner of item.
@ LowerLeft
Lower left corner of item.
@ UpperLeft
Upper left corner of item.
@ UpperMiddle
Upper center of item.
@ MiddleRight
Middle right of item.
@ LowerRight
Lower right corner of item.
virtual void startLayeredExport()
Starts a multi-layer export operation.
virtual bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores item state within an XML DOM element.
void endCommand()
Completes the current item command and push it onto the layout's undo stack.
void refreshItemSize()
Refreshes an item's size by rechecking it against any possible item fixed or minimum sizes.
int page() const
Returns the page the item is currently on, with the first page returning 0.
QColor backgroundColor() const
Returns the background color for this item.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
virtual void setId(const QString &id)
Set the item's id name.
void setFrameStrokeColor(const QColor &color)
Sets the frame stroke color.
virtual void finalizeRestoreFromXml()
Called after all pending items have been restored from XML.
void setFrameJoinStyle(Qt::PenJoinStyle style)
Sets the join style used when drawing the item's frame.
void refreshBackgroundColor(bool updateItem=true)
Refresh item's background color, considering data defined colors.
virtual void rotateItem(double angle, QPointF transformOrigin)
Rotates the item by a specified angle in degrees clockwise around a specified reference point.
bool readXml(const QDomElement &itemElement, const QDomDocument &document, const QgsReadWriteContext &context)
Sets the item state from a DOM element.
virtual void setFrameEnabled(bool drawFrame)
Sets whether this item has a frame drawn around it or not.
void setLocked(bool locked)
Sets whether the item is locked, preventing mouse interactions with the item.
~QgsLayoutItem() override
int type() const override
Returns a unique graphics item type identifier.
virtual void drawBackground(QgsRenderContext &context)
Draws the background for the item.
virtual QString displayName() const
Gets item display name.
virtual QgsLayoutSize minimumSize() const
Returns the minimum allowed size of the item, if applicable, or an empty size if item can be freely r...
virtual void attemptResize(const QgsLayoutSize &size, bool includesFrame=false)
Attempts to resize the item to a specified target size.
virtual bool requiresRasterization() const
Returns true if the item is drawn in such a way that forces the whole layout to be rasterized when ex...
bool shouldDrawItem() const
Returns whether the item should be drawn in the current context.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::AllProperties)
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
virtual void moveContent(double dx, double dy)
Moves the content of the item, by a specified dx and dy in layout units.
@ FlagOverridesPaint
Item overrides the default layout item painting method.
virtual void stopLayeredExport()
Stops a multi-layer export operation.
virtual bool containsAdvancedEffects() const
Returns true if the item contains contents with blend modes or transparency effects which can only be...
virtual QgsLayoutSize fixedSize() const
Returns the fixed size of the item, if applicable, or an empty size if item can be freely resized.
virtual void setMoveContentPreviewOffset(double dx, double dy)
Sets temporary offset for the item, by a specified dx and dy in layout units.
void setExcludeFromExports(bool exclude)
Sets whether the item should be excluded from layout exports and prints.
void sizePositionChanged()
Emitted when the item's size or position changes.
void lockChanged()
Emitted if the item's lock status changes.
virtual QSizeF applyItemSizeConstraint(QSizeF targetSize)
Applies any item-specific size constraint handling to a given targetSize in layout units.
virtual void invalidateCache()
Forces a deferred update of any cached image the item uses.
void refreshFrame(bool updateItem=true)
Refresh item's frame, considering data defined colors and frame size.
virtual QString uuid() const
Returns the item identification string.
virtual void attemptMove(const QgsLayoutPoint &point, bool useReferencePoint=true, bool includesFrame=false, int page=-1)
Attempts to move the item to a specified point.
QPointF pagePos() const
Returns the item's position (in layout units) relative to the top left corner of its current page.
QString id() const
Returns the item's ID name.
void setBlendMode(QPainter::CompositionMode mode)
Sets the item's composition blending mode.
bool frameEnabled() const
Returns true if the item includes a frame.
void frameChanged()
Emitted if the item's frame style changes.
virtual Flags itemFlags() const
Returns the item's flags, which indicate how the item behaves.
void attemptMoveBy(double deltaX, double deltaY)
Attempts to shift the item's position by a specified deltaX and deltaY, in layout units.
void setReferencePoint(ReferencePoint point)
Sets the reference point for positioning of the layout item.
virtual bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context)
Sets item state from a DOM element.
ExportLayerBehavior
Behavior of item when exporting to layered outputs.
@ CanGroupWithAnyOtherItem
Item can be placed on a layer with any other item (default behavior)
virtual Q_DECL_DEPRECATED int numberExportLayers() const
Returns the number of layers that this item requires for exporting during layered exports (e....
void refreshBlendMode()
Refresh item's blend mode, considering data defined blend mode.
void setParentGroup(QgsLayoutItemGroup *group)
Sets the item's parent group.
QPointF positionAtReferencePoint(ReferencePoint reference) const
Returns the current position (in layout units) of a reference point for the item.
void refreshOpacity(bool updateItem=true)
Refresh item's opacity, considering data defined opacity.
QgsLayoutSize applyDataDefinedSize(const QgsLayoutSize &size)
Applies any present data defined size overrides to the specified layout size.
virtual void setMinimumSize(const QgsLayoutSize &size)
Sets the minimum allowed size for the layout item.
void refresh() override
Refreshes the item, causing a recalculation of any property overrides and recalculation of its positi...
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect in layout coordinates.
virtual double estimatedFrameBleed() const
Returns the estimated amount the item's frame bleeds outside the item's actual rectangle.
virtual ExportLayerBehavior exportLayerBehavior() const
Returns the behavior of this item during exporting to layered exports (e.g.
void setBackgroundEnabled(bool drawBackground)
Sets whether this item has a background drawn under it or not.
void refreshItemPosition()
Refreshes an item's position by rechecking it against any possible overrides such as data defined pos...
virtual void setFixedSize(const QgsLayoutSize &size)
Sets a fixed size for the layout item, which prevents it from being freely resized.
QPainter::CompositionMode blendMode() const
Returns the item's composition blending mode.
virtual void draw(QgsLayoutItemRenderContext &context)=0
Draws the item's contents using the specified item render context.
QgsLayoutPoint pagePositionWithUnits() const
Returns the item's position (in item units) relative to the top left corner of its current page.
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
static QgsLayoutMeasurement decodeMeasurement(const QString &string)
Decodes a measurement from a string.
QString encodeMeasurement() const
Encodes the layout measurement to a string.
double length() const
Returns the length of the measurement.
A base class for objects which belong to a layout.
QgsPropertyCollection mDataDefinedProperties
bool readObjectPropertiesFromElement(const QDomElement &parentElement, const QDomDocument &document, const QgsReadWriteContext &context)
Sets object properties from a DOM element.
const QgsLayout * layout() const
Returns the layout the object is attached to.
void changed()
Emitted when the object's properties change.
virtual void refresh()
Refreshes the object, causing a recalculation of any property overrides.
QPointer< QgsLayout > mLayout
DataDefinedProperty
Data defined properties for different item types.
@ PaperOrientation
Paper orientation.
@ ItemWidth
Width of item.
@ ItemHeight
Height of item.
@ BlendMode
Item blend mode.
@ AllProperties
All properties for item.
@ PositionY
Y position on page.
@ ExcludeFromExports
Exclude item from exports.
@ BackgroundColor
Item background color.
@ ItemRotation
Rotation of item.
@ PresetPaperSize
Preset paper size for composition.
@ PositionX
X position on page.
@ FrameColor
Item frame color.
QgsExpressionContext createExpressionContext() const override
Creates an expression context relating to the objects' current state.
bool writeObjectPropertiesToElement(QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context) const
Stores object properties within an XML DOM element.
This class provides a method of storing points, consisting of an x and y coordinate,...
double x() const
Returns x coordinate of point.
QPointF toQPointF() const
Converts the layout point to a QPointF.
QString encodePoint() const
Encodes the layout point to a string.
void setX(const double x)
Sets the x coordinate of point.
static QgsLayoutPoint decodePoint(const QString &string)
Decodes a point from a string.
double y() const
Returns y coordinate of point.
Qgis::LayoutUnit units() const
Returns the units for the point.
void setY(const double y)
Sets y coordinate of point.
void flagsChanged(QgsLayoutRenderContext::Flags flags)
Emitted whenever the context's flags change.
@ FlagDebug
Debug/testing mode, items are drawn as solid rectangles.
@ FlagUseAdvancedEffects
Enable advanced effects such as blend modes.
@ FlagLosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ FlagAntialiasing
Use antialiasing when drawing items.
@ FlagForceVectorOutput
Force output in vector format where possible, even if items require rasterization to keep their corre...
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
static QgsLayoutSize decodeSize(const QString &string)
Decodes a size from a string.
double height() const
Returns the height of the size.
void setWidth(const double width)
Sets the width for the size.
Qgis::LayoutUnit units() const
Returns the units for the size.
double width() const
Returns the width of the size.
QString encodeSize() const
Encodes the layout size to a string.
void setHeight(const double height)
Sets the height for the size.
static QgsRenderContext createRenderContextForLayout(QgsLayout *layout, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout and painter destination.
static bool itemIsAClippingSource(const QgsLayoutItem *item)
Returns true if an item is a clipping item for another layout item.
static QgsLayoutItemPage::Orientation decodePaperOrientation(const QString &string, bool &ok)
Decodes a string representing a paper orientation and returns the decoded orientation.
static double normalizedAngle(double angle, bool allowNegative=false)
Ensures that an angle (in degrees) is in the range 0 <= angle < 360.
static Q_DECL_DEPRECATED double scaleFactorFromItemStyle(const QStyleOptionGraphicsItem *style)
Extracts the scale factor from an item style.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
@ ZItem
Minimum z value for items.
Qgis::LayoutUnit units() const
Returns the native units for the layout.
A named page size for layouts.
QgsLayoutSize size
Page size.
static Qgis::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a BlendMode corresponding to a QPainter::CompositionMode.
static QPainter::CompositionMode getCompositionMode(Qgis::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a BlendMode.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
The class is used as a container of context for various read/write operations on other objects.
Contains information about the context of a rendering operation.
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
QPainter * painter()
Returns the destination QPainter for the render operation.
void setPainterFlagsUsingContext(QPainter *painter=nullptr) const
Sets relevant flags on a destination painter, using the flags and settings currently defined for the ...
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
Scoped object for saving and restoring a QPainter object's state.
An interface for classes which can visit style entity (e.g.
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
static QPainter::CompositionMode decodeBlendMode(const QString &s)
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Contains details of a particular export layer relating to a layout item.