Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgslayoutobject.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 : : * *
11 : : * This program is free software; you can redistribute it and/or modify *
12 : : * it under the terms of the GNU General Public License as published by *
13 : : * the Free Software Foundation; either version 2 of the License, or *
14 : : * (at your option) any later version. *
15 : : * *
16 : : ***************************************************************************/
17 : : #ifndef QGSLAYOUTOBJECT_H
18 : : #define QGSLAYOUTOBJECT_H
19 : :
20 : : #include "qgis_core.h"
21 : : #include "qgis_sip.h"
22 : : #include "qgspropertycollection.h"
23 : : #include "qgsobjectcustomproperties.h"
24 : : #include "qgsexpressioncontextgenerator.h"
25 : : #include <QObject>
26 : : #include <QDomNode>
27 : : #include <QMap>
28 : : #include <QPointer>
29 : :
30 : : class QgsLayout;
31 : : class QPainter;
32 : : class QgsReadWriteContext;
33 : :
34 : : /**
35 : : * \ingroup core
36 : : * \brief A base class for objects which belong to a layout.
37 : : * \since QGIS 3.0
38 : : */
39 : 0 : class CORE_EXPORT QgsLayoutObject: public QObject, public QgsExpressionContextGenerator
40 : : {
41 : : #ifdef SIP_RUN
42 : : #include <qgslayoutitem.h>
43 : : #include "qgslayoutitemgroup.h"
44 : : #include "qgslayoutitemmap.h"
45 : : #include "qgslayoutitempicture.h"
46 : : #include "qgslayoutitemlabel.h"
47 : : #include "qgslayoutitemlegend.h"
48 : : #include "qgslayoutitempolygon.h"
49 : : #include "qgslayoutitempolyline.h"
50 : : #include "qgslayoutitemscalebar.h"
51 : : #include "qgslayoutframe.h"
52 : : #include "qgslayoutitemshape.h"
53 : : #include "qgslayoutitempage.h"
54 : : #endif
55 : :
56 : : #ifdef SIP_RUN
57 : : SIP_CONVERT_TO_SUBCLASS_CODE
58 : : if ( QgsLayoutItem *item = qobject_cast< QgsLayoutItem * >( sipCpp ) )
59 : : {
60 : : // the conversions have to be static, because they're using multiple inheritance
61 : : // (seen in PyQt4 .sip files for some QGraphicsItem classes)
62 : : switch ( item->type() )
63 : : {
64 : : // FREAKKKKIIN IMPORTANT!
65 : : // IF YOU PUT SOMETHING HERE, PUT IT IN QgsLayoutItem CASTING **ALSO**
66 : : // (it's not enough for it to be in only one of the places, as sip inconsistently
67 : : // decides which casting code to perform here)
68 : :
69 : : // really, these *should* use the constants from QgsLayoutItemRegistry, but sip doesn't like that!
70 : : case QGraphicsItem::UserType + 101:
71 : : sipType = sipType_QgsLayoutItemGroup;
72 : : *sipCppRet = static_cast<QgsLayoutItemGroup *>( sipCpp );
73 : : break;
74 : : case QGraphicsItem::UserType + 102:
75 : : sipType = sipType_QgsLayoutItemPage;
76 : : *sipCppRet = static_cast<QgsLayoutItemPage *>( sipCpp );
77 : : break;
78 : : case QGraphicsItem::UserType + 103:
79 : : sipType = sipType_QgsLayoutItemMap;
80 : : *sipCppRet = static_cast<QgsLayoutItemMap *>( sipCpp );
81 : : break;
82 : : case QGraphicsItem::UserType + 104:
83 : : sipType = sipType_QgsLayoutItemPicture;
84 : : *sipCppRet = static_cast<QgsLayoutItemPicture *>( sipCpp );
85 : : break;
86 : : case QGraphicsItem::UserType + 105:
87 : : sipType = sipType_QgsLayoutItemLabel;
88 : : *sipCppRet = static_cast<QgsLayoutItemLabel *>( sipCpp );
89 : : break;
90 : : case QGraphicsItem::UserType + 106:
91 : : sipType = sipType_QgsLayoutItemLegend;
92 : : *sipCppRet = static_cast<QgsLayoutItemLegend *>( sipCpp );
93 : : break;
94 : : case QGraphicsItem::UserType + 107:
95 : : sipType = sipType_QgsLayoutItemShape;
96 : : *sipCppRet = static_cast<QgsLayoutItemShape *>( sipCpp );
97 : : break;
98 : : case QGraphicsItem::UserType + 108:
99 : : sipType = sipType_QgsLayoutItemPolygon;
100 : : *sipCppRet = static_cast<QgsLayoutItemPolygon *>( sipCpp );
101 : : break;
102 : : case QGraphicsItem::UserType + 109:
103 : : sipType = sipType_QgsLayoutItemPolyline;
104 : : *sipCppRet = static_cast<QgsLayoutItemPolyline *>( sipCpp );
105 : : break;
106 : : case QGraphicsItem::UserType + 110:
107 : : sipType = sipType_QgsLayoutItemScaleBar;
108 : : *sipCppRet = static_cast<QgsLayoutItemScaleBar *>( sipCpp );
109 : : break;
110 : : case QGraphicsItem::UserType + 111:
111 : : sipType = sipType_QgsLayoutFrame;
112 : : *sipCppRet = static_cast<QgsLayoutFrame *>( sipCpp );
113 : : break;
114 : :
115 : : // did you read that comment above? NO? Go read it now. You're about to break stuff.
116 : :
117 : : default:
118 : : sipType = sipType_QgsLayoutItem;
119 : : }
120 : : }
121 : : else
122 : : sipType = NULL;
123 : : SIP_END
124 : : #endif
125 : :
126 : 0 : Q_OBJECT
127 : : public:
128 : :
129 : : /**
130 : : * Data defined properties for different item types
131 : : */
132 : : enum DataDefinedProperty
133 : : {
134 : : NoProperty = 0, //!< No property
135 : : AllProperties, //!< All properties for item
136 : : TestProperty, //!< Dummy property with no effect on item
137 : : //composer page properties
138 : : PresetPaperSize, //!< Preset paper size for composition
139 : : PaperWidth, //!< Paper width (deprecated)
140 : : PaperHeight, //!< Paper height (deprecated)
141 : : NumPages, //!< Number of pages in composition (deprecated)
142 : : PaperOrientation, //!< Paper orientation
143 : : //general composer item properties
144 : : PageNumber, //!< Page number for item placement
145 : : PositionX, //!< X position on page
146 : : PositionY, //!< Y position on page
147 : : ItemWidth, //!< Width of item
148 : : ItemHeight, //!< Height of item
149 : : ItemRotation, //!< Rotation of item
150 : : Transparency, //!< Item transparency (deprecated)
151 : : Opacity, //!< Item opacity
152 : : BlendMode, //!< Item blend mode
153 : : ExcludeFromExports, //!< Exclude item from exports
154 : : FrameColor, //!< Item frame color
155 : : BackgroundColor, //!< Item background color
156 : : //composer map
157 : : MapRotation, //!< Map rotation
158 : : MapScale, //!< Map scale
159 : : MapXMin, //!< Map extent x minimum
160 : : MapYMin, //!< Map extent y minimum
161 : : MapXMax, //!< Map extent x maximum
162 : : MapYMax, //!< Map extent y maximum
163 : : MapAtlasMargin, //!< Map atlas margin
164 : : MapLayers, //!< Map layer set
165 : : MapStylePreset, //!< Layer and style map theme
166 : : MapLabelMargin, //!< Map label margin
167 : : MapGridEnabled, //!< Map grid enabled
168 : : MapGridIntervalX, //!< Map grid interval X
169 : : MapGridIntervalY, //!< Map grid interval Y
170 : : MapGridOffsetX, //!< Map grid offset X
171 : : MapGridOffsetY, //!< Map grid offset Y
172 : : MapGridFrameSize, //!< Map grid frame size
173 : : MapGridFrameMargin, //!< Map grid frame margin
174 : : MapGridLabelDistance, //!< Map grid label distance
175 : : MapGridCrossSize, //!< Map grid cross size
176 : : MapGridFrameLineThickness, //!< Map grid frame line thickness
177 : : MapGridAnnotationDisplayLeft, //!< Map annotation display left
178 : : MapGridAnnotationDisplayRight, //!< Map annotation display right
179 : : MapGridAnnotationDisplayTop, //!< Map annotation display top
180 : : MapGridAnnotationDisplayBottom, //!< Map annotation display bottom
181 : : MapGridFrameDivisionsLeft, //!< Map frame division display left
182 : : MapGridFrameDivisionsRight, //!< Map frame division display right
183 : : MapGridFrameDivisionsTop, //!< Map frame division display top
184 : : MapGridFrameDivisionsBottom, //!< Map frame division display bottom
185 : : //composer picture
186 : : PictureSource, //!< Picture source url
187 : : PictureSvgBackgroundColor, //!< SVG background color
188 : : PictureSvgStrokeColor, //!< SVG stroke color
189 : : PictureSvgStrokeWidth, //!< SVG stroke width
190 : : //html item
191 : : SourceUrl, //!< Html source url
192 : : //legend item
193 : : LegendTitle, //!< Legend title
194 : : LegendColumnCount, //!< Legend column count
195 : : //scalebar item
196 : : ScalebarFillColor, //!< Scalebar fill color (deprecated, use data defined properties on scalebar fill symbol 1 instead)
197 : : ScalebarFillColor2, //!< Scalebar secondary fill color (deprecated, use data defined properties on scalebar fill symbol 2 instead)
198 : : ScalebarLineColor, //!< Scalebar line color (deprecated, use data defined properties on scalebar line symbol instead)
199 : : ScalebarLineWidth, //!< Scalebar line width (deprecated, use data defined properties on scalebar line symbol instead)
200 : : //table item
201 : : AttributeTableSourceLayer, //!< Attribute table source layer
202 : : MapCrs, //!< Map CRS
203 : : StartDateTime, //!< Temporal range's start DateTime
204 : : EndDateTime, //!< Temporal range's end DateTime
205 : : };
206 : :
207 : : /**
208 : : * Specifies whether the value returned by a function should be the original, user
209 : : * set value, or the current evaluated value for the property. This may differ if
210 : : * a property has a data defined expression active.
211 : : */
212 : : enum PropertyValueType
213 : : {
214 : : EvaluatedValue = 0, //!< Return the current evaluated value for the property
215 : : OriginalValue //!< Return the original, user set value
216 : : };
217 : :
218 : : /**
219 : : * Returns the layout object property definitions.
220 : : */
221 : : static const QgsPropertiesDefinition &propertyDefinitions();
222 : :
223 : : /**
224 : : * Returns TRUE if the specified \a property key is normally associated with the parent
225 : : * QgsLayoutMultiFrame object instead of a child QgsLayoutFrame object.
226 : : *
227 : : * While some properties like QgsLayoutObject::DataDefinedProperty::PositionX and QgsLayoutObject::DataDefinedProperty::ItemWidth
228 : : * are typically associated with a direct QgsLayoutItem subclass (including QgsLayoutFrame objects), other properties
229 : : * are instead associated with a QgsLayoutMultiFrame object (such as QgsLayoutObject::DataDefinedProperty::SourceUrl or QgsLayoutObject::DataDefinedProperty::AttributeTableSourceLayer).
230 : : *
231 : : * \since QGIS 3.18.1
232 : : */
233 : : static bool propertyAssociatesWithParentMultiframe( DataDefinedProperty property );
234 : :
235 : : /**
236 : : * Constructor for QgsLayoutObject, with the specified parent \a layout.
237 : : * \note While ownership of a QgsLayoutObject is not passed to the layout,
238 : : * classes which are derived from QgsLayoutObject (such as QgsLayoutItem)
239 : : * may transfer their ownership to a layout upon construction.
240 : : */
241 : : explicit QgsLayoutObject( QgsLayout *layout );
242 : :
243 : : /**
244 : : * Returns the layout the object is attached to.
245 : : */
246 : : SIP_SKIP const QgsLayout *layout() const;
247 : :
248 : : /**
249 : : * Returns the layout the object is attached to.
250 : : */
251 : : QgsLayout *layout();
252 : :
253 : : /**
254 : : * Returns a reference to the object's property collection, used for data defined overrides.
255 : : * \see setDataDefinedProperties()
256 : : */
257 : 0 : QgsPropertyCollection &dataDefinedProperties() { return mDataDefinedProperties; }
258 : :
259 : : /**
260 : : * Returns a reference to the object's property collection, used for data defined overrides.
261 : : * \see setDataDefinedProperties()
262 : : * \see DataDefinedProperty
263 : : */
264 : : const QgsPropertyCollection &dataDefinedProperties() const { return mDataDefinedProperties; } SIP_SKIP
265 : :
266 : : /**
267 : : * Sets the objects's property collection, used for data defined overrides.
268 : : * \param collection property collection. Existing properties will be replaced.
269 : : * \see dataDefinedProperties()
270 : : * \see DataDefinedProperty
271 : : */
272 : : void setDataDefinedProperties( const QgsPropertyCollection &collection ) { mDataDefinedProperties = collection; }
273 : :
274 : :
275 : : /**
276 : : * Set a custom property for the object.
277 : : * \param key property key. If a property with the same key already exists it will be overwritten.
278 : : * \param value property value
279 : : * \see customProperty()
280 : : * \see removeCustomProperty()
281 : : * \see customProperties()
282 : : */
283 : : void setCustomProperty( const QString &key, const QVariant &value );
284 : :
285 : : /**
286 : : * Read a custom property from the object.
287 : : * \param key property key
288 : : * \param defaultValue default value to return if property with matching key does not exist
289 : : * \returns value of matching property
290 : : * \see setCustomProperty()
291 : : * \see removeCustomProperty()
292 : : * \see customProperties()
293 : : */
294 : : QVariant customProperty( const QString &key, const QVariant &defaultValue = QVariant() ) const;
295 : :
296 : : /**
297 : : * Remove a custom property from the object.
298 : : * \param key property key
299 : : * \see setCustomProperty()
300 : : * \see customProperty()
301 : : * \see customProperties()
302 : : */
303 : : void removeCustomProperty( const QString &key );
304 : :
305 : : /**
306 : : * Returns list of keys stored in custom properties for the object.
307 : : * \see setCustomProperty()
308 : : * \see customProperty()
309 : : * \see removeCustomProperty()
310 : : */
311 : : QStringList customProperties() const;
312 : :
313 : : /**
314 : : * Creates an expression context relating to the objects' current state. The context includes
315 : : * scopes for global, project and layout properties.
316 : : */
317 : : QgsExpressionContext createExpressionContext() const override;
318 : :
319 : : public slots:
320 : :
321 : : /**
322 : : * Refreshes the object, causing a recalculation of any property overrides.
323 : : */
324 : 0 : virtual void refresh() {}
325 : :
326 : : signals:
327 : :
328 : : /**
329 : : * Emitted when the object's properties change.
330 : : */
331 : : void changed();
332 : :
333 : : protected:
334 : :
335 : : /**
336 : : * Stores object properties within an XML DOM element.
337 : : * \param parentElement is the parent DOM element to store the object's properties in
338 : : * \param document DOM document
339 : : * \param context read write context
340 : : * \returns TRUE if write was successful
341 : : * \see readObjectPropertiesFromElement()
342 : : */
343 : : bool writeObjectPropertiesToElement( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context ) const;
344 : :
345 : : /**
346 : : * Sets object properties from a DOM element
347 : : * \param parentElement is the parent DOM element for the object
348 : : * \param document DOM document
349 : : * \param context read write context
350 : : * \returns TRUE if read was successful
351 : : * \see writeObjectPropertiesToElement()
352 : : */
353 : : bool readObjectPropertiesFromElement( const QDomElement &parentElement, const QDomDocument &document, const QgsReadWriteContext &context );
354 : :
355 : : QPointer< QgsLayout > mLayout;
356 : :
357 : : QgsPropertyCollection mDataDefinedProperties;
358 : :
359 : : //! Custom properties for object
360 : : QgsObjectCustomProperties mCustomProperties;
361 : :
362 : : private:
363 : :
364 : : //! Property definitions
365 : : static QgsPropertiesDefinition sPropertyDefinitions;
366 : :
367 : : static void initPropertyDefinitions();
368 : :
369 : : friend class TestQgsLayoutObject;
370 : : friend class QgsCompositionConverter;
371 : : };
372 : :
373 : : #endif //QGSLAYOUTOBJECT_H
|