36#include <QStyleOptionGraphicsItem>
39#include "moc_qgslayoutitem.cpp"
41#define CACHE_SIZE_LIMIT 5000
44 : mRenderContext( context )
53 , QGraphicsRectItem( nullptr )
54 , mUuid( QUuid::createUuid().toString() )
59 setFlags( flags() | QGraphicsItem::ItemUsesExtendedStyleOption | QGraphicsItem::ItemIsSelectable );
61 setCacheMode( QGraphicsItem::DeviceCoordinateCache );
65 mItemPosition =
QgsLayoutPoint( scenePos().x(), scenePos().y(), initialUnits );
66 mItemSize =
QgsLayoutSize( rect().width(), rect().height(), initialUnits );
72 initConnectionsToLayout();
77 mLayoutManagesZValue =
true;
78 mLayout->itemsModel()->addItemAtTop(
this );
82 mLayoutManagesZValue =
false;
93 if (
mLayout && mLayoutManagesZValue )
95 mLayout->itemsModel()->removeItem(
this );
102 if ( !
id().isEmpty() )
110 return tr(
"<%1>" ).arg( metadata->visibleName() );
113 return tr(
"<item>" );
138 if ( !shouldBlockUndoCommands() )
139 mLayout->undoStack()->beginCommand(
this, tr(
"Change Item ID" ) );
143 if ( !shouldBlockUndoCommands() )
144 mLayout->undoStack()->endCommand();
151 mLayout->itemsModel()->updateItemDisplayName(
this );
159 QGraphicsRectItem::setSelected( selected );
163 mLayout->itemsModel()->updateItemSelectStatus(
this );
169 if ( visible == isVisible() )
175 std::unique_ptr< QgsAbstractLayoutUndoCommand > command;
176 if ( !shouldBlockUndoCommands() )
178 command.reset(
createCommand( visible ? tr(
"Show Item" ) : tr(
"Hide Item" ), 0 ) );
179 command->saveBeforeState();
182 QGraphicsItem::setVisible( visible );
186 command->saveAfterState();
187 mLayout->undoStack()->push( command.release() );
193 mLayout->itemsModel()->updateItemVisibility(
this );
199 if (
locked == mIsLocked )
204 if ( !shouldBlockUndoCommands() )
205 mLayout->undoStack()->beginCommand(
this,
locked ? tr(
"Lock Item" ) : tr(
"Unlock Item" ) );
209 if ( !shouldBlockUndoCommands() )
210 mLayout->undoStack()->endCommand();
215 mLayout->itemsModel()->updateItemLockStatus(
this );
224 return !mParentGroupUuid.isEmpty() &&
mLayout &&
static_cast< bool >(
mLayout->itemByUuid( mParentGroupUuid ) );
229 if ( !
mLayout || mParentGroupUuid.isEmpty() )
232 return qobject_cast< QgsLayoutItemGroup * >(
mLayout->itemByUuid( mParentGroupUuid ) );
238 mParentGroupUuid.clear();
240 mParentGroupUuid = group->
uuid();
241 setFlag( QGraphicsItem::ItemIsSelectable, !
static_cast< bool>( group ) );
267 if ( !
mLayout ||
mLayout->renderContext().currentExportLayer() == -1 )
273 return mLayout->renderContext().currentExportLayer() < layers;
289 if ( shouldDrawDebugRect() )
295 const bool previewRender = !
mLayout ||
mLayout->renderContext().isPreviewRender();
297 const bool useImageCache =
false;
299 QPainter::CompositionMode
blendMode = blendModeForRender();
304 forceRasterOutput =
false;
306 else if (
blendMode != QPainter::CompositionMode_SourceOver )
309 forceRasterOutput =
true;
312 if ( useImageCache || forceRasterOutput )
314 double widthInPixels = 0;
315 double heightInPixels = 0;
325 widthInPixels = boundingRect().width() * layoutUnitsToPixels;
326 heightInPixels = boundingRect().height() * layoutUnitsToPixels;
333 if ( widthInPixels > heightInPixels )
337 heightInPixels /= scale;
343 widthInPixels /= scale;
345 destinationDpi = destinationDpi / scale;
348 if ( previewRender && !mItemCachedImage.isNull() &&
qgsDoubleNear( mItemCacheDpi, destinationDpi ) )
353 preparePainter( painter );
354 const double cacheScale = destinationDpi / mItemCacheDpi;
356 painter->setCompositionMode(
blendMode );
357 painter->drawImage( boundingRect().x() * context.
scaleFactor() / cacheScale,
358 boundingRect().y() * context.
scaleFactor() / cacheScale, mItemCachedImage );
363 QImage image = QImage( widthInPixels, heightInPixels, QImage::Format_ARGB32 );
364 image.fill( Qt::transparent );
365 image.setDotsPerMeterX( 1000 * destinationDpi * 25.4 );
366 image.setDotsPerMeterY( 1000 * destinationDpi * 25.4 );
367 QPainter p( &image );
369 preparePainter( &p );
381 draw( itemRenderContext );
392 painter->setCompositionMode(
blendMode );
393 painter->drawImage( boundingRect().x() * context.
scaleFactor(),
394 boundingRect().y() * context.
scaleFactor(), image );
398 mItemCacheDpi = destinationDpi;
399 mItemCachedImage = image;
407 preparePainter( painter );
417 draw( itemRenderContext );
431 if ( point == mReferencePoint )
436 mReferencePoint = point;
439 updateStoredItemPosition();
463 const QSizeF targetSizeLayoutUnits =
mLayout->convertToLayoutUnits( evaluatedSize );
464 QSizeF actualSizeLayoutUnits = applyMinimumSize( targetSizeLayoutUnits );
465 actualSizeLayoutUnits = applyFixedSize( actualSizeLayoutUnits );
468 if ( actualSizeLayoutUnits == rect().size() )
474 mItemSize = actualSizeTargetUnits;
476 setRect( 0, 0, actualSizeLayoutUnits.width(), actualSizeLayoutUnits.height() );
493 point =
mLayout->pageCollection()->pagePositionToAbsolute(
page, p );
500 point.
setX( point.
x() + bleed );
501 point.
setY( point.
y() + bleed );
505 if ( !useReferencePoint )
510 evaluatedPoint = applyDataDefinedPosition( evaluatedPoint );
511 const QPointF evaluatedPointLayoutUnits =
mLayout->convertToLayoutUnits( evaluatedPoint );
513 if ( topLeftPointLayoutUnits == scenePos() && point.
units() == mItemPosition.units() )
520 mItemPosition = referencePointTargetUnits;
521 setScenePos( topLeftPointLayoutUnits );
527 const QPointF newPos = rect.topLeft();
529 blockSignals(
true );
531 const QgsLayoutSize newSize =
mLayout->convertFromLayoutUnits( rect.size(), mItemSize.units() );
537 blockSignals(
false );
545 moveBy( deltaX, deltaY );
551 itemPos.
setX( itemPos.
x() + deltaPos.
x() );
552 itemPos.
setY( itemPos.
y() + deltaPos.
y() );
561 return mLayout->pageCollection()->pageNumberForPoint( pos() );
576 p.ry() -= pageItem->pos().y();
586 return mLayout->convertFromLayoutUnits( p, mItemPosition.units() );
589void QgsLayoutItem::setScenePos(
const QPointF destinationPos )
594 if (
auto *lParentItem = parentItem() )
595 setPos( pos() + ( destinationPos - scenePos() ) + lParentItem->scenePos() );
597 setPos( pos() + ( destinationPos - scenePos() ) );
600bool QgsLayoutItem::shouldBlockUndoCommands()
const
617 return !mEvaluatedExcludeFromExports;
622 return mItemRotation;
627 QDomElement element = doc.createElement( QStringLiteral(
"LayoutItem" ) );
628 element.setAttribute( QStringLiteral(
"type" ), QString::number(
type() ) );
630 element.setAttribute( QStringLiteral(
"uuid" ), mUuid );
631 element.setAttribute( QStringLiteral(
"templateUuid" ), mUuid );
632 element.setAttribute( QStringLiteral(
"id" ), mId );
633 element.setAttribute( QStringLiteral(
"referencePoint" ), QString::number(
static_cast< int >( mReferencePoint ) ) );
634 element.setAttribute( QStringLiteral(
"position" ), mItemPosition.encodePoint() );
636 element.setAttribute( QStringLiteral(
"size" ), mItemSize.encodeSize() );
637 element.setAttribute( QStringLiteral(
"itemRotation" ), QString::number( mItemRotation ) );
638 element.setAttribute( QStringLiteral(
"groupUuid" ), mParentGroupUuid );
640 element.setAttribute( QStringLiteral(
"zValue" ), QString::number( zValue() ) );
641 element.setAttribute( QStringLiteral(
"visibility" ), isVisible() );
645 element.setAttribute( QStringLiteral(
"positionLock" ), QStringLiteral(
"true" ) );
649 element.setAttribute( QStringLiteral(
"positionLock" ), QStringLiteral(
"false" ) );
655 element.setAttribute( QStringLiteral(
"frame" ), QStringLiteral(
"true" ) );
659 element.setAttribute( QStringLiteral(
"frame" ), QStringLiteral(
"false" ) );
665 element.setAttribute( QStringLiteral(
"background" ), QStringLiteral(
"true" ) );
669 element.setAttribute( QStringLiteral(
"background" ), QStringLiteral(
"false" ) );
673 QDomElement frameColorElem = doc.createElement( QStringLiteral(
"FrameColor" ) );
674 frameColorElem.setAttribute( QStringLiteral(
"red" ), QString::number( mFrameColor.red() ) );
675 frameColorElem.setAttribute( QStringLiteral(
"green" ), QString::number( mFrameColor.green() ) );
676 frameColorElem.setAttribute( QStringLiteral(
"blue" ), QString::number( mFrameColor.blue() ) );
677 frameColorElem.setAttribute( QStringLiteral(
"alpha" ), QString::number( mFrameColor.alpha() ) );
678 element.appendChild( frameColorElem );
679 element.setAttribute( QStringLiteral(
"outlineWidthM" ), mFrameWidth.encodeMeasurement() );
683 QDomElement bgColorElem = doc.createElement( QStringLiteral(
"BackgroundColor" ) );
684 bgColorElem.setAttribute( QStringLiteral(
"red" ), QString::number( mBackgroundColor.red() ) );
685 bgColorElem.setAttribute( QStringLiteral(
"green" ), QString::number( mBackgroundColor.green() ) );
686 bgColorElem.setAttribute( QStringLiteral(
"blue" ), QString::number( mBackgroundColor.blue() ) );
687 bgColorElem.setAttribute( QStringLiteral(
"alpha" ), QString::number( mBackgroundColor.alpha() ) );
688 element.appendChild( bgColorElem );
694 element.setAttribute( QStringLiteral(
"opacity" ), QString::number( mOpacity ) );
696 element.setAttribute( QStringLiteral(
"excludeFromExports" ), mExcludeFromExports );
701 parentElement.appendChild( element );
708 if ( element.nodeName() != QLatin1String(
"LayoutItem" ) )
715 mBlockUndoCommands =
true;
716 mUuid = element.attribute( QStringLiteral(
"uuid" ), QUuid::createUuid().toString() );
717 setId( element.attribute( QStringLiteral(
"id" ) ) );
718 mReferencePoint =
static_cast< ReferencePoint >( element.attribute( QStringLiteral(
"referencePoint" ) ).toInt() );
719 setItemRotation( element.attribute( QStringLiteral(
"itemRotation" ), QStringLiteral(
"0" ) ).toDouble() );
723 mParentGroupUuid = element.attribute( QStringLiteral(
"groupUuid" ) );
724 if ( !mParentGroupUuid.isEmpty() )
728 group->addItem(
this );
731 mTemplateUuid = element.attribute( QStringLiteral(
"templateUuid" ) );
734 const QString positionLock = element.attribute( QStringLiteral(
"positionLock" ) );
735 if ( positionLock.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
744 setVisibility( element.attribute( QStringLiteral(
"visibility" ), QStringLiteral(
"1" ) ) != QLatin1String(
"0" ) );
745 setZValue( element.attribute( QStringLiteral(
"zValue" ) ).toDouble() );
748 const QString frame = element.attribute( QStringLiteral(
"frame" ) );
749 if ( frame.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
759 const QString background = element.attribute( QStringLiteral(
"background" ) );
760 if ( background.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
772 const QDomNodeList frameColorList = element.elementsByTagName( QStringLiteral(
"FrameColor" ) );
773 if ( !frameColorList.isEmpty() )
775 const QDomElement frameColorElem = frameColorList.at( 0 ).toElement();
777 bool greenOk =
false;
779 bool alphaOk =
false;
780 int penRed, penGreen, penBlue, penAlpha;
782 penRed = frameColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
783 penGreen = frameColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
784 penBlue = frameColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
785 penAlpha = frameColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
787 if ( redOk && greenOk && blueOk && alphaOk )
789 mFrameColor = QColor( penRed, penGreen, penBlue, penAlpha );
795 const QDomNodeList bgColorList = element.elementsByTagName( QStringLiteral(
"BackgroundColor" ) );
796 if ( !bgColorList.isEmpty() )
798 const QDomElement bgColorElem = bgColorList.at( 0 ).toElement();
799 bool redOk, greenOk, blueOk, alphaOk;
800 int bgRed, bgGreen, bgBlue, bgAlpha;
801 bgRed = bgColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
802 bgGreen = bgColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
803 bgBlue = bgColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
804 bgAlpha = bgColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
805 if ( redOk && greenOk && blueOk && alphaOk )
807 mBackgroundColor = QColor( bgRed, bgGreen, bgBlue, bgAlpha );
808 setBrush( QBrush( mBackgroundColor, Qt::SolidPattern ) );
818 if ( element.hasAttribute( QStringLiteral(
"opacity" ) ) )
820 setItemOpacity( element.attribute( QStringLiteral(
"opacity" ), QStringLiteral(
"1" ) ).toDouble() );
824 setItemOpacity( 1.0 - element.attribute( QStringLiteral(
"transparency" ), QStringLiteral(
"0" ) ).toInt() / 100.0 );
827 mExcludeFromExports = element.attribute( QStringLiteral(
"excludeFromExports" ), QStringLiteral(
"0" ) ).toInt();
828 mEvaluatedExcludeFromExports = mExcludeFromExports;
832 mBlockUndoCommands =
false;
845 return new QgsLayoutItemUndoCommand(
this, text,
id, parent );
863 if ( mFrameColor == color )
876 if ( mFrameWidth == width )
888 if ( mFrameJoinStyle == style )
893 mFrameJoinStyle = style;
895 QPen itemPen = pen();
896 itemPen.setJoinStyle( mFrameJoinStyle );
909 mBackgroundColor = color;
926 if ( !mItemCachedImage.isNull() )
932 return mExcludeFromExports;
937 mExcludeFromExports = exclude;
949 blendMode() != QPainter::CompositionMode_SourceOver;
959 return pen().widthF() / 2.0;
965 return rect().adjusted( -frameBleed, -frameBleed, frameBleed, frameBleed );
988 mLayout->undoStack()->beginCommand(
this, commandText, command );
994 mLayout->undoStack()->endCommand();
1000 mLayout->undoStack()->cancelCommand();
1013 return QgsLayoutPoint( evaluatedX, evaluatedY, position.
units() );
1016void QgsLayoutItem::applyDataDefinedOrientation(
double &width,
double &height,
const QgsExpressionContext &context )
1020 if ( ok && !orientationString.isEmpty() )
1025 double heightD = 0.0, widthD = 0.0;
1026 switch ( orientation )
1030 heightD = std::max( height, width );
1031 widthD = std::min( height, width );
1036 heightD = std::min( height, width );
1037 widthD = std::max( height, width );
1066 double evaluatedWidth = size.
width();
1067 double evaluatedHeight = size.
height();
1071 evaluatedWidth = convertedSize.
width();
1072 evaluatedHeight = convertedSize.
height();
1080 applyDataDefinedOrientation( evaluatedWidth, evaluatedHeight, context );
1085QPainter::CompositionMode QgsLayoutItem::blendModeForRender()
const
1087 QPainter::CompositionMode mode = mEvaluatedBlendMode;
1092 mode = QPainter::CompositionMode_SourceOver;
1097double QgsLayoutItem::applyDataDefinedRotation(
const double rotation )
1106 return evaluatedRotation;
1146 const bool exclude = mExcludeFromExports;
1156 if ( angle >= 360.0 || angle <= -360.0 )
1158 angle = std::fmod( angle, 360.0 );
1163 const double rotationRequired = angle - rotation();
1166 mItemRotation = angle;
1169void QgsLayoutItem::updateStoredItemPosition()
1172 mItemPosition =
mLayout->convertFromLayoutUnits( layoutPosReferencePoint, mItemPosition.
units() );
1177 double evaluatedAngle = angle + rotation();
1179 mItemRotation = evaluatedAngle;
1181 QPointF itemTransformOrigin = mapFromScene( transformOrigin );
1200 Q_UNUSED( visitor );
1219 if ( !mItemCachedImage.isNull() )
1221 mItemCachedImage = QImage();
1240 painter->setRenderHint( QPainter::Antialiasing,
false );
1241 painter->setPen( Qt::NoPen );
1242 painter->setBrush( QColor( 100, 255, 100, 200 ) );
1243 painter->drawRect( rect() );
1249 path.addRect( QRectF( 0, 0, rect().width(), rect().height() ) );
1255 if ( !mFrame || !context.
painter() )
1258 QPainter *p = context.
painter();
1263 p->setBrush( Qt::NoBrush );
1271 if ( !mBackground || !context.
painter() )
1276 QPainter *p = context.
painter();
1277 p->setBrush( brush() );
1278 p->setPen( Qt::NoPen );
1287 bool fitsInCache =
false;
1288 const int xSize = std::floor(
static_cast<double>( QFontMetrics( QFont() ).horizontalAdvance(
'X' ) ) * painter->device()->devicePixelRatioF() );
1289 const QImage refreshingImage =
QgsApplication::svgCache()->
svgAsImage( QStringLiteral(
":/images/composer/refreshing_item.svg" ), xSize * 3, QColor(), QColor(), 1, 1, fitsInCache );
1292 painter->scale( 1.0 / previewScaleFactor / painter->device()->devicePixelRatioF(), 1.0 / previewScaleFactor / painter->device()->devicePixelRatioF() );
1293 painter->drawImage( xSize, xSize, refreshingImage );
1304 mMinimumSize = size;
1323QPointF QgsLayoutItem::itemPositionAtReferencePoint(
const ReferencePoint reference,
const QSizeF size )
const
1325 switch ( reference )
1328 return QPointF( size.width() / 2.0, 0 );
1330 return QPointF( size.width(), 0 );
1332 return QPointF( 0, size.height() / 2.0 );
1334 return QPointF( size.width() / 2.0, size.height() / 2.0 );
1336 return QPointF( size.width(), size.height() / 2.0 );
1338 return QPointF( 0, size.height() );
1340 return QPointF( size.width() / 2.0, size.height() );
1342 return QPointF( size.width(), size.height() );
1344 return QPointF( 0, 0 );
1347 return QPointF( 0, 0 );
1352 const QPointF itemPosition = mapFromScene( position );
1353 const QPointF adjustedPointInsideItem = itemPosition - itemPositionAtReferencePoint( reference, size );
1354 return mapToScene( adjustedPointInsideItem );
1359 const QPointF pointWithinItem = itemPositionAtReferencePoint( reference, rect().size() );
1360 return mapToScene( pointWithinItem );
1365 const QPointF topLeft =
mLayout->convertToLayoutUnits( point );
1366 const QPointF refPoint = topLeft + itemPositionAtReferencePoint( mReferencePoint, rect().size() );
1367 return mLayout->convertFromLayoutUnits( refPoint, point.
units() );
1381void QgsLayoutItem::initConnectionsToLayout()
1388void QgsLayoutItem::preparePainter( QPainter *painter )
1390 if ( !painter || !painter->device() )
1395 painter->setRenderHint( QPainter::Antialiasing, shouldDrawAntialiased() );
1400bool QgsLayoutItem::shouldDrawAntialiased()
const
1409bool QgsLayoutItem::shouldDrawDebugRect()
const
1414QSizeF QgsLayoutItem::applyMinimumSize(
const QSizeF targetSize )
1420 const QSizeF minimumSizeLayoutUnits =
mLayout->convertToLayoutUnits(
minimumSize() );
1421 return targetSize.expandedTo( minimumSizeLayoutUnits );
1424QSizeF QgsLayoutItem::applyFixedSize(
const QSizeF targetSize )
1431 QSizeF size = targetSize;
1432 const QSizeF fixedSizeLayoutUnits =
mLayout->convertToLayoutUnits(
fixedSize() );
1433 if ( fixedSizeLayoutUnits.width() > 0 )
1434 size.setWidth( fixedSizeLayoutUnits.width() );
1435 if ( fixedSizeLayoutUnits.height() > 0 )
1436 size.setHeight( fixedSizeLayoutUnits.height() );
1443 double r = mItemRotation;
1455 if ( !transformPoint.isNull() )
1459 QLineF refLine = QLineF( mapToScene( transformPoint ), mapToScene( QPointF( 0, 0 ) ) );
1461 refLine.setAngle( refLine.angle() - r + rotation() );
1463 const QPointF rotatedReferencePoint = refLine.p2();
1464 setPos( rotatedReferencePoint );
1467 setTransformOriginPoint( 0, 0 );
1468 QGraphicsItem::setRotation( r );
1471 updateStoredItemPosition();
1486 mEvaluatedOpacity = opacity / 100.0;
1492 setOpacity( mEvaluatedOpacity );
1505 setPen( Qt::NoPen );
1515 itemPen = QPen( frameColor );
1519 itemPen = QPen( mFrameColor );
1521 itemPen.setJoinStyle( mFrameJoinStyle );
1524 itemPen.setWidthF(
mLayout->convertToLayoutUnits( mFrameWidth ) );
1526 itemPen.setWidthF( mFrameWidth.length() );
1538 return useDataDefined ? brush().color() : mBackgroundColor;
1553 setBrush( QBrush( mBackgroundColor, Qt::SolidPattern ) );
1563 QPainter::CompositionMode
blendMode = mBlendMode;
1568 if ( ok && !blendStr.isEmpty() )
1570 const QString blendstr = blendStr.trimmed();
1580 setCacheMode( QGraphicsItem::DeviceCoordinateCache );
1582 setCacheMode( QGraphicsItem::NoCache );
@ ForceVector
Always force vector-based rendering, even when the result will be visually different to a raster-base...
LayoutUnit
Layout measurement units.
@ Millimeters
Millimeters.
BlendMode
Blending modes defining the available composition modes that can be used when painting.
@ Debug
Debug/testing mode, items are drawn as solid rectangles.
@ LosslessImageRendering
Render images losslessly whenever possible, instead of the default lossy jpeg rendering used for some...
@ Antialiasing
Use antialiasing when drawing items.
Base class for commands to undo/redo layout and layout object changes.
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 QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
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.
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.
double viewScaleFactor() const
Returns the current view zoom (scale factor).
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.
friend class QgsLayoutItemGroup
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.
QColor backgroundColor(bool useDataDefined=true) const
Returns the background color for this item.
void drawRefreshingOverlay(QPainter *painter, const QStyleOptionGraphicsItem *itemStyle)
Draws a "refreshing" overlay icon on the item.
bool writeXml(QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context) const
Stores the item state in a DOM element.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::DataDefinedProperty::AllProperties)
Refreshes a data defined property for the item by reevaluating the property's value and redrawing the...
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.
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 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.
@ FlagDisableSceneCaching
Item should not have QGraphicsItem caching enabled.
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....
virtual bool isRefreshing() const
Returns true if the item is currently refreshing content in the background.
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.
Provides a method of storing measurements for use in QGIS layouts using a variety of different measur...
static QgsLayoutMeasurement decodeMeasurement(const QString &string)
Decodes a measurement from a string.
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
QgsExpressionContext createExpressionContext() const override
Creates an expression context relating to the objects' current state.
DataDefinedProperty
Data defined properties for different item types.
@ PositionX
X position on page.
@ ItemWidth
Width of item.
@ ExcludeFromExports
Exclude item from exports.
@ ItemRotation
Rotation of item.
@ PositionY
Y position on page.
@ PaperOrientation
Paper orientation.
@ ItemHeight
Height of item.
@ BackgroundColor
Item background color.
@ BlendMode
Item blend mode.
@ PresetPaperSize
Preset paper size for composition.
@ FrameColor
Item frame color.
@ AllProperties
All properties for item.
QgsLayoutObject(QgsLayout *layout)
Constructor for QgsLayoutObject, with the specified parent layout.
bool writeObjectPropertiesToElement(QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context) const
Stores object properties within an XML DOM element.
Provides a method of storing points, consisting of an x and y coordinate, for use in QGIS layouts.
double x() const
Returns x coordinate of point.
QPointF toQPointF() const
Converts the layout point to a QPointF.
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.
Provides a method of storing sizes, consisting of a width and height, for use in QGIS layouts.
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.
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.
@ ZItem
Minimum z value for items.
A named page size for layouts.
QgsLayoutSize size
Page size.
static Qgis::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a Qgis::BlendMode corresponding to a QPainter::CompositionMode.
static QPainter::CompositionMode getCompositionMode(Qgis::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a Qgis::BlendMode.
A container for the context for various read/write operations on 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.
QImage svgAsImage(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, bool &fitsInCache, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >())
Returns an SVG drawing as a QImage.
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
static QPainter::CompositionMode decodeBlendMode(const QString &s)
static QString encodePenJoinStyle(Qt::PenJoinStyle style)
#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.