Restore serialization for map items

This commit is contained in:
Nyall Dawson 2017-10-24 12:02:57 +10:00
parent e539022358
commit 48a45b3bff
14 changed files with 290 additions and 78 deletions

View File

@ -409,6 +409,10 @@ Returns true if the map contains layers with blend modes or flattened layers for
virtual void draw( QgsRenderContext &context, const QStyleOptionGraphicsItem *itemStyle = 0 );
virtual bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;
virtual bool readPropertiesFromElement( const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context );
QgsMapSettings mapSettings( const QgsRectangle &extent, QSizeF size, int dpi ) const;
%Docstring
@ -423,7 +427,6 @@ True if a draw is already in progress
%End
virtual QRectF boundingRect() const;

View File

@ -94,7 +94,7 @@ class QgsLayoutItemMapGridStack : QgsLayoutItemMapItemStack
:rtype: list of QgsLayoutItemMapGrid
%End
virtual bool readXml( const QDomElement &elem, const QDomDocument &doc );
virtual bool readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context );
double maxGridExtension() const;
@ -222,9 +222,9 @@ class QgsLayoutItemMapGrid : QgsLayoutItemMapItem
virtual void draw( QPainter *painter );
virtual bool writeXml( QDomElement &elem, QDomDocument &doc ) const;
virtual bool writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const;
virtual bool readXml( const QDomElement &itemElem, const QDomDocument &doc );
virtual bool readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context );
void setCrs( const QgsCoordinateReferenceSystem &crs );

View File

@ -33,7 +33,7 @@ class QgsLayoutItemMapItem : QgsLayoutObject
Draws the item on to a destination ``painter``.
%End
virtual bool writeXml( QDomElement &element, QDomDocument &document ) const;
virtual bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;
%Docstring
Stores map item state in a DOM element, where ``element`` is the DOM element
corresponding to a 'LayoutMap' tag.
@ -41,7 +41,7 @@ class QgsLayoutItemMapItem : QgsLayoutObject
:rtype: bool
%End
virtual bool readXml( const QDomElement &element, const QDomDocument &doc );
virtual bool readXml( const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context );
%Docstring
Sets the map item state from a DOM document, where ``element`` is the DOM
node corresponding to a 'LayoutMapGrid' tag.
@ -139,7 +139,7 @@ class QgsLayoutItemMapItemStack
:rtype: int
%End
virtual bool writeXml( QDomElement &element, QDomDocument &doc ) const;
virtual bool writeXml( QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context ) const;
%Docstring
Stores the state of the item stack in a DOM node, where ``element`` is the DOM element corresponding to a 'LayoutMap' tag.
Returns true if write was successful.
@ -147,7 +147,7 @@ class QgsLayoutItemMapItemStack
:rtype: bool
%End
virtual bool readXml( const QDomElement &element, const QDomDocument &doc ) = 0;
virtual bool readXml( const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context ) = 0;
%Docstring
Sets the item stack's state from a DOM document, where ``element`` is a DOM node corresponding to a 'LayoutMap' tag.
Returns true if read was successful.

View File

@ -94,7 +94,7 @@ class QgsLayoutItemMapOverviewStack : QgsLayoutItemMapItemStack
Returns a list of QgsLayoutItemMapOverviews contained by the stack.
:rtype: list of QgsLayoutItemMapOverview
%End
virtual bool readXml( const QDomElement &elem, const QDomDocument &doc );
virtual bool readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context );
};
@ -122,9 +122,9 @@ class QgsLayoutItemMapOverview : QgsLayoutItemMapItem
virtual void draw( QPainter *painter );
virtual bool writeXml( QDomElement &elem, QDomDocument &doc ) const;
virtual bool writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const;
virtual bool readXml( const QDomElement &itemElem, const QDomDocument &doc );
virtual bool readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context );
virtual bool usesAdvancedEffects() const;

View File

@ -80,7 +80,6 @@ class QgsLayoutItemPicture: QgsLayoutItem
:rtype: str
%End
double pictureRotation() const;
%Docstring
Returns the rotation used for drawing the picture within the item's frame,

View File

