QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgslayoutframe.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslayoutframe.cpp
3 ------------------
4 begin : October 2017
5 copyright : (C) 2017 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#include "qgslayoutframe.h"
17#include "qgslayoutmultiframe.h"
19#include "qgslayout.h"
21
23 : QgsLayoutItem( layout )
24 , mMultiFrame( multiFrame )
25 , mMultiFrameUuid( multiFrame ? multiFrame->uuid() : QString() )
26{
27
28 //default to no background
29 setBackgroundEnabled( false );
30
31 if ( multiFrame )
32 {
33 //repaint frame when multiframe content changes
35 {
36 update();
37 } );
38
39 //force recalculation of rect, so that multiframe specified sizes can be applied
41 }
42}
43
45{
47}
48
50{
51 return new QgsLayoutFrame( layout, nullptr );
52}
53
55{
56 return mMultiFrame;
57}
58
60{
61 if ( !mMultiFrame )
62 return QgsLayoutSize();
63
64 //calculate index of frame
65 const int frameIndex = mMultiFrame->frameIndex( const_cast< QgsLayoutFrame * >( this ) );
66 //check minimum size
67 return QgsLayoutSize( mMultiFrame->minFrameSize( frameIndex ), Qgis::LayoutUnit::Millimeters );
68}
69
71{
72 if ( !mMultiFrame )
73 return QgsLayoutSize();
74
75 //calculate index of frame
76 const int frameIndex = mMultiFrame->frameIndex( const_cast< QgsLayoutFrame * >( this ) );
77 //check fixed size
78 return QgsLayoutSize( mMultiFrame->fixedFrameSize( frameIndex ), Qgis::LayoutUnit::Millimeters );
79}
80
82{
84}
85
87{
88 if ( mMultiFrame )
89 return mMultiFrame->icon();
90 else
91 return QIcon();
92}
93
94void QgsLayoutFrame::setHidePageIfEmpty( const bool hidePageIfEmpty )
95{
96 mHidePageIfEmpty = hidePageIfEmpty;
97}
98
99void QgsLayoutFrame::setHideBackgroundIfEmpty( const bool hideBackgroundIfEmpty )
100{
101 if ( hideBackgroundIfEmpty == mHideBackgroundIfEmpty )
102 {
103 return;
104 }
105
106 mHideBackgroundIfEmpty = hideBackgroundIfEmpty;
107 update();
108}
109
111{
112 if ( !mMultiFrame )
113 {
114 return true;
115 }
116
117 const double multiFrameHeight = mMultiFrame->totalSize().height();
118 if ( multiFrameHeight <= mSection.top() )
119 {
120 //multiframe height is less than top of this frame's visible portion
121 return true;
122 }
123
124 return false;
125
126}
127
129{
130 if ( !mMultiFrame )
132
133 //start with multiframe's context
134 QgsExpressionContext context = mMultiFrame->createExpressionContext();
135
136 //add frame's individual context
138
139 return context;
140}
141
143{
145}
146
148{
149 if ( !id().isEmpty() )
150 {
151 return id();
152 }
153
154 if ( mMultiFrame )
155 {
156 return mMultiFrame->displayName();
157 }
158
159 return tr( "<Frame>" );
160}
161
163{
164 if ( mMultiFrame )
165 mMultiFrame->handleFrameRemoval( this );
166 mMultiFrame = nullptr;
167
169}
170
172{
173 if ( mMultiFrame )
174 {
175 //calculate index of frame
176 const int frameIndex = mMultiFrame->frameIndex( this );
177 Q_ASSERT_X( frameIndex >= 0, "QgsLayoutFrame::draw", "Invalid frame index for frame" );
178 mMultiFrame->render( context, mSection, frameIndex );
179 }
180}
181
183{
184 if ( !isEmpty() || !mHideBackgroundIfEmpty )
185 {
186 QgsLayoutItem::drawFrame( context );
187 }
188}
189
191{
192 if ( !isEmpty() || !mHideBackgroundIfEmpty )
193 {
195 }
196}
197
198bool QgsLayoutFrame::writePropertiesToElement( QDomElement &parentElement, QDomDocument &, const QgsReadWriteContext & ) const
199{
200 parentElement.setAttribute( QStringLiteral( "multiFrame" ), mMultiFrameUuid );
201 parentElement.setAttribute( QStringLiteral( "multiFrameTemplateUuid" ), mMultiFrameUuid );
202 parentElement.setAttribute( QStringLiteral( "sectionX" ), QString::number( mSection.x() ) );
203 parentElement.setAttribute( QStringLiteral( "sectionY" ), QString::number( mSection.y() ) );
204 parentElement.setAttribute( QStringLiteral( "sectionWidth" ), QString::number( mSection.width() ) );
205 parentElement.setAttribute( QStringLiteral( "sectionHeight" ), QString::number( mSection.height() ) );
206 parentElement.setAttribute( QStringLiteral( "hidePageIfEmpty" ), mHidePageIfEmpty );
207 parentElement.setAttribute( QStringLiteral( "hideBackgroundIfEmpty" ), mHideBackgroundIfEmpty );
208 return true;
209}
210
211bool QgsLayoutFrame::readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &, const QgsReadWriteContext & )
212{
213 const double x = itemElem.attribute( QStringLiteral( "sectionX" ) ).toDouble();
214 const double y = itemElem.attribute( QStringLiteral( "sectionY" ) ).toDouble();
215 const double width = itemElem.attribute( QStringLiteral( "sectionWidth" ) ).toDouble();
216 const double height = itemElem.attribute( QStringLiteral( "sectionHeight" ) ).toDouble();
217 mSection = QRectF( x, y, width, height );
218 mHidePageIfEmpty = itemElem.attribute( QStringLiteral( "hidePageIfEmpty" ), QStringLiteral( "0" ) ).toInt();
219 mHideBackgroundIfEmpty = itemElem.attribute( QStringLiteral( "hideBackgroundIfEmpty" ), QStringLiteral( "0" ) ).toInt();
220
221 mMultiFrameUuid = itemElem.attribute( QStringLiteral( "multiFrame" ) );
222 if ( mMultiFrameUuid.isEmpty( ) )
223 {
224 mMultiFrameUuid = itemElem.attribute( QStringLiteral( "multiFrameTemplateUuid" ) );
225 }
226 mMultiFrame = mLayout->multiFrameByUuid( mMultiFrameUuid );
227 return true;
228}
@ Millimeters
Millimeters.
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.
Base class for frame items, which form a layout multiframe item.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsLayoutSize fixedSize() const override
Returns the fixed size of the item, if applicable, or an empty size if item can be freely resized.
bool isEmpty() const
Returns whether the frame is empty.
int type() const override
QIcon icon() const override
Returns the item's icon.
bool readPropertiesFromElement(const QDomElement &itemElement, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
QgsLayoutFrame(QgsLayout *layout, QgsLayoutMultiFrame *multiFrame)
Constructor for QgsLayoutFrame, with the specified parent layout and belonging to a multiFrame.
void drawBackground(QgsRenderContext &context) override
Draws the background for the item.
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
~QgsLayoutFrame() override
QgsLayoutMultiFrame * multiFrame() const
Returns the parent multiframe for the frame.
QString displayName() const override
Gets item display name.
static QgsLayoutFrame * create(QgsLayout *layout)
Creates a new QgsLayoutFrame belonging to the specified layout.
ExportLayerBehavior exportLayerBehavior() const override
Returns the behavior of this item during exporting to layered exports (e.g.
bool writePropertiesToElement(QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
bool hideBackgroundIfEmpty() const
Returns whether the background and frame stroke should be hidden if this frame is empty.
bool hidePageIfEmpty() const
Returns whether the page should be hidden (ie, not included in layout exports) if this frame is empty...
void setHideBackgroundIfEmpty(bool hideBackgroundIfEmpty)
Sets whether the background and frame stroke should be hidden if this frame is empty.
void drawFrame(QgsRenderContext &context) override
Draws the frame around the item.
void setHidePageIfEmpty(bool hidePageIfEmpty)
Sets whether the page should be hidden (ie, not included in layout exports) if this frame is empty.
QgsLayoutSize minimumSize() const override
Returns the minimum allowed size of the item, if applicable, or an empty size if item can be freely r...
void cleanup() override
Called just before a batch of items are deleted, allowing them to run cleanup tasks.
@ LayoutFrame
Frame item, part of a QgsLayoutMultiFrame object.
Contains settings and helpers relating to a render of a QgsLayoutItem.
Definition: qgslayoutitem.h:43
Base class for graphical items within a QgsLayout.
virtual void drawFrame(QgsRenderContext &context)
Draws the frame around the item.
virtual void cleanup()
Called just before a batch of items are deleted, allowing them to run cleanup tasks.
void refreshItemSize()
Refreshes an item's size by rechecking it against any possible item fixed or minimum sizes.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
virtual void drawBackground(QgsRenderContext &context)
Draws the background for the item.
QString id() const
Returns the item's ID name.
ExportLayerBehavior
Behavior of item when exporting to layered outputs.
@ CanGroupWithItemsOfSameType
Item can only be placed on layers with other items of the same type, but multiple items of this type ...
void setBackgroundEnabled(bool drawBackground)
Sets whether this item has a background drawn under it or not.
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
virtual QSizeF totalSize() const =0
Returns the total size of the multiframe's content, in layout units.
void contentsChanged()
Emitted when the contents of the multi frame have changed and the frames must be redrawn.
virtual QSizeF fixedFrameSize(int frameIndex=-1) const
Returns the fixed size for a frame, if desired.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
virtual QIcon icon() const
Returns the item's icon.
virtual QSizeF minFrameSize(int frameIndex=-1) const
Returns the minimum size for a frames, if desired.
int frameIndex(QgsLayoutFrame *frame) const
Returns the index of a frame within the multiframe.
virtual QString displayName() const
Returns the multiframe display name.
virtual void render(QgsLayoutItemRenderContext &context, const QRectF &renderExtent, int frameIndex)=0
Renders a portion of the multiframe's content into a render context.
const QgsLayout * layout() const
Returns the layout the object is attached to.
QPointer< QgsLayout > mLayout
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
Definition: qgslayoutsize.h:40
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:49
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.