Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Merge pull request #5913 from elpaso/layouts-import-from-2
[layouts] import from 2.x
- Loading branch information
Showing
with
6,336 additions
and 35 deletions.
- +4 −0 .ci/travis/linux/blacklist.txt
- +1 −0 python/core/layout/qgslayout.sip
- +1 −1 python/core/layout/qgslayoutitemattributetable.sip
- +1 −1 python/core/layout/qgslayoutitemlabel.sip
- +8 −0 python/core/layout/qgslayoutitemshape.sip
- +4 −1 python/core/qgsmultirenderchecker.sip
- +3 −0 scripts/spell_check/.agignore
- +2 −0 src/core/CMakeLists.txt
- +1 −0 src/core/composer/qgscomposerlegend.h
- +1,676 −0 src/core/layout/qgscompositionconverter.cpp
- +231 −0 src/core/layout/qgscompositionconverter.h
- +28 −0 src/core/layout/qgslayout.h
- +1 −0 src/core/layout/qgslayoutitem.h
- +1 −1 src/core/layout/qgslayoutitemattributetable.cpp
- +1 −1 src/core/layout/qgslayoutitemattributetable.h
- +1 −1 src/core/layout/qgslayoutitemlabel.h
- +3 −0 src/core/layout/qgslayoutitemlegend.h
- +1 −0 src/core/layout/qgslayoutitemmap.h
- +2 −2 src/core/layout/qgslayoutitemnodeitem.cpp
- +1 −1 src/core/layout/qgslayoutitemnodeitem.h
- +3 −0 src/core/layout/qgslayoutitempicture.h
- +1 −1 src/core/layout/qgslayoutitempolyline.cpp
- +2 −0 src/core/layout/qgslayoutitempolyline.h
- +2 −0 src/core/layout/qgslayoutitemscalebar.h
- +5 −0 src/core/layout/qgslayoutitemshape.cpp
- +8 −0 src/core/layout/qgslayoutitemshape.h
- +12 −7 src/core/layout/qgslayoutmanager.cpp
- +1 −0 src/core/layout/qgslayoutobject.h
- +1 −0 src/core/layout/qgslayouttable.h
- +2 −0 src/core/layout/qgslayouttablecolumn.h
- +24 −17 src/core/qgsmultirenderchecker.cpp
- +4 −1 src/core/qgsmultirenderchecker.h
- +1 −0 tests/src/core/CMakeLists.txt
- +669 −0 tests/src/core/testqgscompositionconverter.cpp
- BIN ...rol_images/compositionconverter/expected_importComposerAtlas_0/expected_importComposerAtlas_0.png
- BIN ...sitionconverter/expected_importComposerTemplateArrow_0/expected_importComposerTemplateArrow_0.png
- BIN ...pected_importComposerTemplateAttributeTable_0/expected_importComposerTemplateAttributeTable_0.png
- BIN ...positionconverter/expected_importComposerTemplateHtml_0/expected_importComposerTemplateHtml_0.png
- BIN ...sitionconverter/expected_importComposerTemplateLabel_0/expected_importComposerTemplateLabel_0.png
- BIN ...nconverter/expected_importComposerTemplateLabel_0/expected_importComposerTemplateLabel_0_mask.png
- BIN ...tionconverter/expected_importComposerTemplateLegend_0/expected_importComposerTemplateLegend_0.png
- BIN ...ompositionconverter/expected_importComposerTemplateMap_0/expected_importComposerTemplateMap_0.png
- BIN ...itionconverter/expected_importComposerTemplateMap_0/expected_importComposerTemplateMap_0_mask.png
- BIN ...onconverter/expected_importComposerTemplatePicture_0/expected_importComposerTemplatePicture_0.png
- BIN ...onconverter/expected_importComposerTemplatePolygon_0/expected_importComposerTemplatePolygon_0.png
- BIN ...converter/expected_importComposerTemplatePolyline_0/expected_importComposerTemplatePolyline_0.png
- BIN ...converter/expected_importComposerTemplateScaleBar_0/expected_importComposerTemplateScaleBar_0.png
- BIN ...sitionconverter/expected_importComposerTemplateShape_0/expected_importComposerTemplateShape_0.png
- BIN ...ages/compositionconverter/expected_importComposerTemplate_0/expected_importComposerTemplate_0.png
- BIN ...compositionconverter/expected_importComposerTemplate_0/expected_importComposerTemplate_0_mask.png
- BIN ...ages/compositionconverter/expected_importComposerTemplate_1/expected_importComposerTemplate_1.png
- +833 −0 tests/testdata/layouts/2x_template.qpt
- +185 −0 tests/testdata/layouts/2x_template_arrow.qpt
- +41 −0 tests/testdata/layouts/2x_template_atlas.qpt
- +70 −0 tests/testdata/layouts/2x_template_attributetable.qpt
- +79 −0 tests/testdata/layouts/2x_template_html.qpt
- +50 −0 tests/testdata/layouts/2x_template_label.qpt
- +106 −0 tests/testdata/layouts/2x_template_legend.qpt
- +175 −0 tests/testdata/layouts/2x_template_map.qpt
- +217 −0 tests/testdata/layouts/2x_template_map_overview.qpt
- +88 −0 tests/testdata/layouts/2x_template_pictures.qpt
- +112 −0 tests/testdata/layouts/2x_template_polygon.qpt
- +137 −0 tests/testdata/layouts/2x_template_polyline.qpt
- +66 −0 tests/testdata/layouts/2x_template_portrait.qpt
- +84 −0 tests/testdata/layouts/2x_template_scalebar.qpt
- +107 −0 tests/testdata/layouts/2x_template_shape.qpt
- 0 tests/testdata/layouts/sample_project.qgd
- +1,280 −0 tests/testdata/layouts/sample_project.qgs
@@ -0,0 +1,231 @@ | ||
/*************************************************************************** | ||
qgscompositionconverter.h - Convert a QGIS 2.x composition to a layout | ||
--------------------- | ||
begin : 13.12.2017 | ||
copyright : (C) 2017 by Alessandro Pasotti | ||
email : elpaso at itopen dot it | ||
*************************************************************************** | ||
* * | ||
* This program is free software; you can redistribute it and/or modify * | ||
* it under the terms of the GNU General Public License as published by * | ||
* the Free Software Foundation; either version 2 of the License, or * | ||
* (at your option) any later version. * | ||
* * | ||
***************************************************************************/ | ||
#ifndef QGSCOMPOSITIONCONVERTER_H | ||
#define QGSCOMPOSITIONCONVERTER_H | ||
|
||
|
||
#include <QDomDocument> | ||
#include <QDomElement> | ||
|
||
#include "qgis.h" | ||
#include "qgis_sip.h" | ||
|
||
#define SIP_NO_FILE | ||
|
||
#include "qgspropertycollection.h" | ||
|
||
class QgsPrintLayout; | ||
class QgsLayoutItem; | ||
class QgsLayoutObject; | ||
class QgsReadWriteContext; | ||
class QgsProperty; | ||
class QgsPropertyCollection; | ||
|
||
class QgsLayoutItemLabel; | ||
class QgsLayoutItemShape; | ||
class QgsLayoutItemPicture; | ||
class QgsLayoutItemPolygon; | ||
class QgsLayoutItemPolyline; | ||
class QgsLayoutItemMap; | ||
class QgsLayoutItemScaleBar; | ||
class QgsLayoutItemLegend; | ||
class QgsLayoutItemHtml; | ||
class QgsLayoutItemAttributeTable; | ||
|
||
|
||
/** | ||
* QgsCompositionConverter class converts a QGIS 2.x composition to a QGIS 3.x layout | ||
* \since QGIS 3.0 | ||
* \note Not available in Python bindings. | ||
* \ingroup core | ||
*/ | ||
class CORE_EXPORT QgsCompositionConverter | ||
{ | ||
public: | ||
|
||
/** | ||
* Composition data defined properties for different item types | ||
*/ | ||
enum DataDefinedProperty | ||
{ | ||
NoProperty = 0, //!< No property | ||
AllProperties, //!< All properties for item | ||
TestProperty, //!< Dummy property with no effect on item | ||
//composer page properties | ||
PresetPaperSize, //!< Preset paper size for composition | ||
PaperWidth, //!< Paper width | ||
PaperHeight, //!< Paper height | ||
NumPages, //!< Number of pages in composition | ||
PaperOrientation, //!< Paper orientation | ||
//general composer item properties | ||
PageNumber, //!< Page number for item placement | ||
PositionX, //!< X position on page | ||
PositionY, //!< Y position on page | ||
ItemWidth, //!< Width of item | ||
ItemHeight, //!< Height of item | ||
ItemRotation, //!< Rotation of item | ||
Transparency, //!< Item transparency (deprecated) | ||
Opacity, //!< Item opacity | ||
BlendMode, //!< Item blend mode | ||
ExcludeFromExports, //!< Exclude item from exports | ||
FrameColor, //!< Item frame color | ||
BackgroundColor, //!< Item background color | ||
//composer map | ||
MapRotation, //!< Map rotation | ||
MapScale, //!< Map scale | ||
MapXMin, //!< Map extent x minimum | ||
MapYMin, //!< Map extent y minimum | ||
MapXMax, //!< Map extent x maximum | ||
MapYMax, //!< Map extent y maximum | ||
MapAtlasMargin, //!< Map atlas margin | ||
MapLayers, //!< Map layer set | ||
MapStylePreset, //!< Layer and style map theme | ||
//composer picture | ||
PictureSource, //!< Picture source url | ||
PictureSvgBackgroundColor, //!< SVG background color | ||
PictureSvgStrokeColor, //!< SVG stroke color | ||
PictureSvgStrokeWidth, //!< SVG stroke width | ||
//html item | ||
SourceUrl, //!< Html source url | ||
//legend item | ||
LegendTitle, //!< Legend title | ||
LegendColumnCount, //!< Legend column count | ||
//scalebar item | ||
ScalebarFillColor, //!< Scalebar fill color | ||
ScalebarFillColor2, //!< Scalebar secondary fill color | ||
ScalebarLineColor, //!< Scalebar line color | ||
ScalebarLineWidth, //!< Scalebar line width | ||
}; | ||
|
||
/** | ||
* The MarkerMode enum is the old QGIS 2.x arrow marker mode | ||
*/ | ||
enum MarkerMode | ||
{ | ||
DefaultMarker, | ||
NoMarker, | ||
SVGMarker | ||
}; | ||
|
||
|
||
/** | ||
* createLayoutFromCompositionXml is a factory that creates layout instances from a | ||
* QGIS 2.x XML composition \a parentElement and a QGIS \a project | ||
* \return a QgsPrintLayout instance | ||
*/ | ||
static std::unique_ptr<QgsPrintLayout> createLayoutFromCompositionXml( const QDomElement &composerElement, | ||
QgsProject *project ); | ||
|
||
|
||
/** | ||
* addItemsFromCompositionXml parse a QGIS 2.x composition XML in the \a parentElement, | ||
* converts the 2.x items to the new layout elements and add them to the \a layout | ||
* \param layout where the items will be added | ||
* \param parentElement parent DOM element | ||
* \param position for pasting | ||
* \param pasteInPlace if true element position is translated to \a position | ||
* \return list of layout object items that have been added to the layout | ||
*/ | ||
static QList<QgsLayoutObject *> addItemsFromCompositionXml( QgsPrintLayout *layout, | ||
const QDomElement &parentElement, | ||
QPointF *position = nullptr, | ||
bool pasteInPlace = false ); | ||
|
||
private: | ||
|
||
|
||
//! Property definitions | ||
static QgsPropertiesDefinition sPropertyDefinitions; | ||
|
||
|
||
static bool readLabelXml( QgsLayoutItemLabel *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project ); | ||
|
||
static bool readShapeXml( QgsLayoutItemShape *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project ); | ||
|
||
static bool readPictureXml( QgsLayoutItemPicture *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project, | ||
const QgsStringMap &mapId2Uuid ); | ||
|
||
//! For both polylines and polygons | ||
template <class T, class T2> static bool readPolyXml( T *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project ); | ||
|
||
static bool readArrowXml( QgsLayoutItemPolyline *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project ); | ||
|
||
static bool readMapXml( QgsLayoutItemMap *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project, | ||
QgsStringMap &mapId2Uuid ); | ||
|
||
static bool readScaleBarXml( QgsLayoutItemScaleBar *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project, | ||
const QgsStringMap &mapId2Uuid ); | ||
|
||
static bool readLegendXml( QgsLayoutItemLegend *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project, | ||
const QgsStringMap &mapId2Uuid ); | ||
|
||
static bool readAtlasXml( QgsLayoutAtlas *atlasItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project ); | ||
|
||
static bool readHtmlXml( QgsLayoutItemHtml *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project ); | ||
|
||
static bool readTableXml( QgsLayoutItemAttributeTable *layoutItem, | ||
const QDomElement &itemElem, | ||
const QgsProject *project ); | ||
|
||
static bool readOldComposerObjectXml( QgsLayoutObject *layoutItem, const QDomElement &itemElem ); | ||
|
||
static void readOldDataDefinedPropertyMap( const QDomElement &itemElem, | ||
QgsPropertyCollection &dataDefinedProperties ); | ||
|
||
static QgsProperty readOldDataDefinedProperty( const DataDefinedProperty property, const QDomElement &ddElem ); | ||
|
||
static void initPropertyDefinitions(); | ||
|
||
static QgsPropertiesDefinition propertyDefinitions(); | ||
|
||
//! Reads parameter that are not subclass specific in document. Usually called from readXml methods of subclasses | ||
static bool readXml( QgsLayoutItem *layoutItem, const QDomElement &itemElem ); | ||
|
||
//! Make some common import adjustments | ||
static void adjustPos( QgsPrintLayout *layout, QgsLayoutItem *layoutItem, QPointF *position, bool &pasteInPlace, int zOrderOffset, QPointF &pasteShiftPos, int &pageNumber ); | ||
|
||
//! Restore general composer item properties | ||
static void restoreGeneralComposeItemProperties( QgsLayoutItem *layoutItem, const QDomElement &itemElem ); | ||
|
||
//! Get item position | ||
static QRectF itemPosition( QgsLayoutItem *layoutItem, const QDomElement &itemElem ); | ||
|
||
//! Calculates the item minimum position from an xml string | ||
static QPointF minPointFromXml( const QDomElement &elem ); | ||
|
||
}; | ||
|
||
#endif // QGSCOMPOSITIONCONVERTER_H |
Oops, something went wrong.