Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgslayoutobject.cpp
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 : :
18 : : #include <QPainter>
19 : :
20 : : #include "qgslayout.h"
21 : : #include "qgslayoutrendercontext.h"
22 : : #include "qgslayoutreportcontext.h"
23 : : #include "qgslayoutobject.h"
24 : : #include "qgsfeedback.h"
25 : : #include "qgsexpressioncontextutils.h"
26 : :
27 : :
28 : 5 : QgsPropertiesDefinition QgsLayoutObject::sPropertyDefinitions;
29 : :
30 : 0 : void QgsLayoutObject::initPropertyDefinitions()
31 : : {
32 : 0 : if ( !sPropertyDefinitions.isEmpty() )
33 : 0 : return;
34 : :
35 : 0 : sPropertyDefinitions = QgsPropertiesDefinition
36 : 0 : {
37 : 0 : { QgsLayoutObject::TestProperty, QgsPropertyDefinition( "dataDefinedProperty", QgsPropertyDefinition::DataTypeString, "invalid property", QString() ) },
38 : 0 : {
39 : 0 : QgsLayoutObject::PresetPaperSize, QgsPropertyDefinition( "dataDefinedPaperSize", QgsPropertyDefinition::DataTypeString, QObject::tr( "Paper size" ), QObject::tr( "string " ) + QLatin1String( "[<b>A5</b>|<b>A4</b>|<b>A3</b>|<b>A2</b>|<b>A1</b>|<b>A0</b>"
40 : : "|<b>B5</b>|<b>B4</b>|<b>B3</b>|<b>B2</b>|<b>B1</b>|<b>B0</b>"
41 : : "|<b>Legal</b>|<b>Ansi A</b>|<b>Ansi B</b>|<b>Ansi C</b>|<b>Ansi D</b>|<b>Ansi E</b>"
42 : : "|<b>Arch A</b>|<b>Arch B</b>|<b>Arch C</b>|<b>Arch D</b>|<b>Arch E</b>|<b>Arch E1</b>]"
43 : : ) )
44 : : },
45 : 0 : { QgsLayoutObject::PaperWidth, QgsPropertyDefinition( "dataDefinedPaperWidth", QObject::tr( "Page width" ), QgsPropertyDefinition::DoublePositive ) },
46 : 0 : { QgsLayoutObject::PaperHeight, QgsPropertyDefinition( "dataDefinedPaperHeight", QObject::tr( "Page height" ), QgsPropertyDefinition::DoublePositive ) },
47 : 0 : { QgsLayoutObject::NumPages, QgsPropertyDefinition( "dataDefinedNumPages", QObject::tr( "Number of pages" ), QgsPropertyDefinition::IntegerPositive ) },
48 : 0 : { QgsLayoutObject::PaperOrientation, QgsPropertyDefinition( "dataDefinedPaperOrientation", QgsPropertyDefinition::DataTypeString, QObject::tr( "Symbol size" ), QObject::tr( "string " ) + QLatin1String( "[<b>portrait</b>|<b>landscape</b>]" ) ) },
49 : 0 : { QgsLayoutObject::PageNumber, QgsPropertyDefinition( "dataDefinedPageNumber", QObject::tr( "Page number" ), QgsPropertyDefinition::IntegerPositive ) },
50 : 0 : { QgsLayoutObject::PositionX, QgsPropertyDefinition( "dataDefinedPositionX", QObject::tr( "Position (X)" ), QgsPropertyDefinition::Double ) },
51 : 0 : { QgsLayoutObject::PositionY, QgsPropertyDefinition( "dataDefinedPositionY", QObject::tr( "Position (Y)" ), QgsPropertyDefinition::Double ) },
52 : 0 : { QgsLayoutObject::ItemWidth, QgsPropertyDefinition( "dataDefinedWidth", QObject::tr( "Width" ), QgsPropertyDefinition::DoublePositive ) },
53 : 0 : { QgsLayoutObject::ItemHeight, QgsPropertyDefinition( "dataDefinedHeight", QObject::tr( "Height" ), QgsPropertyDefinition::DoublePositive ) },
54 : 0 : { QgsLayoutObject::ItemRotation, QgsPropertyDefinition( "dataDefinedRotation", QObject::tr( "Rotation angle" ), QgsPropertyDefinition::Rotation ) },
55 : 0 : { QgsLayoutObject::Transparency, QgsPropertyDefinition( "dataDefinedTransparency", QObject::tr( "Transparency" ), QgsPropertyDefinition::Opacity ) },
56 : 0 : { QgsLayoutObject::Opacity, QgsPropertyDefinition( "dataDefinedOpacity", QObject::tr( "Opacity" ), QgsPropertyDefinition::Opacity ) },
57 : 0 : { QgsLayoutObject::BlendMode, QgsPropertyDefinition( "dataDefinedBlendMode", QObject::tr( "Blend mode" ), QgsPropertyDefinition::BlendMode ) },
58 : 0 : { QgsLayoutObject::ExcludeFromExports, QgsPropertyDefinition( "dataDefinedExcludeExports", QObject::tr( "Exclude item from exports" ), QgsPropertyDefinition::Boolean ) },
59 : 0 : { QgsLayoutObject::FrameColor, QgsPropertyDefinition( "dataDefinedFrameColor", QObject::tr( "Frame color" ), QgsPropertyDefinition::ColorWithAlpha ) },
60 : 0 : { QgsLayoutObject::BackgroundColor, QgsPropertyDefinition( "dataDefinedBackgroundColor", QObject::tr( "Background color" ), QgsPropertyDefinition::ColorWithAlpha ) },
61 : 0 : { QgsLayoutObject::MapRotation, QgsPropertyDefinition( "dataDefinedMapRotation", QObject::tr( "Map rotation" ), QgsPropertyDefinition::Rotation ) },
62 : 0 : { QgsLayoutObject::MapScale, QgsPropertyDefinition( "dataDefinedMapScale", QObject::tr( "Map scale" ), QgsPropertyDefinition::DoublePositive ) },
63 : 0 : { QgsLayoutObject::MapXMin, QgsPropertyDefinition( "dataDefinedMapXMin", QObject::tr( "Extent minimum X" ), QgsPropertyDefinition::Double ) },
64 : 0 : { QgsLayoutObject::MapYMin, QgsPropertyDefinition( "dataDefinedMapYMin", QObject::tr( "Extent minimum Y" ), QgsPropertyDefinition::Double ) },
65 : 0 : { QgsLayoutObject::MapXMax, QgsPropertyDefinition( "dataDefinedMapXMax", QObject::tr( "Extent maximum X" ), QgsPropertyDefinition::Double ) },
66 : 0 : { QgsLayoutObject::MapYMax, QgsPropertyDefinition( "dataDefinedMapYMax", QObject::tr( "Extent maximum Y" ), QgsPropertyDefinition::Double ) },
67 : 0 : { QgsLayoutObject::MapLabelMargin, QgsPropertyDefinition( "dataDefinedMapLabelMargin", QObject::tr( "Label margin" ), QgsPropertyDefinition::DoublePositive ) },
68 : 0 : { QgsLayoutObject::MapAtlasMargin, QgsPropertyDefinition( "dataDefinedMapAtlasMargin", QObject::tr( "Atlas margin" ), QgsPropertyDefinition::DoublePositive ) },
69 : 0 : { QgsLayoutObject::MapLayers, QgsPropertyDefinition( "dataDefinedMapLayers", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map Layers" ), tr( "list of map layer names separated by | characters" ) ) },
70 : 0 : { QgsLayoutObject::MapStylePreset, QgsPropertyDefinition( "dataDefinedMapStylePreset", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map theme" ), tr( "name of an existing map theme (case-sensitive)" ) ) },
71 : 0 : { QgsLayoutObject::MapGridEnabled, QgsPropertyDefinition( "dataDefinedMapGridEnabled", QObject::tr( "Grid enabled" ), QgsPropertyDefinition::Boolean ) },
72 : 0 : { QgsLayoutObject::MapGridIntervalX, QgsPropertyDefinition( "dataDefinedMapGridIntervalX", QObject::tr( "Grid interval X" ), QgsPropertyDefinition::DoublePositive ) },
73 : 0 : { QgsLayoutObject::MapGridIntervalY, QgsPropertyDefinition( "dataDefinedMapGridIntervalY", QObject::tr( "Grid interval Y" ), QgsPropertyDefinition::DoublePositive ) },
74 : 0 : { QgsLayoutObject::MapGridOffsetX, QgsPropertyDefinition( "dataDefinedMapGridOffsetX", QObject::tr( "Grid offset X" ), QgsPropertyDefinition::Double ) },
75 : 0 : { QgsLayoutObject::MapGridOffsetY, QgsPropertyDefinition( "dataDefinedMapGridOffsetY", QObject::tr( "Grid offset Y" ), QgsPropertyDefinition::Double ) },
76 : 0 : { QgsLayoutObject::MapGridFrameSize, QgsPropertyDefinition( "dataDefinedMapGridFrameSize", QObject::tr( "Grid frame size" ), QgsPropertyDefinition::DoublePositive ) },
77 : 0 : { QgsLayoutObject::MapGridFrameLineThickness, QgsPropertyDefinition( "dataDefinedMapGridFrameLineThickness", QObject::tr( "Grid frame line thickness" ), QgsPropertyDefinition::DoublePositive ) },
78 : 0 : { QgsLayoutObject::MapGridCrossSize, QgsPropertyDefinition( "dataDefinedMapGridCrossSize", QObject::tr( "Grid cross size" ), QgsPropertyDefinition::DoublePositive ) },
79 : 0 : { QgsLayoutObject::MapGridFrameMargin, QgsPropertyDefinition( "dataDefinedMapGridFrameMargin", QObject::tr( "Grid frame margin" ), QgsPropertyDefinition::DoublePositive ) },
80 : 0 : { QgsLayoutObject::MapGridLabelDistance, QgsPropertyDefinition( "dataDefinedMapGridLabelDistance", QObject::tr( "Grid label distance" ), QgsPropertyDefinition::DoublePositive ) },
81 : 0 : { QgsLayoutObject::MapGridAnnotationDisplayLeft, QgsPropertyDefinition( "dataDefinedMapGridAnnotationDisplayLeft", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map grid annotation display left" ), QObject::tr( "string " ) + QLatin1String( "[<b>all</b>|<b>x_only</b>|<b>y_only</b>|<b>disabled</b>]" ) ) },
82 : 0 : { QgsLayoutObject::MapGridAnnotationDisplayRight, QgsPropertyDefinition( "dataDefinedMapGridAnnotationDisplayRight", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map grid annotation display right" ), QObject::tr( "string " ) + QLatin1String( "[<b>all</b>|<b>x_only</b>|<b>y_only</b>|<b>disabled</b>]" ) ) },
83 : 0 : { QgsLayoutObject::MapGridAnnotationDisplayTop, QgsPropertyDefinition( "dataDefinedMapGridAnnotationDisplayTop", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map grid annotation display top" ), QObject::tr( "string " ) + QLatin1String( "[<b>all</b>|<b>x_only</b>|<b>y_only</b>|<b>disabled</b>]" ) ) },
84 : 0 : { QgsLayoutObject::MapGridAnnotationDisplayBottom, QgsPropertyDefinition( "dataDefinedMapGridAnnotationDisplayBottom", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map grid annotation display bottom" ), QObject::tr( "string " ) + QLatin1String( "[<b>all</b>|<b>x_only</b>|<b>y_only</b>|<b>disabled</b>]" ) ) },
85 : 0 : { QgsLayoutObject::MapGridFrameDivisionsLeft, QgsPropertyDefinition( "dataDefinedMapGridFrameDivisionsLeft", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map grid frame divisions display left" ), QObject::tr( "string " ) + QLatin1String( "[<b>all</b>|<b>x_only</b>|<b>y_only</b>|<b>disabled</b>]" ) ) },
86 : 0 : { QgsLayoutObject::MapGridFrameDivisionsRight, QgsPropertyDefinition( "dataDefinedMapGridFrameDivisionsRight", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map grid frame divisions display right" ), QObject::tr( "string " ) + QLatin1String( "[<b>all</b>|<b>x_only</b>|<b>y_only</b>|<b>disabled</b>]" ) ) },
87 : 0 : { QgsLayoutObject::MapGridFrameDivisionsTop, QgsPropertyDefinition( "dataDefinedMapGridFrameDivisionsTop", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map grid frame divisions display top" ), QObject::tr( "string " ) + QLatin1String( "[<b>all</b>|<b>x_only</b>|<b>y_only</b>|<b>disabled</b>]" ) ) },
88 : 0 : { QgsLayoutObject::MapGridFrameDivisionsBottom, QgsPropertyDefinition( "dataDefinedMapGridFrameDivisionsBottom", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map grid frame divisions display bottom" ), QObject::tr( "string " ) + QLatin1String( "[<b>all</b>|<b>x_only</b>|<b>y_only</b>|<b>disabled</b>]" ) ) },
89 : 0 : { QgsLayoutObject::PictureSource, QgsPropertyDefinition( "dataDefinedSource", QObject::tr( "Picture source (URL)" ), QgsPropertyDefinition::String ) },
90 : 0 : { QgsLayoutObject::SourceUrl, QgsPropertyDefinition( "dataDefinedSourceUrl", QObject::tr( "Source URL" ), QgsPropertyDefinition::String ) },
91 : 0 : { QgsLayoutObject::PictureSvgBackgroundColor, QgsPropertyDefinition( "dataDefinedSvgBackgroundColor", QObject::tr( "SVG background color" ), QgsPropertyDefinition::ColorWithAlpha ) },
92 : 0 : { QgsLayoutObject::PictureSvgStrokeColor, QgsPropertyDefinition( "dataDefinedSvgStrokeColor", QObject::tr( "SVG stroke color" ), QgsPropertyDefinition::ColorWithAlpha ) },
93 : 0 : { QgsLayoutObject::PictureSvgStrokeWidth, QgsPropertyDefinition( "dataDefinedSvgStrokeWidth", QObject::tr( "SVG stroke width" ), QgsPropertyDefinition::StrokeWidth ) },
94 : 0 : { QgsLayoutObject::LegendTitle, QgsPropertyDefinition( "dataDefinedLegendTitle", QObject::tr( "Legend title" ), QgsPropertyDefinition::String ) },
95 : 0 : { QgsLayoutObject::LegendColumnCount, QgsPropertyDefinition( "dataDefinedLegendColumns", QObject::tr( "Number of columns" ), QgsPropertyDefinition::IntegerPositiveGreaterZero ) },
96 : 0 : { QgsLayoutObject::ScalebarFillColor, QgsPropertyDefinition( "dataDefinedScalebarFill", QObject::tr( "Fill color" ), QgsPropertyDefinition::ColorWithAlpha ) },
97 : 0 : { QgsLayoutObject::ScalebarFillColor2, QgsPropertyDefinition( "dataDefinedScalebarFill2", QObject::tr( "Secondary fill color" ), QgsPropertyDefinition::ColorWithAlpha ) },
98 : 0 : { QgsLayoutObject::ScalebarLineColor, QgsPropertyDefinition( "dataDefinedScalebarLineColor", QObject::tr( "Line color" ), QgsPropertyDefinition::ColorWithAlpha ) },
99 : 0 : { QgsLayoutObject::ScalebarLineWidth, QgsPropertyDefinition( "dataDefinedScalebarLineWidth", QObject::tr( "Line width" ), QgsPropertyDefinition::StrokeWidth ) },
100 : 0 : { QgsLayoutObject::AttributeTableSourceLayer, QgsPropertyDefinition( "dataDefinedAttributeTableSourceLayer", QObject::tr( "Table source layer" ), QgsPropertyDefinition::String ) },
101 : 0 : { QgsLayoutObject::MapCrs, QgsPropertyDefinition( "dataDefinedCrs", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map CRS" ), QObject::tr( "string representing a CRS, either an authority/id pair (e.g. \"EPSG:4326\"), a proj string prefixes by \"PROJ:\" (e.g. \"PROJ: +proj=...\") or a WKT string prefixed by \"WKT:\" (e.g. \"WKT:GEOGCS[\"WGS 84\"...)" ) ) },
102 : 0 : { QgsLayoutObject::StartDateTime, QgsPropertyDefinition( "dataDefinedStartDateTime", QObject::tr( "Temporal range start date / time" ), QgsPropertyDefinition::DateTime ) },
103 : 0 : { QgsLayoutObject::EndDateTime, QgsPropertyDefinition( "dataDefinedEndDateTime", QObject::tr( "Temporal range end date / time" ), QgsPropertyDefinition::DateTime ) },
104 : : };
105 : 0 : }
106 : :
107 : 0 : const QgsPropertiesDefinition &QgsLayoutObject::propertyDefinitions()
108 : : {
109 : 0 : QgsLayoutObject::initPropertyDefinitions();
110 : 0 : return sPropertyDefinitions;
111 : : }
112 : :
113 : 0 : bool QgsLayoutObject::propertyAssociatesWithParentMultiframe( QgsLayoutObject::DataDefinedProperty property )
114 : : {
115 : 0 : switch ( property )
116 : : {
117 : : case QgsLayoutObject::SourceUrl:
118 : : case QgsLayoutObject::AttributeTableSourceLayer:
119 : 0 : return true;
120 : :
121 : : case QgsLayoutObject::NoProperty:
122 : : case QgsLayoutObject::AllProperties:
123 : : case QgsLayoutObject::TestProperty:
124 : : case QgsLayoutObject::PresetPaperSize:
125 : : case QgsLayoutObject::PaperWidth:
126 : : case QgsLayoutObject::PaperHeight:
127 : : case QgsLayoutObject::NumPages:
128 : : case QgsLayoutObject::PaperOrientation:
129 : : case QgsLayoutObject::PageNumber:
130 : : case QgsLayoutObject::PositionX:
131 : : case QgsLayoutObject::PositionY:
132 : : case QgsLayoutObject::ItemWidth:
133 : : case QgsLayoutObject::ItemHeight:
134 : : case QgsLayoutObject::ItemRotation:
135 : : case QgsLayoutObject::Transparency:
136 : : case QgsLayoutObject::Opacity:
137 : : case QgsLayoutObject::BlendMode:
138 : : case QgsLayoutObject::ExcludeFromExports:
139 : : case QgsLayoutObject::FrameColor:
140 : : case QgsLayoutObject::BackgroundColor:
141 : : case QgsLayoutObject::MapRotation:
142 : : case QgsLayoutObject::MapScale:
143 : : case QgsLayoutObject::MapXMin:
144 : : case QgsLayoutObject::MapYMin:
145 : : case QgsLayoutObject::MapXMax:
146 : : case QgsLayoutObject::MapYMax:
147 : : case QgsLayoutObject::MapAtlasMargin:
148 : : case QgsLayoutObject::MapLayers:
149 : : case QgsLayoutObject::MapStylePreset:
150 : : case QgsLayoutObject::MapLabelMargin:
151 : : case QgsLayoutObject::MapGridEnabled:
152 : : case QgsLayoutObject::MapGridIntervalX:
153 : : case QgsLayoutObject::MapGridIntervalY:
154 : : case QgsLayoutObject::MapGridOffsetX:
155 : : case QgsLayoutObject::MapGridOffsetY:
156 : : case QgsLayoutObject::MapGridFrameSize:
157 : : case QgsLayoutObject::MapGridFrameMargin:
158 : : case QgsLayoutObject::MapGridLabelDistance:
159 : : case QgsLayoutObject::MapGridCrossSize:
160 : : case QgsLayoutObject::MapGridFrameLineThickness:
161 : : case QgsLayoutObject::MapGridAnnotationDisplayLeft:
162 : : case QgsLayoutObject::MapGridAnnotationDisplayRight:
163 : : case QgsLayoutObject::MapGridAnnotationDisplayTop:
164 : : case QgsLayoutObject::MapGridAnnotationDisplayBottom:
165 : : case QgsLayoutObject::MapGridFrameDivisionsLeft:
166 : : case QgsLayoutObject::MapGridFrameDivisionsRight:
167 : : case QgsLayoutObject::MapGridFrameDivisionsTop:
168 : : case QgsLayoutObject::MapGridFrameDivisionsBottom:
169 : : case QgsLayoutObject::PictureSource:
170 : : case QgsLayoutObject::PictureSvgBackgroundColor:
171 : : case QgsLayoutObject::PictureSvgStrokeColor:
172 : : case QgsLayoutObject::PictureSvgStrokeWidth:
173 : : case QgsLayoutObject::LegendTitle:
174 : : case QgsLayoutObject::LegendColumnCount:
175 : : case QgsLayoutObject::ScalebarFillColor:
176 : : case QgsLayoutObject::ScalebarFillColor2:
177 : : case QgsLayoutObject::ScalebarLineColor:
178 : : case QgsLayoutObject::ScalebarLineWidth:
179 : : case QgsLayoutObject::MapCrs:
180 : : case QgsLayoutObject::StartDateTime:
181 : : case QgsLayoutObject::EndDateTime:
182 : 0 : return false;
183 : : }
184 : 0 : return false;
185 : 0 : }
186 : :
187 : 0 : QgsLayoutObject::QgsLayoutObject( QgsLayout *layout )
188 : 0 : : QObject( nullptr )
189 : 0 : , mLayout( layout )
190 : 0 : {
191 : 0 : initPropertyDefinitions();
192 : :
193 : 0 : if ( mLayout )
194 : : {
195 : 0 : connect( mLayout, &QgsLayout::refreshed, this, &QgsLayoutObject::refresh );
196 : 0 : connect( &mLayout->reportContext(), &QgsLayoutReportContext::changed, this, &QgsLayoutObject::refresh );
197 : 0 : }
198 : 0 : }
199 : :
200 : 0 : const QgsLayout *QgsLayoutObject::layout() const
201 : : {
202 : 0 : return mLayout.data();
203 : : }
204 : :
205 : 0 : QgsLayout *QgsLayoutObject::layout()
206 : : {
207 : 0 : return mLayout.data();
208 : : }
209 : :
210 : 0 : void QgsLayoutObject::setCustomProperty( const QString &key, const QVariant &value )
211 : : {
212 : 0 : mCustomProperties.setValue( key, value );
213 : 0 : }
214 : :
215 : 0 : QVariant QgsLayoutObject::customProperty( const QString &key, const QVariant &defaultValue ) const
216 : : {
217 : 0 : return mCustomProperties.value( key, defaultValue );
218 : : }
219 : :
220 : 0 : void QgsLayoutObject::removeCustomProperty( const QString &key )
221 : : {
222 : 0 : mCustomProperties.remove( key );
223 : 0 : }
224 : :
225 : 0 : QStringList QgsLayoutObject::customProperties() const
226 : : {
227 : 0 : return mCustomProperties.keys();
228 : : }
229 : :
230 : 0 : QgsExpressionContext QgsLayoutObject::createExpressionContext() const
231 : : {
232 : 0 : if ( mLayout )
233 : : {
234 : 0 : return mLayout->createExpressionContext();
235 : : }
236 : : else
237 : : {
238 : 0 : return QgsExpressionContext() << QgsExpressionContextUtils::globalScope();
239 : : }
240 : 0 : }
241 : :
242 : 0 : bool QgsLayoutObject::writeObjectPropertiesToElement( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext & ) const
243 : : {
244 : 0 : if ( parentElement.isNull() )
245 : : {
246 : 0 : return false;
247 : : }
248 : :
249 : : //create object element
250 : 0 : QDomElement objectElement = document.createElement( QStringLiteral( "LayoutObject" ) );
251 : :
252 : 0 : QDomElement ddPropsElement = document.createElement( QStringLiteral( "dataDefinedProperties" ) );
253 : 0 : mDataDefinedProperties.writeXml( ddPropsElement, sPropertyDefinitions );
254 : 0 : objectElement.appendChild( ddPropsElement );
255 : :
256 : : //custom properties
257 : 0 : mCustomProperties.writeXml( objectElement, document );
258 : :
259 : 0 : parentElement.appendChild( objectElement );
260 : 0 : return true;
261 : 0 : }
262 : :
263 : 0 : bool QgsLayoutObject::readObjectPropertiesFromElement( const QDomElement &parentElement, const QDomDocument &document, const QgsReadWriteContext & )
264 : : {
265 : 0 : Q_UNUSED( document )
266 : 0 : if ( parentElement.isNull() )
267 : : {
268 : 0 : return false;
269 : : }
270 : :
271 : 0 : QDomNodeList objectNodeList = parentElement.elementsByTagName( QStringLiteral( "LayoutObject" ) );
272 : 0 : if ( objectNodeList.size() < 1 )
273 : : {
274 : 0 : return false;
275 : : }
276 : 0 : QDomElement objectElement = objectNodeList.at( 0 ).toElement();
277 : :
278 : 0 : QDomNode propsNode = objectElement.namedItem( QStringLiteral( "dataDefinedProperties" ) );
279 : 0 : if ( !propsNode.isNull() )
280 : : {
281 : 0 : mDataDefinedProperties.readXml( propsNode.toElement(), sPropertyDefinitions );
282 : 0 : }
283 : :
284 : : //custom properties
285 : 0 : mCustomProperties.readXml( objectElement );
286 : :
287 : 0 : return true;
288 : 0 : }
|