From 48a45b3bff0cde257f346df7da1f5fbe6a544adf Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 24 Oct 2017 12:02:57 +1000 Subject: [PATCH] Restore serialization for map items --- python/core/layout/qgslayoutitemmap.sip | 5 +- python/core/layout/qgslayoutitemmapgrid.sip | 6 +- python/core/layout/qgslayoutitemmapitem.sip | 8 +- .../core/layout/qgslayoutitemmapoverview.sip | 6 +- python/core/layout/qgslayoutitempicture.sip | 1 - src/core/layout/qgslayoutitemmap.cpp | 244 ++++++++++++++++++ src/core/layout/qgslayoutitemmap.h | 17 +- src/core/layout/qgslayoutitemmapgrid.cpp | 26 +- src/core/layout/qgslayoutitemmapgrid.h | 6 +- src/core/layout/qgslayoutitemmapitem.cpp | 8 +- src/core/layout/qgslayoutitemmapitem.h | 8 +- src/core/layout/qgslayoutitemmapoverview.cpp | 18 +- src/core/layout/qgslayoutitemmapoverview.h | 6 +- src/core/layout/qgslayoutitempicture.h | 9 - 14 files changed, 290 insertions(+), 78 deletions(-) diff --git a/python/core/layout/qgslayoutitemmap.sip b/python/core/layout/qgslayoutitemmap.sip index 44c09ae734d..e1eec593aac 100644 --- a/python/core/layout/qgslayoutitemmap.sip +++ b/python/core/layout/qgslayoutitemmap.sip @@ -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; diff --git a/python/core/layout/qgslayoutitemmapgrid.sip b/python/core/layout/qgslayoutitemmapgrid.sip index d672b3156ce..122fd166441 100644 --- a/python/core/layout/qgslayoutitemmapgrid.sip +++ b/python/core/layout/qgslayoutitemmapgrid.sip @@ -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 ); diff --git a/python/core/layout/qgslayoutitemmapitem.sip b/python/core/layout/qgslayoutitemmapitem.sip index d679c3ab084..ef86fa71e84 100644 --- a/python/core/layout/qgslayoutitemmapitem.sip +++ b/python/core/layout/qgslayoutitemmapitem.sip @@ -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. diff --git a/python/core/layout/qgslayoutitemmapoverview.sip b/python/core/layout/qgslayoutitemmapoverview.sip index 02dbfc39fea..a31053157da 100644 --- a/python/core/layout/qgslayoutitemmapoverview.sip +++ b/python/core/layout/qgslayoutitemmapoverview.sip @@ -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; diff --git a/python/core/layout/qgslayoutitempicture.sip b/python/core/layout/qgslayoutitempicture.sip index dc1d746892c..6cfd6014f57 100644 --- a/python/core/layout/qgslayoutitempicture.sip +++ b/python/core/layout/qgslayoutitempicture.sip @@ -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, diff --git a/src/core/layout/qgslayoutitemmap.cpp b/src/core/layout/qgslayoutitemmap.cpp index 9aa5cd57626..fdd0a31f55a 100644 --- a/src/core/layout/qgslayoutitemmap.cpp +++ b/src/core/layout/qgslayoutitemmap.cpp @@ -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( 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 ) diff --git a/src/core/layout/qgslayoutitemmap.h b/src/core/layout/qgslayoutitemmap.h index 4ee46c0fc17..9d1612555b4 100644 --- a/src/core/layout/qgslayoutitemmap.h +++ b/src/core/layout/qgslayoutitemmap.h @@ -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; diff --git a/src/core/layout/qgslayoutitemmapgrid.cpp b/src/core/layout/qgslayoutitemmapgrid.cpp index 3887882f305..337dda8f044 100644 --- a/src/core/layout/qgslayoutitemmapgrid.cpp +++ b/src/core/layout/qgslayoutitemmapgrid.cpp @@ -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 diff --git a/src/core/layout/qgslayoutitemmapgrid.h b/src/core/layout/qgslayoutitemmapgrid.h index e8baf38d43e..557a7f8c6e0 100644 --- a/src/core/layout/qgslayoutitemmapgrid.h +++ b/src/core/layout/qgslayoutitemmapgrid.h @@ -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. diff --git a/src/core/layout/qgslayoutitemmapitem.cpp b/src/core/layout/qgslayoutitemmapitem.cpp index 05193bda7ef..1db8b282c35 100644 --- a/src/core/layout/qgslayoutitemmapitem.cpp +++ b/src/core/layout/qgslayoutitemmapitem.cpp @@ -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 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; diff --git a/src/core/layout/qgslayoutitemmapitem.h b/src/core/layout/qgslayoutitemmapitem.h index 4d45027a55f..436a2237e8c 100644 --- a/src/core/layout/qgslayoutitemmapitem.h +++ b/src/core/layout/qgslayoutitemmapitem.h @@ -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. diff --git a/src/core/layout/qgslayoutitemmapoverview.cpp b/src/core/layout/qgslayoutitemmapoverview.cpp index 8f204d922cb..1778fe8b9b8 100644 --- a/src/core/layout/qgslayoutitemmapoverview.cpp +++ b/src/core/layout/qgslayoutitemmapoverview.cpp @@ -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 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 ); } diff --git a/src/core/layout/qgslayoutitemmapoverview.h b/src/core/layout/qgslayoutitemmapoverview.h index 036a8a1507a..0632a9b1ed7 100644 --- a/src/core/layout/qgslayoutitemmapoverview.h +++ b/src/core/layout/qgslayoutitemmapoverview.h @@ -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; /** diff --git a/src/core/layout/qgslayoutitempicture.h b/src/core/layout/qgslayoutitempicture.h index d4b4ad60549..2cbd7449c03 100644 --- a/src/core/layout/qgslayoutitempicture.h +++ b/src/core/layout/qgslayoutitempicture.h @@ -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.