@ -478,6 +478,250 @@ void QgsLayoutItemMap::draw( QgsRenderContext &, const QStyleOptionGraphicsItem
{
}
bool QgsLayoutItemMap::writePropertiesToElement( QDomElement &composerMapElem, QDomDocument &doc, const QgsReadWriteContext &context ) const
{
#if 0 //TODO - is this needed?
composerMapElem.setAttribute( QStringLiteral( "id" ), mId );
#endif
if ( mKeepLayerSet )
{
composerMapElem.setAttribute( QStringLiteral( "keepLayerSet" ), QStringLiteral( "true" ) );
}
else
{
composerMapElem.setAttribute( QStringLiteral( "keepLayerSet" ), QStringLiteral( "false" ) );
}
if ( mDrawAnnotations )
{
composerMapElem.setAttribute( QStringLiteral( "drawCanvasItems" ), QStringLiteral( "true" ) );
}
else
{
composerMapElem.setAttribute( QStringLiteral( "drawCanvasItems" ), QStringLiteral( "false" ) );
}
//extent
QDomElement extentElem = doc.createElement( QStringLiteral( "Extent" ) );
extentElem.setAttribute( QStringLiteral( "xmin" ), qgsDoubleToString( mExtent.xMinimum() ) );
extentElem.setAttribute( QStringLiteral( "xmax" ), qgsDoubleToString( mExtent.xMaximum() ) );
extentElem.setAttribute( QStringLiteral( "ymin" ), qgsDoubleToString( mExtent.yMinimum() ) );
extentElem.setAttribute( QStringLiteral( "ymax" ), qgsDoubleToString( mExtent.yMaximum() ) );
composerMapElem.appendChild( extentElem );
if ( mCrs.isValid() )
{
QDomElement crsElem = doc.createElement( QStringLiteral( "crs" ) );
mCrs.writeXml( crsElem, doc );
composerMapElem.appendChild( crsElem );
}
// follow map theme
composerMapElem.setAttribute( QStringLiteral( "followPreset" ), mFollowVisibilityPreset ? "true" : "false" );
composerMapElem.setAttribute( QStringLiteral( "followPresetName" ), mFollowVisibilityPresetName );
//map rotation
composerMapElem.setAttribute( QStringLiteral( "mapRotation" ), QString::number( mMapRotation ) );
//layer set
QDomElement layerSetElem = doc.createElement( QStringLiteral( "LayerSet" ) );
for ( const QgsMapLayerRef &layerRef : mLayers )
{
if ( !layerRef )
continue;
QDomElement layerElem = doc.createElement( QStringLiteral( "Layer" ) );
QDomText layerIdText = doc.createTextNode( layerRef.layerId );
layerElem.appendChild( layerIdText );
layerElem.setAttribute( QStringLiteral( "name" ), layerRef.name );
layerElem.setAttribute( QStringLiteral( "source" ), layerRef.source );
layerElem.setAttribute( QStringLiteral( "provider" ), layerRef.provider );
layerSetElem.appendChild( layerElem );
}
composerMapElem.appendChild( layerSetElem );
// override styles
if ( mKeepLayerStyles )
{
QDomElement stylesElem = doc.createElement( QStringLiteral( "LayerStyles" ) );
for ( auto styleIt = mLayerStyleOverrides.constBegin(); styleIt != mLayerStyleOverrides.constEnd(); ++styleIt )
{
QDomElement styleElem = doc.createElement( QStringLiteral( "LayerStyle" ) );
QgsMapLayerRef ref( styleIt.key() );
ref.resolve( mLayout->project() );
styleElem.setAttribute( QStringLiteral( "layerid" ), ref.layerId );
styleElem.setAttribute( QStringLiteral( "name" ), ref.name );
styleElem.setAttribute( QStringLiteral( "source" ), ref.source );
styleElem.setAttribute( QStringLiteral( "provider" ), ref.provider );
QgsMapLayerStyle style( styleIt.value() );
style.writeXml( styleElem );
stylesElem.appendChild( styleElem );
}
composerMapElem.appendChild( stylesElem );
}
//grids
mGridStack->writeXml( composerMapElem, doc, context );
//overviews
mOverviewStack->writeXml( composerMapElem, doc, context );
//atlas
QDomElement atlasElem = doc.createElement( QStringLiteral( "AtlasMap" ) );
atlasElem.setAttribute( QStringLiteral( "atlasDriven" ), mAtlasDriven );
atlasElem.setAttribute( QStringLiteral( "scalingMode" ), mAtlasScalingMode );
atlasElem.setAttribute( QStringLiteral( "margin" ), qgsDoubleToString( mAtlasMargin ) );
composerMapElem.appendChild( atlasElem );
return true;
}
bool QgsLayoutItemMap::readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context )
{
mUpdatesEnabled = false;
#if 0 //TODO
QString idRead = itemElem.attribute( QStringLiteral( "id" ), QStringLiteral( "not found" ) );
if ( idRead != QLatin1String( "not found" ) )
{
mId = idRead.toInt();
updateToolTip();
}
#endif
//extent
QDomNodeList extentNodeList = itemElem.elementsByTagName( QStringLiteral( "Extent" ) );
if ( !extentNodeList.isEmpty() )
{
QDomElement extentElem = extentNodeList.at( 0 ).toElement();
double xmin, xmax, ymin, ymax;
xmin = extentElem.attribute( QStringLiteral( "xmin" ) ).toDouble();
xmax = extentElem.attribute( QStringLiteral( "xmax" ) ).toDouble();
ymin = extentElem.attribute( QStringLiteral( "ymin" ) ).toDouble();
ymax = extentElem.attribute( QStringLiteral( "ymax" ) ).toDouble();
setExtent( QgsRectangle( xmin, ymin, xmax, ymax ) );
}
QDomNodeList crsNodeList = itemElem.elementsByTagName( QStringLiteral( "crs" ) );
if ( !crsNodeList.isEmpty() )
{
QDomElement crsElem = crsNodeList.at( 0 ).toElement();
mCrs.readXml( crsElem );
}
else
{
mCrs = QgsCoordinateReferenceSystem();
}
//map rotation
mMapRotation = itemElem.attribute( QStringLiteral( "mapRotation" ), QStringLiteral( "0" ) ).toDouble();
// follow map theme
mFollowVisibilityPreset = itemElem.attribute( QStringLiteral( "followPreset" ) ).compare( QLatin1String( "true" ) ) == 0;
mFollowVisibilityPresetName = itemElem.attribute( QStringLiteral( "followPresetName" ) );
//mKeepLayerSet flag
QString keepLayerSetFlag = itemElem.attribute( QStringLiteral( "keepLayerSet" ) );
if ( keepLayerSetFlag.compare( QLatin1String( "true" ), Qt::CaseInsensitive ) == 0 )
{
mKeepLayerSet = true;
}
else
{
mKeepLayerSet = false;
}
QString drawCanvasItemsFlag = itemElem.attribute( QStringLiteral( "drawCanvasItems" ), QStringLiteral( "true" ) );
if ( drawCanvasItemsFlag.compare( QLatin1String( "true" ), Qt::CaseInsensitive ) == 0 )
{
mDrawAnnotations = true;
}
else
{
mDrawAnnotations = false;
}
mLayerStyleOverrides.clear();
//mLayers
mLayers.clear();
QDomNodeList layerSetNodeList = itemElem.elementsByTagName( QStringLiteral( "LayerSet" ) );
if ( !layerSetNodeList.isEmpty() )
{
QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( QStringLiteral( "Layer" ) );
mLayers.reserve( layerIdNodeList.size() );
for ( int i = 0; i < layerIdNodeList.size(); ++i )
{
QDomElement layerElem = layerIdNodeList.at( i ).toElement();
QString layerId = layerElem.text();
QString layerName = layerElem.attribute( QStringLiteral( "name" ) );
QString layerSource = layerElem.attribute( QStringLiteral( "source" ) );
QString layerProvider = layerElem.attribute( QStringLiteral( "provider" ) );
QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
ref.resolveWeakly( mLayout->project() );
mLayers << ref;
}
}
// override styles
QDomNodeList layerStylesNodeList = itemElem.elementsByTagName( QStringLiteral( "LayerStyles" ) );
mKeepLayerStyles = !layerStylesNodeList.isEmpty();
if ( mKeepLayerStyles )
{
QDomElement layerStylesElem = layerStylesNodeList.at( 0 ).toElement();
QDomNodeList layerStyleNodeList = layerStylesElem.elementsByTagName( QStringLiteral( "LayerStyle" ) );
for ( int i = 0; i < layerStyleNodeList.size(); ++i )
{
const QDomElement &layerStyleElement = layerStyleNodeList.at( i ).toElement();
QString layerId = layerStyleElement.attribute( QStringLiteral( "layerid" ) );
QString layerName = layerStyleElement.attribute( QStringLiteral( "name" ) );
QString layerSource = layerStyleElement.attribute( QStringLiteral( "source" ) );
QString layerProvider = layerStyleElement.attribute( QStringLiteral( "provider" ) );
QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
ref.resolveWeakly( mLayout->project() );
QgsMapLayerStyle style;
style.readXml( layerStyleElement );
mLayerStyleOverrides.insert( ref.layerId, style.xmlData() );
}
}
mDrawing = false;
mNumCachedLayers = 0;
mCacheInvalidated = true;
//overviews
mOverviewStack->readXml( itemElem, doc, context );
//grids
mGridStack->readXml( itemElem, doc, context );
//atlas
QDomNodeList atlasNodeList = itemElem.elementsByTagName( QStringLiteral( "AtlasMap" ) );
if ( !atlasNodeList.isEmpty() )
{
QDomElement atlasElem = atlasNodeList.at( 0 ).toElement();
mAtlasDriven = ( atlasElem.attribute( QStringLiteral( "atlasDriven" ), QStringLiteral( "0" ) ) != QLatin1String( "0" ) );
if ( atlasElem.hasAttribute( QStringLiteral( "fixedScale" ) ) ) // deprecated XML
{
mAtlasScalingMode = ( atlasElem.attribute( QStringLiteral( "fixedScale" ), QStringLiteral( "0" ) ) != QLatin1String( "0" ) ) ? Fixed : Auto;
}
else if ( atlasElem.hasAttribute( QStringLiteral( "scalingMode" ) ) )
{
mAtlasScalingMode = static_cast<AtlasScalingMode>( atlasElem.attribute( QStringLiteral( "scalingMode" ) ).toInt() );
}
mAtlasMargin = atlasElem.attribute( QStringLiteral( "margin" ), QStringLiteral( "0.1" ) ).toDouble();
}
mUpdatesEnabled = true;
return true;
}
void QgsLayoutItemMap::paint( QPainter *painter, const QStyleOptionGraphicsItem *style, QWidget * )
{
if ( !mLayout || !painter || !painter->device() || !mUpdatesEnabled )

View File

@ -399,6 +399,8 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem
protected:
void draw( QgsRenderContext &context, const QStyleOptionGraphicsItem *itemStyle = nullptr ) override;
bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override;
bool readPropertiesFromElement( const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context ) override;
/**
* Return map settings that will be used for drawing of the map.
@ -415,23 +417,8 @@ class CORE_EXPORT QgsLayoutItemMap : public QgsLayoutItem
Atlas preview extents are only temporary, and are regenerated whenever the atlas feature changes
*/
void setNewAtlasFeatureExtent( const QgsRectangle &extent );
/**
* Stores state in Dom node
* \param elem is Dom element corresponding to 'Composer' tag
* \param doc Dom document
*/
bool writeXml( QDomElement &elem, QDomDocument &doc ) const override;
/**
* Sets state from Dom document
* \param itemElem is Dom node corresponding to 'ComposerMap' tag
* \param doc is Dom document
*/
bool readXml( const QDomElement &itemElem, const QDomDocument &doc ) override;
#endif
// In case of annotations, the bounding rectangle can be larger than the map item rectangle
QRectF boundingRect() const override;

View File

@ -97,7 +97,7 @@ QgsLayoutItemMapGrid &QgsLayoutItemMapGridStack::operator[]( int idx )
return *grid;
}
bool QgsLayoutItemMapGridStack::readXml( const QDomElement &elem, const QDomDocument &doc )
bool QgsLayoutItemMapGridStack::readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context )
{
removeItems();
@ -107,7 +107,7 @@ bool QgsLayoutItemMapGridStack::readXml( const QDomElement &elem, const QDomDocu
{
QDomElement mapGridElem = mapGridNodeList.at( i ).toElement();
QgsLayoutItemMapGrid *mapGrid = new QgsLayoutItemMapGrid( mapGridElem.attribute( QStringLiteral( "name" ) ), mMap );
mapGrid->readXml( mapGridElem, doc );
mapGrid->readXml( mapGridElem, doc, context );
mItems.append( mapGrid );
}
@ -205,7 +205,7 @@ void QgsLayoutItemMapGrid::setGridLineColor( const QColor &c )
}
}
bool QgsLayoutItemMapGrid::writeXml( QDomElement &elem, QDomDocument &doc ) const
bool QgsLayoutItemMapGrid::writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const
{
if ( elem.isNull() )
{
@ -220,9 +220,6 @@ bool QgsLayoutItemMapGrid::writeXml( QDomElement &elem, QDomDocument &doc ) cons
mapGridElem.setAttribute( QStringLiteral( "offsetY" ), qgsDoubleToString( mGridOffsetY ) );
mapGridElem.setAttribute( QStringLiteral( "crossLength" ), qgsDoubleToString( mCrossLength ) );
QgsReadWriteContext context;
context.setPathResolver( mLayout->project()->pathResolver() );
QDomElement lineStyleElem = doc.createElement( QStringLiteral( "lineStyle" ) );
QDomElement gridLineStyleElem = QgsSymbolLayerUtils::saveSymbol( QString(), mGridLineSymbol.get(), doc, context );
lineStyleElem.appendChild( gridLineStyleElem );
@ -271,12 +268,12 @@ bool QgsLayoutItemMapGrid::writeXml( QDomElement &elem, QDomDocument &doc ) cons
mapGridElem.setAttribute( QStringLiteral( "unit" ), mGridUnit );
mapGridElem.setAttribute( QStringLiteral( "blendMode" ), mBlendMode );
bool ok = QgsLayoutItemMapItem::writeXml( mapGridElem, doc );
bool ok = QgsLayoutItemMapItem::writeXml( mapGridElem, doc, context );
elem.appendChild( mapGridElem );
return ok;
}
bool QgsLayoutItemMapGrid::readXml( const QDomElement &itemElem, const QDomDocument &doc )
bool QgsLayoutItemMapGrid::readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context )
{
Q_UNUSED( doc );
if ( itemElem.isNull() )
@ -284,7 +281,7 @@ bool QgsLayoutItemMapGrid::readXml( const QDomElement &itemElem, const QDomDocum
return false;
}
bool ok = QgsLayoutItemMapItem::readXml( itemElem, doc );
bool ok = QgsLayoutItemMapItem::readXml( itemElem, doc, context );
//grid
mGridStyle = QgsLayoutItemMapGrid::GridStyle( itemElem.attribute( QStringLiteral( "gridStyle" ), QStringLiteral( "0" ) ).toInt() );
@ -305,9 +302,6 @@ bool QgsLayoutItemMapGrid::readXml( const QDomElement &itemElem, const QDomDocum
mTopFrameDivisions = QgsLayoutItemMapGrid::DisplayMode( itemElem.attribute( QStringLiteral( "topFrameDivisions" ), QStringLiteral( "0" ) ).toInt() );
mBottomFrameDivisions = QgsLayoutItemMapGrid::DisplayMode( itemElem.attribute( QStringLiteral( "bottomFrameDivisions" ), QStringLiteral( "0" ) ).toInt() );
QgsReadWriteContext context;
context.setPathResolver( mLayout->project()->pathResolver() );
QDomElement lineStyleElem = itemElem.firstChildElement( QStringLiteral( "lineStyle" ) );
if ( !lineStyleElem.isNull() )
{
@ -498,23 +492,23 @@ void QgsLayoutItemMapGrid::calculateCrsTransformLines() const
QList< QPair< double, QPolygonF > >::const_iterator yGridIt = mTransformedYLines.constBegin();
for ( ; yGridIt != mTransformedYLines.constEnd(); ++yGridIt )
{
QgsPolyline yLine;
QgsPolylineXY yLine;
for ( int i = 0; i < ( *yGridIt ).second.size(); ++i )
{
yLine.append( QgsPointXY( ( *yGridIt ).second.at( i ).x(), ( *yGridIt ).second.at( i ).y() ) );
}
yLines << QgsGeometry::fromPolyline( yLine );
yLines << QgsGeometry::fromPolylineXY( yLine );
}
QList< QgsGeometry > xLines;
QList< QPair< double, QPolygonF > >::const_iterator xGridIt = mTransformedXLines.constBegin();
for ( ; xGridIt != mTransformedXLines.constEnd(); ++xGridIt )
{
QgsPolyline xLine;
QgsPolylineXY xLine;
for ( int i = 0; i < ( *xGridIt ).second.size(); ++i )
{
xLine.append( QgsPointXY( ( *xGridIt ).second.at( i ).x(), ( *xGridIt ).second.at( i ).y() ) );
}
xLines << QgsGeometry::fromPolyline( xLine );
xLines << QgsGeometry::fromPolylineXY( xLine );
}
//now, loop through geometries and calculate intersection points

View File

@ -109,7 +109,7 @@ class CORE_EXPORT QgsLayoutItemMapGridStack : public QgsLayoutItemMapItemStack
*/
QList< QgsLayoutItemMapGrid * > asList() const;
bool readXml( const QDomElement &elem, const QDomDocument &doc ) override;
bool readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context ) override;
/**
* Calculates the maximum distance grids within the stack extend
@ -267,8 +267,8 @@ class CORE_EXPORT QgsLayoutItemMapGrid : public QgsLayoutItemMapItem
QgsLayoutItemMapGrid( const QString &name, QgsLayoutItemMap *map );
void draw( QPainter *painter ) override;
bool writeXml( QDomElement &elem, QDomDocument &doc ) const override;
bool readXml( const QDomElement &itemElem, const QDomDocument &doc ) override;
bool writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const override;
bool readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context ) override;
/**
* Sets the \a crs for the grid.

View File

@ -29,7 +29,7 @@ QgsLayoutItemMapItem::QgsLayoutItemMapItem( const QString &name, QgsLayoutItemMa
}
bool QgsLayoutItemMapItem::writeXml( QDomElement &element, QDomDocument &document ) const
bool QgsLayoutItemMapItem::writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext & ) const
{
Q_UNUSED( document );
element.setAttribute( QStringLiteral( "uuid" ), mUuid );
@ -38,7 +38,7 @@ bool QgsLayoutItemMapItem::writeXml( QDomElement &element, QDomDocument &documen
return true;
}
bool QgsLayoutItemMapItem::readXml( const QDomElement &itemElem, const QDomDocument &doc )
bool QgsLayoutItemMapItem::readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext & )
{
Q_UNUSED( doc );
mUuid = itemElem.attribute( QStringLiteral( "uuid" ) );
@ -184,12 +184,12 @@ QList<QgsLayoutItemMapItem *> QgsLayoutItemMapItemStack::asList() const
return list;
}
bool QgsLayoutItemMapItemStack::writeXml( QDomElement &elem, QDomDocument &doc ) const
bool QgsLayoutItemMapItemStack::writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const
{
//write item stack
for ( QgsLayoutItemMapItem *item : mItems )
{
item->writeXml( elem, doc );
item->writeXml( elem, doc, context );
}
return true;

View File

@ -52,14 +52,14 @@ class CORE_EXPORT QgsLayoutItemMapItem : public QgsLayoutObject
* corresponding to a 'LayoutMap' tag.
* \see readXml()
*/
virtual bool writeXml( QDomElement &element, QDomDocument &document ) const;
virtual bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;
/**
* Sets the map item state from a DOM document, where \a element is the DOM
* node corresponding to a 'LayoutMapGrid' tag.
* \see writeXml()
*/
virtual bool readXml( const QDomElement &element, const QDomDocument &doc );
virtual bool readXml( const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context );
/**
* Sets the corresponding layout \a map for the item.
@ -156,14 +156,14 @@ class CORE_EXPORT QgsLayoutItemMapItemStack
* Returns true if write was successful.
* \see readXml()
*/
virtual bool writeXml( QDomElement &element, QDomDocument &doc ) const;
virtual bool writeXml( QDomElement &element, QDomDocument &doc, const QgsReadWriteContext &context ) const;
/**
* Sets the item stack's state from a DOM document, where \a element is a DOM node corresponding to a 'LayoutMap' tag.
* Returns true if read was successful.
* \see writeXml()
*/
virtual bool readXml( const QDomElement &element, const QDomDocument &doc ) = 0;
virtual bool readXml( const QDomElement &element, const QDomDocument &doc, const QgsReadWriteContext &context ) = 0;
/**
* Draws the items from the stack on a specified \a painter.

View File

@ -145,7 +145,7 @@ void QgsLayoutItemMapOverview::draw( QPainter *painter )
painter->restore();
}
bool QgsLayoutItemMapOverview::writeXml( QDomElement &elem, QDomDocument &doc ) const
bool QgsLayoutItemMapOverview::writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const
{
if ( elem.isNull() )
{
@ -160,18 +160,15 @@ bool QgsLayoutItemMapOverview::writeXml( QDomElement &elem, QDomDocument &doc )
overviewFrameElem.setAttribute( QStringLiteral( "inverted" ), mInverted );
overviewFrameElem.setAttribute( QStringLiteral( "centered" ), mCentered );
QgsReadWriteContext context;
context.setPathResolver( mLayout->project()->pathResolver() );
QDomElement frameStyleElem = QgsSymbolLayerUtils::saveSymbol( QString(), mFrameSymbol.get(), doc, context );
overviewFrameElem.appendChild( frameStyleElem );
bool ok = QgsLayoutItemMapItem::writeXml( overviewFrameElem, doc );
bool ok = QgsLayoutItemMapItem::writeXml( overviewFrameElem, doc, context );
elem.appendChild( overviewFrameElem );
return ok;
}
bool QgsLayoutItemMapOverview::readXml( const QDomElement &itemElem, const QDomDocument &doc )
bool QgsLayoutItemMapOverview::readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context )
{
Q_UNUSED( doc );
if ( itemElem.isNull() )
@ -179,7 +176,7 @@ bool QgsLayoutItemMapOverview::readXml( const QDomElement &itemElem, const QDomD
return false;
}
bool ok = QgsLayoutItemMapItem::readXml( itemElem, doc );
bool ok = QgsLayoutItemMapItem::readXml( itemElem, doc, context );
#if 0 //TODO
setFrameMapUuid( itemElem.attribute( QStringLiteral( "frameMap" ), QStringLiteral( "-1" ) ).toInt() );
@ -188,9 +185,6 @@ bool QgsLayoutItemMapOverview::readXml( const QDomElement &itemElem, const QDomD
mInverted = ( itemElem.attribute( QStringLiteral( "inverted" ), QStringLiteral( "0" ) ) != QLatin1String( "0" ) );
mCentered = ( itemElem.attribute( QStringLiteral( "centered" ), QStringLiteral( "0" ) ) != QLatin1String( "0" ) );
QgsReadWriteContext context;
context.setPathResolver( mLayout->project()->pathResolver() );
QDomElement frameStyleElem = itemElem.firstChildElement( QStringLiteral( "symbol" ) );
if ( !frameStyleElem.isNull() )
{
@ -384,7 +378,7 @@ QList<QgsLayoutItemMapOverview *> QgsLayoutItemMapOverviewStack::asList() const
return list;
}
bool QgsLayoutItemMapOverviewStack::readXml( const QDomElement &elem, const QDomDocument &doc )
bool QgsLayoutItemMapOverviewStack::readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context )
{
removeItems();
@ -394,7 +388,7 @@ bool QgsLayoutItemMapOverviewStack::readXml( const QDomElement &elem, const QDom
{
QDomElement mapOverviewElem = mapOverviewNodeList.at( i ).toElement();
QgsLayoutItemMapOverview *mapOverview = new QgsLayoutItemMapOverview( mapOverviewElem.attribute( QStringLiteral( "name" ) ), mMap );
mapOverview->readXml( mapOverviewElem, doc );
mapOverview->readXml( mapOverviewElem, doc, context );
mItems.append( mapOverview );
}

View File

@ -107,7 +107,7 @@ class CORE_EXPORT QgsLayoutItemMapOverviewStack : public QgsLayoutItemMapItemSta
* Returns a list of QgsLayoutItemMapOverviews contained by the stack.
*/
QList< QgsLayoutItemMapOverview * > asList() const;
bool readXml( const QDomElement &elem, const QDomDocument &doc ) override;
bool readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context ) override;
};
@ -133,8 +133,8 @@ class CORE_EXPORT QgsLayoutItemMapOverview : public QgsLayoutItemMapItem
QgsLayoutItemMapOverview( const QString &name, QgsLayoutItemMap *map );
void draw( QPainter *painter ) override;
bool writeXml( QDomElement &elem, QDomDocument &doc ) const override;
bool readXml( const QDomElement &itemElem, const QDomDocument &doc ) override;
bool writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const override;
bool readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context ) override;
bool usesAdvancedEffects() const override;
/**

View File

@ -98,15 +98,6 @@ class CORE_EXPORT QgsLayoutItemPicture: public QgsLayoutItem
*/
QString picturePath() const;
#if 0
/**
* Sets this items bound in scene coordinates such that 1 item size units
* corresponds to 1 scene size unit and resizes the svg symbol / image
*/
void setSceneRect( const QRectF &rectangle ) override;
#endif
/**
* Returns the rotation used for drawing the picture within the item's frame,
* in degrees clockwise.