59 void QgsCompositionConverter::initPropertyDefinitions()
61 if ( !sPropertyDefinitions.isEmpty() )
69 "|<b>B5</b>|<b>B4</b>|<b>B3</b>|<b>B2</b>|<b>B1</b>|<b>B0</b>" 70 "|<b>Legal</b>|<b>Ansi A</b>|<b>Ansi B</b>|<b>Ansi C</b>|<b>Ansi D</b>|<b>Ansi E</b>" 71 "|<b>Arch A</b>|<b>Arch B</b>|<b>Arch C</b>|<b>Arch D</b>|<b>Arch E</b>|<b>Arch E1</b>]" 115 QgsCompositionConverter::initPropertyDefinitions();
116 return sPropertyDefinitions;
122 initPropertyDefinitions();
124 QDomElement parentElement = composerElement.parentNode().toElement();
126 std::unique_ptr< QgsPrintLayout > layout = qgis::make_unique< QgsPrintLayout >( project );
127 layout->undoStack()->blockCommands(
true );
129 layout->mCustomProperties.readXml( composerElement );
132 layout->guides().setVisible( composerElement.attribute( QStringLiteral(
"guidesVisible" ), QStringLiteral(
"1" ) ).toInt() != 0 );
134 int printResolution = composerElement.attribute( QStringLiteral(
"printResolution" ), QStringLiteral(
"300" ) ).toInt();
135 layout->renderContext().setDpi( printResolution );
138 int pages = composerElement.attribute( QStringLiteral(
"numPages" ) ).toInt( );
139 float paperHeight = composerElement.attribute( QStringLiteral(
"paperHeight" ) ).toDouble( );
140 float paperWidth = composerElement.attribute( QStringLiteral(
"paperWidth" ) ).toDouble( );
142 if ( composerElement.elementsByTagName( QStringLiteral(
"symbol" ) ).size() )
144 QDomElement symbolElement = composerElement.elementsByTagName( QStringLiteral(
"symbol" ) ).at( 0 ).toElement();
148 std::unique_ptr< QgsFillSymbol > symbol( QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( symbolElement, context ) );
150 layout->pageCollection()->setPageStyleSymbol( symbol.get() );
153 QString name = composerElement.attribute( QStringLiteral(
"name" ) );
155 if ( name.isEmpty() )
156 name = composerElement.attribute( QStringLiteral(
"title" ) );
158 if ( name.isEmpty() )
159 name = parentElement.attribute( QStringLiteral(
"title" ) );
160 layout->setName( name );
162 for (
int j = 0; j < pages; j++ )
166 layout->pageCollection()->addPage( page );
168 QDomNodeList snapLineNodes = composerElement.elementsByTagName( QStringLiteral(
"SnapLine" ) );
169 for (
int i = 0; i < snapLineNodes.size(); ++i )
171 QDomElement snapLineElem = snapLineNodes.at( i ).toElement();
172 double x1 = snapLineElem.attribute( QStringLiteral(
"x1" ) ).toDouble();
173 double y1 = snapLineElem.attribute( QStringLiteral(
"y1" ) ).toDouble();
174 double x2 = snapLineElem.attribute( QStringLiteral(
"x2" ) ).toDouble();
176 Qt::Orientation orientation( x1 == x2 ? Qt::Orientation::Vertical : Qt::Orientation::Horizontal );
178 std::unique_ptr< QgsLayoutGuide > guide = qgis::make_unique< QgsLayoutGuide >( orientation, position, page );
179 layout->guides().addGuide( guide.release() );
185 if ( parentElement.elementsByTagName( QStringLiteral(
"Atlas" ) ).size() )
187 QDomElement atlasElement = parentElement.elementsByTagName( QStringLiteral(
"Atlas" ) ).at( 0 ).toElement();
188 readAtlasXml( layout->atlas(), atlasElement, layout->project() );
191 layout->undoStack()->blockCommands(
false );
196 void QgsCompositionConverter::adjustPos(
QgsPrintLayout *layout,
QgsLayoutItem *layoutItem, QPointF *position,
bool &pasteInPlace,
int zOrderOffset, QPointF &pasteShiftPos,
int &pageNumber )
206 layoutItem->
attemptMoveBy( pasteShiftPos.x(), pasteShiftPos.y() );
211 layoutItem->setZValue( layoutItem->zValue() + zOrderOffset );
214 void QgsCompositionConverter::restoreGeneralComposeItemProperties(
QgsLayoutItem *layoutItem,
const QDomElement &itemElem )
217 QDomNodeList composerItemList = itemElem.elementsByTagName( QStringLiteral(
"ComposerItem" ) );
218 if ( !composerItemList.isEmpty() )
220 QDomElement composerItemElem = composerItemList.at( 0 ).toElement();
223 if ( !
qgsDoubleNear( composerItemElem.attribute( QStringLiteral(
"rotation" ), QStringLiteral(
"0" ) ).toDouble(), 0.0 ) )
226 layoutItem->
setItemRotation( composerItemElem.attribute( QStringLiteral(
"rotation" ), QStringLiteral(
"0" ) ).toDouble(), false );
228 QgsCompositionConverter::readXml( layoutItem, composerItemElem );
232 QRectF QgsCompositionConverter::itemPosition(
QgsLayoutItem *layoutItem,
const QDomElement &itemElem )
235 double x, y, pagex, pagey, width, height;
236 bool xOk, yOk, pageOk, pagexOk, pageyOk, widthOk, heightOk, positionModeOk;
238 x = itemElem.attribute( QStringLiteral(
"x" ) ).toDouble( &xOk );
239 y = itemElem.attribute( QStringLiteral(
"y" ) ).toDouble( &yOk );
240 page = itemElem.attribute( QStringLiteral(
"page" ) ).toInt( &pageOk );
241 pagex = itemElem.attribute( QStringLiteral(
"pagex" ) ).toDouble( &pagexOk );
242 pagey = itemElem.attribute( QStringLiteral(
"pagey" ) ).toDouble( &pageyOk );
243 width = itemElem.attribute( QStringLiteral(
"width" ) ).toDouble( &widthOk );
244 height = itemElem.attribute( QStringLiteral(
"height" ) ).toDouble( &heightOk );
247 layoutItem->mReferencePoint =
static_cast< QgsLayoutItem::ReferencePoint >( itemElem.attribute( QStringLiteral(
"positionMode" ) ).toInt( &positionModeOk ) );
248 if ( !positionModeOk )
253 if ( pageOk && pagexOk && pageyOk )
259 if ( page <= layoutItem->layout()->pageCollection()->pageCount() )
272 return QRectF( x, y, width, height );
275 QPointF QgsCompositionConverter::minPointFromXml(
const QDomElement &elem )
277 double minX = std::numeric_limits<double>::max();
278 double minY = std::numeric_limits<double>::max();
279 QDomNodeList composerItemList = elem.elementsByTagName( QStringLiteral(
"ComposerItem" ) );
280 for (
int i = 0; i < composerItemList.size(); ++i )
282 QDomElement currentComposerItemElem = composerItemList.at( i ).toElement();
285 x = currentComposerItemElem.attribute( QStringLiteral(
"x" ) ).toDouble( &xOk );
286 y = currentComposerItemElem.attribute( QStringLiteral(
"y" ) ).toDouble( &yOk );
291 minX = std::min( minX, x );
292 minY = std::min( minY, y );
294 if ( minX < std::numeric_limits<double>::max() )
296 return QPointF( minX, minY );
300 return QPointF( 0, 0 );
307 initPropertyDefinitions();
309 QList< QgsLayoutObject * > newItems;
314 int zOrderOffset = layout->mItemsModel->zOrderListSize();
316 QPointF pasteShiftPos;
323 QPointF minItemPos = minPointFromXml( parentElement );
326 pasteShiftPos = *position - minItemPos;
329 pageNumber = layout->mPageCollection->pageNumberForPoint( *position );
336 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerMap" ) ).size(); i++ )
338 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerMap" ) ).at( i ) );
340 readMapXml( layoutItem, itemNode.toElement(), layout->
project(), mapIdUiidMap );
341 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
342 newItems << layoutItem ;
346 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerLabel" ) ).size(); i++ )
348 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerLabel" ) ).at( i ) );
350 readLabelXml( layoutItem, itemNode.toElement(), layout->
project() );
351 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
352 newItems << layoutItem ;
356 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerShape" ) ).size(); i++ )
358 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerShape" ) ).at( i ) );
360 readShapeXml( layoutItem, itemNode.toElement(), layout->
project() );
361 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
362 newItems << layoutItem ;
366 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerPicture" ) ).size(); i++ )
368 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerPicture" ) ).at( i ) );
370 readPictureXml( layoutItem, itemNode.toElement(), layout->
project(), mapIdUiidMap );
371 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
372 newItems << layoutItem ;
376 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerPolygon" ) ).size(); i++ )
378 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerPolygon" ) ).at( i ) );
380 readPolyXml<QgsLayoutItemPolygon, QgsFillSymbol>( layoutItem, itemNode.toElement(), layout->
project() );
381 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
382 newItems << layoutItem ;
386 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerPolyline" ) ).size(); i++ )
388 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerPolyline" ) ).at( i ) );
390 readPolyXml<QgsLayoutItemPolyline, QgsLineSymbol>( layoutItem, itemNode.toElement(), layout->
project() );
391 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
392 newItems << layoutItem ;
396 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerArrow" ) ).size(); i++ )
398 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerArrow" ) ).at( i ) );
400 readArrowXml( layoutItem, itemNode.toElement(), layout->
project() );
401 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
402 newItems << layoutItem ;
406 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerScaleBar" ) ).size(); i++ )
408 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerScaleBar" ) ).at( i ) );
410 readScaleBarXml( layoutItem, itemNode.toElement(), layout->
project(), mapIdUiidMap );
411 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
412 newItems << layoutItem ;
416 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerLegend" ) ).size(); i++ )
418 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerLegend" ) ).at( i ) );
420 readLegendXml( layoutItem, itemNode.toElement(), layout->
project(), mapIdUiidMap );
421 adjustPos( layout, layoutItem, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
422 newItems << layoutItem ;
426 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerHtml" ) ).size(); i++ )
428 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerHtml" ) ).at( i ) );
430 readHtmlXml( layoutItem, itemNode.toElement(), layout->
project() );
432 const QList<QgsLayoutFrame *> framesList( layoutItem->frames() );
433 for (
const auto &frame : framesList )
435 adjustPos( layout, frame, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
437 newItems << layoutItem ;
441 for (
int i = 0; i < parentElement.elementsByTagName( QStringLiteral(
"ComposerAttributeTableV2" ) ).size(); i++ )
443 QDomNode itemNode( parentElement.elementsByTagName( QStringLiteral(
"ComposerAttributeTableV2" ) ).at( i ) );
445 readTableXml( layoutItem, itemNode.toElement(), layout->
project() );
447 const QList<QgsLayoutFrame *> framesList( layoutItem->frames() );
448 for (
const auto &frame : framesList )
450 adjustPos( layout, frame, position, pasteInPlace, zOrderOffset, pasteShiftPos, pageNumber );
452 newItems << layoutItem ;
460 return document.elementsByTagName( QStringLiteral(
"Composition" ) ).count() > 0;
469 if ( document.elementsByTagName( QStringLiteral(
"Composition" ) ).count( ) > 0 )
471 QDomElement composerElem = document.elementsByTagName( QStringLiteral(
"Composition" ) ).at( 0 ).toElement( );
475 QDomElement elem = layout->writeXml( doc, context );
476 doc.appendChild( elem );
484 if ( itemElem.isNull() )
489 restoreGeneralComposeItemProperties( layoutItem, itemElem );
492 layoutItem->
setText( itemElem.attribute( QStringLiteral(
"labelText" ) ) );
495 layoutItem->
setMode( itemElem.attribute( QStringLiteral(
"htmlState" ) ).toInt() == Qt::Checked ? QgsLayoutItemLabel::Mode::ModeHtml : QgsLayoutItemLabel::Mode::ModeFont );
498 bool marginXOk =
false;
499 bool marginYOk =
false;
500 double marginX = itemElem.attribute( QStringLiteral(
"marginX" ) ).toDouble( &marginXOk );
501 double marginY = itemElem.attribute( QStringLiteral(
"marginY" ) ).toDouble( &marginYOk );
502 if ( !marginXOk || !marginYOk )
505 double margin = itemElem.attribute( QStringLiteral(
"margin" ), QStringLiteral(
"1.0" ) ).toDouble();
513 layoutItem->
setHAlign( static_cast< Qt::AlignmentFlag >( itemElem.attribute( QStringLiteral(
"halign" ) ).toInt() ) );
516 layoutItem->
setVAlign( static_cast< Qt::AlignmentFlag >( itemElem.attribute( QStringLiteral(
"valign" ) ).toInt() ) );
525 QDomNodeList fontColorList = itemElem.elementsByTagName( QStringLiteral(
"FontColor" ) );
526 if ( !fontColorList.isEmpty() )
528 QDomElement fontColorElem = fontColorList.at( 0 ).toElement();
529 int red = fontColorElem.attribute( QStringLiteral(
"red" ), QStringLiteral(
"0" ) ).toInt();
530 int green = fontColorElem.attribute( QStringLiteral(
"green" ), QStringLiteral(
"0" ) ).toInt();
531 int blue = fontColorElem.attribute( QStringLiteral(
"blue" ), QStringLiteral(
"0" ) ).toInt();
545 layoutItem->
setShapeType( static_cast<QgsLayoutItemShape::Shape>( itemElem.attribute( QStringLiteral(
"shapeType" ), QStringLiteral(
"0" ) ).toInt() ) );
548 restoreGeneralComposeItemProperties( layoutItem, itemElem );
554 if ( itemElem.elementsByTagName( QStringLiteral(
"symbol" ) ).size() )
556 QDomElement symbolElement = itemElem.elementsByTagName( QStringLiteral(
"symbol" ) ).at( 0 ).toElement();
557 QgsFillSymbol *shapeStyleSymbol = QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( symbolElement, context );
558 if ( shapeStyleSymbol )
559 layoutItem->
setSymbol( shapeStyleSymbol );
568 properties.insert( QStringLiteral(
"style" ), QStringLiteral(
"solid" ) );
572 properties.insert( QStringLiteral(
"style" ), QStringLiteral(
"no" ) );
576 properties.insert( QStringLiteral(
"style_border" ), QStringLiteral(
"solid" ) );
580 properties.insert( QStringLiteral(
"style_border" ), QStringLiteral(
"no" ) );
583 properties.insert( QStringLiteral(
"width_border" ), QString::number( layoutItem->pen().widthF() ) );
586 QDomNodeList outlineColorList = itemElem.elementsByTagName( QStringLiteral(
"OutlineColor" ) );
587 if ( !outlineColorList.isEmpty() )
589 QDomElement frameColorElem = outlineColorList.at( 0 ).toElement();
590 bool redOk, greenOk, blueOk, alphaOk, widthOk;
591 int penRed, penGreen, penBlue, penAlpha;
594 penWidth = itemElem.attribute( QStringLiteral(
"outlineWidth" ) ).toDouble( &widthOk );
595 penRed = frameColorElem.attribute( QStringLiteral(
"red" ) ).toInt( &redOk );
596 penGreen = frameColorElem.attribute( QStringLiteral(
"green" ) ).toInt( &greenOk );
597 penBlue = frameColorElem.attribute( QStringLiteral(
"blue" ) ).toInt( &blueOk );
598 penAlpha = frameColorElem.attribute( QStringLiteral(
"alpha" ) ).toInt( &alphaOk );
600 if ( redOk && greenOk && blueOk && alphaOk && widthOk )
603 properties.insert( QStringLiteral(
"width_border" ), QString::number( penWidth ) );
606 QDomNodeList fillColorList = itemElem.elementsByTagName( QStringLiteral(
"FillColor" ) );
607 if ( !fillColorList.isEmpty() )
609 QDomElement fillColorElem = fillColorList.at( 0 ).toElement();
610 bool redOk, greenOk, blueOk, alphaOk;
611 int fillRed, fillGreen, fillBlue, fillAlpha;
613 fillRed = fillColorElem.attribute( QStringLiteral(
"red" ) ).toInt( &redOk );
614 fillGreen = fillColorElem.attribute( QStringLiteral(
"green" ) ).toInt( &greenOk );
615 fillBlue = fillColorElem.attribute( QStringLiteral(
"blue" ) ).toInt( &blueOk );
616 fillAlpha = fillColorElem.attribute( QStringLiteral(
"alpha" ) ).toInt( &alphaOk );
618 if ( redOk && greenOk && blueOk && alphaOk )
621 properties.insert( QStringLiteral(
"style" ), QStringLiteral(
"solid" ) );
624 if ( itemElem.hasAttribute( QStringLiteral(
"transparentFill" ) ) )
627 bool hasOldTransparentFill = itemElem.attribute( QStringLiteral(
"transparentFill" ), QStringLiteral(
"0" ) ).toInt();
628 if ( hasOldTransparentFill )
630 properties.insert( QStringLiteral(
"style" ), QStringLiteral(
"no" ) );
645 restoreGeneralComposeItemProperties( layoutItem, itemElem );
649 bool positionModeOk =
false;
650 layoutItem->mReferencePoint =
static_cast< QgsLayoutItem::ReferencePoint >( itemElem.attribute( QStringLiteral(
"positionMode" ) ).toInt( &positionModeOk ) );
651 if ( !positionModeOk )
653 layoutItem->mReferencePoint = QgsLayoutItem::ReferencePoint::UpperLeft;
655 bool anchorPointOk =
false;
657 layoutItem->
setPictureAnchor( static_cast< QgsLayoutItem::ReferencePoint >( itemElem.attribute( QStringLiteral(
"anchorPoint" ), QString::number( QgsLayoutItem::ReferencePoint::Middle ) ).toInt( &anchorPointOk ) ) );
658 if ( !anchorPointOk )
660 layoutItem->mPictureAnchor = QgsLayoutItem::ReferencePoint::UpperLeft;
664 layoutItem->mSvgStrokeWidth = itemElem.attribute( QStringLiteral(
"svgBorderWidth" ), QStringLiteral(
"0.2" ) ).toDouble();
666 QString imagePath = itemElem.attribute( QStringLiteral(
"file" ) );
671 if ( imagePath.endsWith( QLatin1String(
".svg" ), Qt::CaseInsensitive ) )
674 imagePath = pathResolver.
readPath( imagePath );
677 layoutItem->mPictureHeight = itemElem.attribute( QStringLiteral(
"pictureHeight" ), QStringLiteral(
"10" ) ).toDouble();
678 layoutItem->mPictureWidth = itemElem.attribute( QStringLiteral(
"pictureWidth" ), QStringLiteral(
"10" ) ).toDouble();
681 if ( !
qgsDoubleNear( itemElem.attribute( QStringLiteral(
"pictureRotation" ), QStringLiteral(
"0" ) ).toDouble(), 0.0 ) )
683 layoutItem->mPictureRotation = itemElem.attribute( QStringLiteral(
"pictureRotation" ), QStringLiteral(
"0" ) ).toDouble();
687 layoutItem->mNorthMode =
static_cast< QgsLayoutItemPicture::NorthMode >( itemElem.attribute( QStringLiteral(
"northMode" ), QStringLiteral(
"0" ) ).toInt() );
688 layoutItem->mNorthOffset = itemElem.attribute( QStringLiteral(
"northOffset" ), QStringLiteral(
"0" ) ).toDouble();
690 QString rotationMapId = itemElem.attribute( QStringLiteral(
"mapId" ), QStringLiteral(
"-1" ) );
691 if ( rotationMapId != QStringLiteral(
"-1" ) )
705 readPolyXml<QgsLayoutItemPolyline, QgsLineSymbol>( layoutItem, itemElem, project );
707 QDomNodeList startPointList = itemElem.elementsByTagName( QStringLiteral(
"StartPoint" ) );
708 if ( ! startPointList.isEmpty() )
710 QDomElement node = startPointList.at( 0 ).toElement();
711 polygon.append( QPointF( node.attribute( QStringLiteral(
"x" ) ).toDouble( ), node.attribute( QStringLiteral(
"y" ) ).toDouble() ) );
713 QDomNodeList stopPointList = itemElem.elementsByTagName( QStringLiteral(
"StopPoint" ) );
714 if ( ! stopPointList.isEmpty() )
716 QDomElement node = stopPointList.at( 0 ).toElement();
717 polygon.append( QPointF( node.attribute( QStringLiteral(
"x" ) ).toDouble( ), node.attribute( QStringLiteral(
"y" ) ).toDouble() ) );
722 if ( markerMode == QgsCompositionConverter::MarkerMode::DefaultMarker )
724 layoutItem->setEndMarker( QgsLayoutItemPolyline::MarkerMode::ArrowHead );
725 layoutItem->setStartMarker( QgsLayoutItemPolyline::MarkerMode::NoMarker );
728 layoutItem->setArrowHeadStrokeWidth( itemElem.attribute( QStringLiteral(
"outlineWidth" ), QStringLiteral(
"1.0" ) ).toDouble( ) );
729 layoutItem->setArrowHeadWidth( itemElem.attribute( QStringLiteral(
"arrowHeadWidth" ), QStringLiteral(
"1.0" ) ).toDouble( ) );
731 else if ( markerMode == QgsCompositionConverter::MarkerMode::SVGMarker )
733 QString endMarkerFile = itemElem.attribute( QStringLiteral(
"endMarkerFile" ) );
734 QString startMarkerFile = itemElem.attribute( QStringLiteral(
"endMarkerFile" ) );
741 if ( !endMarkerFile.isEmpty() )
743 if ( endMarkerFile.endsWith( QLatin1String(
".svg" ), Qt::CaseInsensitive ) )
746 endMarkerFile = pathResolver.
readPath( endMarkerFile );
748 if ( !startMarkerFile.isEmpty() )
750 if ( startMarkerFile.endsWith( QLatin1String(
".svg" ), Qt::CaseInsensitive ) )
753 startMarkerFile = pathResolver.
readPath( startMarkerFile );
756 if ( !endMarkerFile.isEmpty() )
758 layoutItem->setEndMarker( QgsLayoutItemPolyline::MarkerMode::SvgMarker );
759 layoutItem->setEndSvgMarkerPath( endMarkerFile );
761 if ( !startMarkerFile.isEmpty() )
763 layoutItem->setStartMarker( QgsLayoutItemPolyline::MarkerMode::SvgMarker );
764 layoutItem->setStartSvgMarkerPath( startMarkerFile );
769 layoutItem->setEndMarker( QgsLayoutItemPolyline::MarkerMode::NoMarker );
770 layoutItem->setStartMarker( QgsLayoutItemPolyline::MarkerMode::NoMarker );
773 double margin = polygon.boundingRect().left() - layoutItem->pos().x();
774 polygon.translate( - polygon.boundingRect().left() + margin, - polygon.boundingRect().top() + margin );
775 layoutItem->setNodes( polygon );
782 restoreGeneralComposeItemProperties( layoutItem, itemElem );
784 mapId2Uuid[ itemElem.attribute( QStringLiteral(
"id" ) ) ] = layoutItem->
uuid();
795 QDomNodeList extentNodeList = itemElem.elementsByTagName( QStringLiteral(
"Extent" ) );
796 if ( !extentNodeList.isEmpty() )
798 QDomElement extentElem = extentNodeList.at( 0 ).toElement();
799 double xmin, xmax, ymin, ymax;
800 xmin = extentElem.attribute( QStringLiteral(
"xmin" ) ).toDouble();
801 xmax = extentElem.attribute( QStringLiteral(
"xmax" ) ).toDouble();
802 ymin = extentElem.attribute( QStringLiteral(
"ymin" ) ).toDouble();
803 ymax = extentElem.attribute( QStringLiteral(
"ymax" ) ).toDouble();
807 QDomNodeList crsNodeList = itemElem.elementsByTagName( QStringLiteral(
"crs" ) );
808 if ( !crsNodeList.isEmpty() )
810 QDomElement crsElem = crsNodeList.at( 0 ).toElement();
819 if ( !
qgsDoubleNear( itemElem.attribute( QStringLiteral(
"mapRotation" ), QStringLiteral(
"0" ) ).toDouble(), 0.0 ) )
821 layoutItem->
setMapRotation( itemElem.attribute( QStringLiteral(
"mapRotation" ), QStringLiteral(
"0" ) ).toDouble() );
825 layoutItem->
setFollowVisibilityPreset( itemElem.attribute( QStringLiteral(
"followPreset" ) ).compare( QLatin1String(
"true" ) ) == 0 );
829 QString keepLayerSetFlag = itemElem.attribute( QStringLiteral(
"keepLayerSet" ) );
830 if ( keepLayerSetFlag.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
839 QString drawCanvasItemsFlag = itemElem.attribute( QStringLiteral(
"drawCanvasItems" ), QStringLiteral(
"true" ) );
840 if ( drawCanvasItemsFlag.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
849 layoutItem->mLayerStyleOverrides.clear();
852 layoutItem->mLayers.clear();
854 QDomNodeList layerSetNodeList = itemElem.elementsByTagName( QStringLiteral(
"LayerSet" ) );
855 if ( !layerSetNodeList.isEmpty() )
857 QDomElement layerSetElem = layerSetNodeList.at( 0 ).toElement();
858 QDomNodeList layerIdNodeList = layerSetElem.elementsByTagName( QStringLiteral(
"Layer" ) );
859 layoutItem->mLayers.reserve( layerIdNodeList.size() );
860 for (
int i = 0; i < layerIdNodeList.size(); ++i )
862 QDomElement layerElem = layerIdNodeList.at( i ).toElement();
863 QString layerId = layerElem.text();
864 QString layerName = layerElem.attribute( QStringLiteral(
"name" ) );
865 QString layerSource = layerElem.attribute( QStringLiteral(
"source" ) );
866 QString layerProvider = layerElem.attribute( QStringLiteral(
"provider" ) );
868 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
870 layoutItem->mLayers << ref;
875 QDomNodeList layerStylesNodeList = itemElem.elementsByTagName( QStringLiteral(
"LayerStyles" ) );
876 layoutItem->mKeepLayerStyles = !layerStylesNodeList.isEmpty();
877 if ( layoutItem->mKeepLayerStyles )
879 QDomElement layerStylesElem = layerStylesNodeList.at( 0 ).toElement();
880 QDomNodeList layerStyleNodeList = layerStylesElem.elementsByTagName( QStringLiteral(
"LayerStyle" ) );
881 for (
int i = 0; i < layerStyleNodeList.size(); ++i )
883 const QDomElement &layerStyleElement = layerStyleNodeList.at( i ).toElement();
884 QString layerId = layerStyleElement.attribute( QStringLiteral(
"layerid" ) );
885 QString layerName = layerStyleElement.attribute( QStringLiteral(
"name" ) );
886 QString layerSource = layerStyleElement.attribute( QStringLiteral(
"source" ) );
887 QString layerProvider = layerStyleElement.attribute( QStringLiteral(
"provider" ) );
888 QgsMapLayerRef ref( layerId, layerName, layerSource, layerProvider );
892 style.
readXml( layerStyleElement );
893 layoutItem->mLayerStyleOverrides.insert( ref.
layerId, style.
xmlData() );
897 layoutItem->mDrawing =
false;
898 layoutItem->mNumCachedLayers = 0;
899 layoutItem->mCacheInvalidated =
true;
903 QDomNodeList mapOverviewNodeList = itemElem.elementsByTagName( QStringLiteral(
"ComposerMapOverview" ) );
904 for (
int i = 0; i < mapOverviewNodeList.size(); ++i )
906 QDomElement mapOverviewElem = mapOverviewNodeList.at( i ).toElement();
907 std::unique_ptr<QgsLayoutItemMapOverview> mapOverview(
new QgsLayoutItemMapOverview( mapOverviewElem.attribute( QStringLiteral(
"name" ) ), layoutItem ) );
908 mapOverview->readXml( mapOverviewElem, doc, context );
909 QString frameMapId = mapOverviewElem.attribute( QStringLiteral(
"frameMap" ), QStringLiteral(
"-1" ) );
910 if ( frameMapId != QStringLiteral(
"-1" ) && mapId2Uuid.contains( frameMapId ) )
915 mapOverview->setLinkedMap( mapInstance );
917 layoutItem->mOverviewStack->addOverview( mapOverview.release() );
922 layoutItem->mGridStack->readXml( itemElem, doc, context );
927 QDomNodeList gridNodeList = itemElem.elementsByTagName( QStringLiteral(
"Grid" ) );
928 if ( layoutItem->mGridStack->size() == 0 && !gridNodeList.isEmpty() )
930 QDomElement gridElem = gridNodeList.at( 0 ).toElement();
932 mapGrid->
setEnabled( gridElem.attribute( QStringLiteral(
"show" ), QStringLiteral(
"0" ) ) != QLatin1String(
"0" ) );
934 mapGrid->
setIntervalX( gridElem.attribute( QStringLiteral(
"intervalX" ), QStringLiteral(
"0" ) ).toDouble() );
935 mapGrid->
setIntervalY( gridElem.attribute( QStringLiteral(
"intervalY" ), QStringLiteral(
"0" ) ).toDouble() );
936 mapGrid->
setOffsetX( gridElem.attribute( QStringLiteral(
"offsetX" ), QStringLiteral(
"0" ) ).toDouble() );
937 mapGrid->
setOffsetY( gridElem.attribute( QStringLiteral(
"offsetY" ), QStringLiteral(
"0" ) ).toDouble() );
938 mapGrid->
setCrossLength( gridElem.attribute( QStringLiteral(
"crossLength" ), QStringLiteral(
"3" ) ).toDouble() );
939 mapGrid->
setFrameStyle( static_cast< QgsLayoutItemMapGrid::FrameStyle >( gridElem.attribute( QStringLiteral(
"gridFrameStyle" ), QStringLiteral(
"0" ) ).toInt() ) );
940 mapGrid->
setFrameWidth( gridElem.attribute( QStringLiteral(
"gridFrameWidth" ), QStringLiteral(
"2.0" ) ).toDouble() );
941 mapGrid->
setFramePenSize( gridElem.attribute( QStringLiteral(
"gridFramePenThickness" ), QStringLiteral(
"0.5" ) ).toDouble() );
946 QDomElement gridSymbolElem = gridElem.firstChildElement( QStringLiteral(
"symbol" ) );
948 if ( gridSymbolElem.isNull() )
952 lineSymbol->
setWidth( gridElem.attribute( QStringLiteral(
"penWidth" ), QStringLiteral(
"0" ) ).toDouble() );
953 lineSymbol->
setColor( QColor( gridElem.attribute( QStringLiteral(
"penColorRed" ), QStringLiteral(
"0" ) ).toInt(),
954 gridElem.attribute( QStringLiteral(
"penColorGreen" ), QStringLiteral(
"0" ) ).toInt(),
955 gridElem.attribute( QStringLiteral(
"penColorBlue" ), QStringLiteral(
"0" ) ).toInt() ) );
959 lineSymbol = QgsSymbolLayerUtils::loadSymbol<QgsLineSymbol>( gridSymbolElem, context );
964 QDomNodeList annotationNodeList = gridElem.elementsByTagName( QStringLiteral(
"Annotation" ) );
965 if ( !annotationNodeList.isEmpty() )
967 QDomElement annotationElem = annotationNodeList.at( 0 ).toElement();
968 mapGrid->
setAnnotationEnabled( annotationElem.attribute( QStringLiteral(
"show" ), QStringLiteral(
"0" ) ) != QLatin1String(
"0" ) );
978 mapGrid->
setAnnotationFrameDistance( annotationElem.attribute( QStringLiteral(
"frameDistance" ), QStringLiteral(
"0" ) ).toDouble() );
979 QFont annotationFont;
980 annotationFont.fromString( annotationElem.attribute( QStringLiteral(
"font" ), QString() ) );
984 mapGrid->
setAnnotationPrecision( annotationElem.attribute( QStringLiteral(
"precision" ), QStringLiteral(
"3" ) ).toInt() );
986 layoutItem->mGridStack->addGrid( mapGrid );
990 QDomNodeList atlasNodeList = itemElem.elementsByTagName( QStringLiteral(
"AtlasMap" ) );
991 if ( !atlasNodeList.isEmpty() )
993 QDomElement atlasElem = atlasNodeList.at( 0 ).toElement();
994 layoutItem->mAtlasDriven = ( atlasElem.attribute( QStringLiteral(
"atlasDriven" ), QStringLiteral(
"0" ) ) != QLatin1String(
"0" ) );
995 if ( atlasElem.hasAttribute( QStringLiteral(
"fixedScale" ) ) )
997 layoutItem->
setAtlasScalingMode( atlasElem.attribute( QStringLiteral(
"fixedScale" ), QStringLiteral(
"0" ) ) != QLatin1String(
"0" ) ? QgsLayoutItemMap::AtlasScalingMode::Fixed : QgsLayoutItemMap::AtlasScalingMode::Auto );
999 else if ( atlasElem.hasAttribute( QStringLiteral(
"scalingMode" ) ) )
1001 layoutItem->
setAtlasScalingMode( static_cast<QgsLayoutItemMap::AtlasScalingMode>( atlasElem.attribute( QStringLiteral(
"scalingMode" ) ).toInt() ) );
1003 layoutItem->
setAtlasMargin( atlasElem.attribute( QStringLiteral(
"margin" ), QStringLiteral(
"0.1" ) ).toDouble() );
1013 Q_UNUSED( project );
1014 restoreGeneralComposeItemProperties( layoutItem, itemElem );
1016 layoutItem->
setHeight( itemElem.attribute( QStringLiteral(
"height" ), QStringLiteral(
"5.0" ) ).toDouble() );
1017 layoutItem->
setHeight( itemElem.attribute( QStringLiteral(
"height" ), QStringLiteral(
"5.0" ) ).toDouble() );
1018 layoutItem->
setLabelBarSpace( itemElem.attribute( QStringLiteral(
"labelBarSpace" ), QStringLiteral(
"3.0" ) ).toDouble() );
1019 layoutItem->
setBoxContentSpace( itemElem.attribute( QStringLiteral(
"boxContentSpace" ), QStringLiteral(
"1.0" ) ).toDouble() );
1020 layoutItem->
setNumberOfSegments( itemElem.attribute( QStringLiteral(
"numSegments" ), QStringLiteral(
"2" ) ).toInt() );
1021 layoutItem->
setNumberOfSegmentsLeft( itemElem.attribute( QStringLiteral(
"numSegmentsLeft" ), QStringLiteral(
"0" ) ).toInt() );
1022 layoutItem->
setUnitsPerSegment( itemElem.attribute( QStringLiteral(
"numUnitsPerSegment" ), QStringLiteral(
"1.0" ) ).toDouble() );
1023 layoutItem->
setSegmentSizeMode( static_cast<QgsScaleBarSettings::SegmentSizeMode>( itemElem.attribute( QStringLiteral(
"segmentSizeMode" ), QStringLiteral(
"0" ) ).toInt() ) );
1024 layoutItem->
setMinimumBarWidth( itemElem.attribute( QStringLiteral(
"minBarWidth" ), QStringLiteral(
"50" ) ).toDouble() );
1025 layoutItem->
setMaximumBarWidth( itemElem.attribute( QStringLiteral(
"maxBarWidth" ), QStringLiteral(
"150" ) ).toDouble() );
1026 layoutItem->mSegmentMillimeters = itemElem.attribute( QStringLiteral(
"segmentMillimeters" ), QStringLiteral(
"0.0" ) ).toDouble();
1027 layoutItem->
setMapUnitsPerScaleBarUnit( itemElem.attribute( QStringLiteral(
"numMapUnitsPerScaleBarUnit" ), QStringLiteral(
"1.0" ) ).toDouble() );
1028 layoutItem->
setLineWidth( itemElem.attribute( QStringLiteral(
"outlineWidth" ), QStringLiteral(
"0.3" ) ).toDouble() );
1029 layoutItem->
setUnitLabel( itemElem.attribute( QStringLiteral(
"unitLabel" ) ) );
1035 f.fromString( itemElem.attribute( QStringLiteral(
"font" ), QString() ) );
1043 QDomNodeList fillColorList = itemElem.elementsByTagName( QStringLiteral(
"fillColor" ) );
1044 if ( !fillColorList.isEmpty() )
1046 QDomElement fillColorElem = fillColorList.at( 0 ).toElement();
1047 bool redOk, greenOk, blueOk, alphaOk;
1048 int fillRed, fillGreen, fillBlue, fillAlpha;
1050 fillRed = fillColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
1051 fillGreen = fillColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
1052 fillBlue = fillColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
1053 fillAlpha = fillColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
1055 if ( redOk && greenOk && blueOk && alphaOk )
1057 layoutItem->
setFillColor( QColor( fillRed, fillGreen, fillBlue, fillAlpha ) );
1062 layoutItem->
setFillColor( QColor( itemElem.attribute( QStringLiteral(
"brushColor" ), QStringLiteral(
"#000000" ) ) ) );
1066 QDomNodeList fillColor2List = itemElem.elementsByTagName( QStringLiteral(
"fillColor2" ) );
1067 if ( !fillColor2List.isEmpty() )
1069 QDomElement fillColor2Elem = fillColor2List.at( 0 ).toElement();
1070 bool redOk, greenOk, blueOk, alphaOk;
1071 int fillRed, fillGreen, fillBlue, fillAlpha;
1073 fillRed = fillColor2Elem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
1074 fillGreen = fillColor2Elem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
1075 fillBlue = fillColor2Elem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
1076 fillAlpha = fillColor2Elem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
1078 if ( redOk && greenOk && blueOk && alphaOk )
1080 layoutItem->
setFillColor2( QColor( fillRed, fillGreen, fillBlue, fillAlpha ) );
1085 layoutItem->
setFillColor2( QColor( itemElem.attribute( QStringLiteral(
"brush2Color" ), QStringLiteral(
"#ffffff" ) ) ) );
1089 QDomNodeList strokeColorList = itemElem.elementsByTagName( QStringLiteral(
"strokeColor" ) );
1090 if ( !strokeColorList.isEmpty() )
1092 QDomElement strokeColorElem = strokeColorList.at( 0 ).toElement();
1093 bool redOk, greenOk, blueOk, alphaOk;
1094 int strokeRed, strokeGreen, strokeBlue, strokeAlpha;
1096 strokeRed = strokeColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
1097 strokeGreen = strokeColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
1098 strokeBlue = strokeColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
1099 strokeAlpha = strokeColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
1101 if ( redOk && greenOk && blueOk && alphaOk )
1103 layoutItem->
setLineColor( QColor( strokeRed, strokeGreen, strokeBlue, strokeAlpha ) );
1104 QPen p = layoutItem->mSettings.
pen();
1105 p.setColor( layoutItem->mSettings.
lineColor() );
1106 layoutItem->setPen( p );
1111 layoutItem->
setLineColor( QColor( itemElem.attribute( QStringLiteral(
"penColor" ), QStringLiteral(
"#000000" ) ) ) );
1112 QPen p = layoutItem->mSettings.
pen();
1113 p.setColor( layoutItem->mSettings.
lineColor() );
1114 layoutItem->setPen( p );
1118 QDomNodeList textColorList = itemElem.elementsByTagName( QStringLiteral(
"textColor" ) );
1119 if ( !textColorList.isEmpty() )
1121 QDomElement textColorElem = textColorList.at( 0 ).toElement();
1122 bool redOk, greenOk, blueOk, alphaOk;
1123 int textRed, textGreen, textBlue, textAlpha;
1125 textRed = textColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
1126 textGreen = textColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
1127 textBlue = textColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
1128 textAlpha = textColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
1130 if ( redOk && greenOk && blueOk && alphaOk )
1133 layoutItem->
setFontColor( QColor( textRed, textGreen, textBlue, textAlpha ) );
1140 c.setNamedColor( itemElem.attribute( QStringLiteral(
"fontColor" ), QStringLiteral(
"#000000" ) ) );
1147 QString styleString = itemElem.attribute( QStringLiteral(
"style" ), QString() );
1148 layoutItem->
setStyle( QObject::tr( styleString.toLocal8Bit().data() ) );
1150 if ( itemElem.attribute( QStringLiteral(
"unitType" ) ).isEmpty() )
1153 switch ( itemElem.attribute( QStringLiteral(
"units" ) ).toInt() )
1174 layoutItem->
setAlignment( static_cast< QgsScaleBarSettings::Alignment >( itemElem.attribute( QStringLiteral(
"alignment" ), QStringLiteral(
"0" ) ).toInt() ) );
1177 QString mapId = itemElem.attribute( QStringLiteral(
"mapId" ), QStringLiteral(
"-1" ) );
1178 if ( mapId != QStringLiteral(
"-1" ) && mapId2Uuid.contains( mapId ) )
1192 restoreGeneralComposeItemProperties( layoutItem, itemElem );
1202 QString mapId = itemElem.attribute( QStringLiteral(
"map" ), QStringLiteral(
"-1" ) );
1203 if ( mapId != QStringLiteral(
"-1" ) && mapId2Uuid.contains( mapId ) )
1213 layoutItem->
setTitle( itemElem.attribute( QStringLiteral(
"title" ) ) );
1214 if ( !itemElem.attribute( QStringLiteral(
"titleAlignment" ) ).isEmpty() )
1216 layoutItem->
setTitleAlignment( static_cast< Qt::AlignmentFlag >( itemElem.attribute( QStringLiteral(
"titleAlignment" ) ).toInt() ) );
1218 int colCount = itemElem.attribute( QStringLiteral(
"columnCount" ), QStringLiteral(
"1" ) ).toInt();
1219 if ( colCount < 1 ) colCount = 1;
1221 layoutItem->
setSplitLayer( itemElem.attribute( QStringLiteral(
"splitLayer" ), QStringLiteral(
"0" ) ).toInt() == 1 );
1222 layoutItem->
setEqualColumnWidth( itemElem.attribute( QStringLiteral(
"equalColumnWidth" ), QStringLiteral(
"0" ) ).toInt() == 1 );
1224 QDomNodeList stylesNodeList = itemElem.elementsByTagName( QStringLiteral(
"styles" ) );
1225 if ( !stylesNodeList.isEmpty() )
1227 QDomNode stylesNode = stylesNodeList.at( 0 );
1228 for (
int i = 0; i < stylesNode.childNodes().size(); i++ )
1230 QDomElement styleElem = stylesNode.childNodes().at( i ).toElement();
1232 style.
readXml( styleElem, QDomDocument() );
1233 QString name = styleElem.attribute( QStringLiteral(
"name" ) );
1247 fontClr.setNamedColor( itemElem.attribute( QStringLiteral(
"fontColor" ), QStringLiteral(
"#000000" ) ) );
1251 layoutItem->
setBoxSpace( itemElem.attribute( QStringLiteral(
"boxSpace" ), QStringLiteral(
"2.0" ) ).toDouble() );
1252 layoutItem->
setColumnSpace( itemElem.attribute( QStringLiteral(
"columnSpace" ), QStringLiteral(
"2.0" ) ).toDouble() );
1254 layoutItem->
setSymbolWidth( itemElem.attribute( QStringLiteral(
"symbolWidth" ), QStringLiteral(
"7.0" ) ).toDouble() );
1255 layoutItem->
setSymbolHeight( itemElem.attribute( QStringLiteral(
"symbolHeight" ), QStringLiteral(
"14.0" ) ).toDouble() );
1256 layoutItem->
setWmsLegendWidth( itemElem.attribute( QStringLiteral(
"wmsLegendWidth" ), QStringLiteral(
"50" ) ).toDouble() );
1257 layoutItem->
setWmsLegendHeight( itemElem.attribute( QStringLiteral(
"wmsLegendHeight" ), QStringLiteral(
"25" ) ).toDouble() );
1258 layoutItem->
setLineSpacing( itemElem.attribute( QStringLiteral(
"lineSpacing" ), QStringLiteral(
"1.0" ) ).toDouble() );
1260 layoutItem->
setDrawRasterStroke( itemElem.attribute( QStringLiteral(
"rasterBorder" ), QStringLiteral(
"1" ) ) != QLatin1String(
"0" ) );
1262 layoutItem->
setRasterStrokeWidth( itemElem.attribute( QStringLiteral(
"rasterBorderWidth" ), QStringLiteral(
"0" ) ).toDouble() );
1264 layoutItem->
setWrapString( itemElem.attribute( QStringLiteral(
"wrapChar" ) ) );
1266 layoutItem->mSizeToContents = itemElem.attribute( QStringLiteral(
"resizeToContents" ), QStringLiteral(
"1" ) ) != QLatin1String(
"0" );
1267 layoutItem->mLegendFilterByMap = itemElem.attribute( QStringLiteral(
"legendFilterByMap" ), QStringLiteral(
"0" ) ).toInt();
1268 layoutItem->mFilterOutAtlas = itemElem.attribute( QStringLiteral(
"legendFilterByAtlas" ), QStringLiteral(
"0" ) ).toInt();
1271 QDomElement layerTreeElem = itemElem.firstChildElement( QStringLiteral(
"layer-tree" ) );
1272 if ( layerTreeElem.isNull() )
1273 layerTreeElem = itemElem.firstChildElement( QStringLiteral(
"layer-tree-group" ) );
1275 if ( !layerTreeElem.isNull() )
1280 layoutItem->setCustomLayerTree( tree );
1284 layoutItem->setCustomLayerTree(
nullptr );
1290 bool QgsCompositionConverter::readAtlasXml(
QgsLayoutAtlas *atlasItem,
const QDomElement &itemElem,
const QgsProject *project )
1292 atlasItem->
setEnabled( itemElem.attribute( QStringLiteral(
"enabled" ), QStringLiteral(
"false" ) ) == QLatin1String(
"true" ) );
1295 QString layerId = itemElem.attribute( QStringLiteral(
"coverageLayer" ) );
1296 QString layerName = itemElem.attribute( QStringLiteral(
"coverageLayerName" ) );
1297 QString layerSource = itemElem.attribute( QStringLiteral(
"coverageLayerSource" ) );
1298 QString layerProvider = itemElem.attribute( QStringLiteral(
"coverageLayerProvider" ) );
1303 atlasItem->
setPageNameExpression( itemElem.attribute( QStringLiteral(
"pageNameExpression" ), QString() ) );
1304 QString errorString;
1305 atlasItem->
setFilenameExpression( itemElem.attribute( QStringLiteral(
"filenamePattern" ), QString() ), errorString );
1307 atlasItem->
setSortFeatures( itemElem.attribute( QStringLiteral(
"sortFeatures" ), QStringLiteral(
"false" ) ) == QLatin1String(
"true" ) );
1310 atlasItem->
setSortExpression( itemElem.attribute( QStringLiteral(
"sortKey" ), QString() ) );
1311 atlasItem->
setSortAscending( itemElem.attribute( QStringLiteral(
"sortAscending" ), QStringLiteral(
"true" ) ) == QLatin1String(
"true" ) );
1313 atlasItem->
setFilterFeatures( itemElem.attribute( QStringLiteral(
"filterFeatures" ), QStringLiteral(
"false" ) ) == QLatin1String(
"true" ) );
1316 QString expErrorString;
1317 atlasItem->
setFilterExpression( itemElem.attribute( QStringLiteral(
"featureFilter" ), QString() ), expErrorString );
1321 atlasItem->
setHideCoverage( itemElem.attribute( QStringLiteral(
"hideCoverage" ), QStringLiteral(
"false" ) ) == QLatin1String(
"true" ) );
1327 bool QgsCompositionConverter::readHtmlXml(
QgsLayoutItemHtml *layoutItem,
const QDomElement &itemElem,
const QgsProject *project )
1329 Q_UNUSED( project );
1330 readOldComposerObjectXml( layoutItem, itemElem );
1333 layoutItem->
setResizeMode( static_cast< QgsLayoutMultiFrame::ResizeMode >( itemElem.attribute( QStringLiteral(
"resizeMode" ), QStringLiteral(
"0" ) ).toInt() ) );
1334 QDomNodeList frameList = itemElem.elementsByTagName( QStringLiteral(
"ComposerFrame" ) );
1335 for (
int i = 0; i < frameList.size(); ++i )
1337 QDomElement frameElem = frameList.at( i ).toElement();
1339 restoreGeneralComposeItemProperties( newFrame, frameElem );
1341 double x = itemElem.attribute( QStringLiteral(
"sectionX" ) ).toDouble();
1342 double y = itemElem.attribute( QStringLiteral(
"sectionY" ) ).toDouble();
1343 double width = itemElem.attribute( QStringLiteral(
"sectionWidth" ) ).toDouble();
1344 double height = itemElem.attribute( QStringLiteral(
"sectionHeight" ) ).toDouble();
1346 newFrame->
setHidePageIfEmpty( itemElem.attribute( QStringLiteral(
"hidePageIfEmpty" ), QStringLiteral(
"0" ) ).toInt() );
1347 newFrame->
setHideBackgroundIfEmpty( itemElem.attribute( QStringLiteral(
"hideBackgroundIfEmpty" ), QStringLiteral(
"0" ) ).toInt() );
1348 layoutItem->
addFrame( newFrame,
false );
1352 layoutItem->
setContentMode( static_cast< QgsLayoutItemHtml::ContentMode >( itemElem.attribute( QStringLiteral(
"contentMode" ) ).toInt( &contentModeOK ) ) );
1353 if ( !contentModeOK )
1355 layoutItem->
setContentMode( QgsLayoutItemHtml::ContentMode::Url );
1357 layoutItem->
setEvaluateExpressions( itemElem.attribute( QStringLiteral(
"evaluateExpressions" ), QStringLiteral(
"true" ) ) == QLatin1String(
"true" ) );
1358 layoutItem->
setUseSmartBreaks( itemElem.attribute( QStringLiteral(
"useSmartBreaks" ), QStringLiteral(
"true" ) ) == QLatin1String(
"true" ) );
1359 layoutItem->
setMaxBreakDistance( itemElem.attribute( QStringLiteral(
"maxBreakDistance" ), QStringLiteral(
"10" ) ).toDouble() );
1360 layoutItem->
setHtml( itemElem.attribute( QStringLiteral(
"html" ) ) );
1361 layoutItem->
setUserStylesheet( itemElem.attribute( QStringLiteral(
"stylesheet" ) ) );
1362 layoutItem->
setUserStylesheetEnabled( itemElem.attribute( QStringLiteral(
"stylesheetEnabled" ), QStringLiteral(
"false" ) ) == QLatin1String(
"true" ) );
1365 QString urlString = itemElem.attribute( QStringLiteral(
"url" ) );
1366 if ( !urlString.isEmpty() )
1368 layoutItem->
setUrl( urlString );
1378 Q_UNUSED( project );
1379 readOldComposerObjectXml( layoutItem, itemElem );
1382 layoutItem->
setResizeMode( static_cast< QgsLayoutMultiFrame::ResizeMode >( itemElem.attribute( QStringLiteral(
"resizeMode" ), QStringLiteral(
"0" ) ).toInt() ) );
1383 QDomNodeList frameList = itemElem.elementsByTagName( QStringLiteral(
"ComposerFrame" ) );
1384 for (
int i = 0; i < frameList.size(); ++i )
1386 QDomElement frameElem = frameList.at( i ).toElement();
1388 restoreGeneralComposeItemProperties( newFrame, frameElem );
1390 double x = itemElem.attribute( QStringLiteral(
"sectionX" ) ).toDouble();
1391 double y = itemElem.attribute( QStringLiteral(
"sectionY" ) ).toDouble();
1392 double width = itemElem.attribute( QStringLiteral(
"sectionWidth" ) ).toDouble();
1393 double height = itemElem.attribute( QStringLiteral(
"sectionHeight" ) ).toDouble();
1395 newFrame->
setHidePageIfEmpty( itemElem.attribute( QStringLiteral(
"hidePageIfEmpty" ), QStringLiteral(
"0" ) ).toInt() );
1396 newFrame->
setHideBackgroundIfEmpty( itemElem.attribute( QStringLiteral(
"hideBackgroundIfEmpty" ), QStringLiteral(
"0" ) ).toInt() );
1397 layoutItem->
addFrame( newFrame,
false );
1400 layoutItem->
setEmptyTableBehavior( static_cast<QgsLayoutTable::EmptyTableMode>( itemElem.attribute( QStringLiteral(
"emptyTableMode" ), QStringLiteral(
"0" ) ).toInt() ) );
1401 layoutItem->
setEmptyTableMessage( itemElem.attribute( QStringLiteral(
"emptyTableMessage" ), QObject::tr(
"No matching records" ) ) );
1402 layoutItem->
setShowEmptyRows( itemElem.attribute( QStringLiteral(
"showEmptyRows" ), QStringLiteral(
"0" ) ).toInt() );
1405 layoutItem->
mHeaderFont.fromString( itemElem.attribute( QStringLiteral(
"headerFont" ), QString() ) );
1408 layoutItem->
setHeaderHAlignment( static_cast<QgsLayoutTable::HeaderHAlignment>( itemElem.attribute( QStringLiteral(
"headerHAlignment" ), QStringLiteral(
"0" ) ).toInt() ) ) ;
1409 layoutItem->
setHeaderMode( static_cast<QgsLayoutTable::HeaderMode>( itemElem.attribute( QStringLiteral(
"headerMode" ), QStringLiteral(
"0" ) ).toInt() ) );
1412 layoutItem->
mContentFont.fromString( itemElem.attribute( QStringLiteral(
"contentFont" ), QString() ) );
1415 layoutItem->
setCellMargin( itemElem.attribute( QStringLiteral(
"cellMargin" ), QStringLiteral(
"1.0" ) ).toDouble() );
1416 layoutItem->
setGridStrokeWidth( itemElem.attribute( QStringLiteral(
"gridStrokeWidth" ), QStringLiteral(
"0.5" ) ).toDouble() );
1417 layoutItem->
setHorizontalGrid( itemElem.attribute( QStringLiteral(
"horizontalGrid" ), QStringLiteral(
"1" ) ).toInt() );
1418 layoutItem->
setVerticalGrid( itemElem.attribute( QStringLiteral(
"verticalGrid" ), QStringLiteral(
"1" ) ).toInt() );
1419 layoutItem->
setShowGrid( itemElem.attribute( QStringLiteral(
"showGrid" ), QStringLiteral(
"1" ) ).toInt() );
1422 layoutItem->
setWrapBehavior( static_cast<QgsLayoutTable::WrapBehavior>( itemElem.attribute( QStringLiteral(
"wrapBehavior" ), QStringLiteral(
"0" ) ).toInt() ) );
1426 QDomNodeList columnsList = itemElem.elementsByTagName( QStringLiteral(
"displayColumns" ) );
1427 if ( !columnsList.isEmpty() )
1429 QDomElement columnsElem = columnsList.at( 0 ).toElement();
1430 QDomNodeList columnEntryList = columnsElem.elementsByTagName( QStringLiteral(
"column" ) );
1431 for (
int i = 0; i < columnEntryList.size(); ++i )
1433 QDomElement columnElem = columnEntryList.at( i ).toElement();
1435 column->mHAlignment =
static_cast< Qt::AlignmentFlag
>( columnElem.attribute( QStringLiteral(
"hAlignment" ), QString::number( Qt::AlignLeft ) ).toInt() );
1436 column->mVAlignment =
static_cast< Qt::AlignmentFlag
>( columnElem.attribute( QStringLiteral(
"vAlignment" ), QString::number( Qt::AlignVCenter ) ).toInt() );
1437 column->mHeading = columnElem.attribute( QStringLiteral(
"heading" ), QString() );
1438 column->mAttribute = columnElem.attribute( QStringLiteral(
"attribute" ), QString() );
1439 column->mSortByRank = columnElem.attribute( QStringLiteral(
"sortByRank" ), QStringLiteral(
"0" ) ).toInt();
1440 column->mSortOrder =
static_cast< Qt::SortOrder
>( columnElem.attribute( QStringLiteral(
"sortOrder" ), QString::number( Qt::AscendingOrder ) ).toInt() );
1441 column->mWidth = columnElem.attribute( QStringLiteral(
"width" ), QStringLiteral(
"0.0" ) ).toDouble();
1443 QDomNodeList bgColorList = columnElem.elementsByTagName( QStringLiteral(
"backgroundColor" ) );
1444 if ( !bgColorList.isEmpty() )
1446 QDomElement bgColorElem = bgColorList.at( 0 ).toElement();
1447 bool redOk, greenOk, blueOk, alphaOk;
1448 int bgRed, bgGreen, bgBlue, bgAlpha;
1449 bgRed = bgColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
1450 bgGreen = bgColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
1451 bgBlue = bgColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
1452 bgAlpha = bgColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
1453 if ( redOk && greenOk && blueOk && alphaOk )
1455 column->mBackgroundColor = QColor( bgRed, bgGreen, bgBlue, bgAlpha );
1458 layoutItem->
mColumns.append( column );
1463 QDomNodeList stylesList = itemElem.elementsByTagName( QStringLiteral(
"cellStyles" ) );
1464 if ( !stylesList.isEmpty() )
1466 QDomElement stylesElem = stylesList.at( 0 ).toElement();
1468 QMap< QgsLayoutTable::CellStyleGroup, QString >::const_iterator it = layoutItem->mCellStyleNames.constBegin();
1469 for ( ; it != layoutItem->mCellStyleNames.constEnd(); ++it )
1471 QString styleName = it.value();
1472 QDomNodeList styleList = stylesElem.elementsByTagName( styleName );
1473 if ( !styleList.isEmpty() )
1475 QDomElement styleElem = styleList.at( 0 ).toElement();
1484 QString layerId = itemElem.attribute( QStringLiteral(
"vectorLayer" ) );
1485 QString layerName = itemElem.attribute( QStringLiteral(
"vectorLayerName" ) );
1486 QString layerSource = itemElem.attribute( QStringLiteral(
"vectorLayerSource" ) );
1487 QString layerProvider = itemElem.attribute( QStringLiteral(
"vectorLayerProvider" ) );
1496 template <
class T,
class T2>
1497 bool QgsCompositionConverter::readPolyXml( T *layoutItem,
const QDomElement &itemElem,
const QgsProject *project )
1499 restoreGeneralComposeItemProperties( layoutItem, itemElem );
1500 QDomNodeList nodeList = itemElem.elementsByTagName( QStringLiteral(
"node" ) );
1501 if ( !nodeList.isEmpty() )
1504 for (
int i = 0; i < nodeList.length(); i++ )
1506 QDomElement node = nodeList.at( i ).toElement();
1507 polygon.append( QPointF( node.attribute( QStringLiteral(
"x" ) ).toDouble( ), node.attribute( QStringLiteral(
"y" ) ).toDouble() ) );
1509 layoutItem->setNodes( polygon );
1511 if ( itemElem.elementsByTagName( QStringLiteral(
"symbol" ) ).size() )
1513 QDomElement symbolElement = itemElem.elementsByTagName( QStringLiteral(
"symbol" ) ).at( 0 ).toElement();
1517 T2 *styleSymbol = QgsSymbolLayerUtils::loadSymbol<T2>( symbolElement, context );
1519 layoutItem->setSymbol( styleSymbol );
1522 layoutItem->setFrameEnabled(
false );
1523 layoutItem->setBackgroundEnabled(
false );
1528 bool QgsCompositionConverter::readXml(
QgsLayoutItem *layoutItem,
const QDomElement &itemElem )
1530 if ( itemElem.isNull() )
1535 readOldComposerObjectXml( layoutItem, itemElem );
1538 layoutItem->mUuid = itemElem.attribute( QStringLiteral(
"uuid" ), QUuid::createUuid().toString() );
1541 layoutItem->mTemplateUuid = itemElem.attribute( QStringLiteral(
"templateUuid" ) );
1544 QString
id = itemElem.attribute( QStringLiteral(
"id" ), QString() );
1545 layoutItem->
setId(
id );
1548 QString frame = itemElem.attribute( QStringLiteral(
"frame" ) );
1549 layoutItem->
setFrameEnabled( frame.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 ) ;
1552 QString background = itemElem.attribute( QStringLiteral(
"background" ) );
1553 layoutItem->
setBackgroundEnabled( background.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 );
1556 QString positionLock = itemElem.attribute( QStringLiteral(
"positionLock" ) );
1557 layoutItem->
setLocked( positionLock.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 );
1560 layoutItem->
setVisibility( itemElem.attribute( QStringLiteral(
"visibility" ), QStringLiteral(
"1" ) ) != QStringLiteral(
"0" ) );
1562 layoutItem->mParentGroupUuid = itemElem.attribute( QStringLiteral(
"groupUuid" ) );
1563 if ( !layoutItem->mParentGroupUuid.isEmpty() )
1567 group->addItem( layoutItem );
1570 layoutItem->mTemplateUuid = itemElem.attribute( QStringLiteral(
"templateUuid" ) );
1573 QRectF position = itemPosition( layoutItem, itemElem );
1578 layoutItem->setZValue( itemElem.attribute( QStringLiteral(
"zValue" ) ).toDouble() );
1581 QDomNodeList frameColorList = itemElem.elementsByTagName( QStringLiteral(
"FrameColor" ) );
1582 if ( !frameColorList.isEmpty() )
1584 QDomElement frameColorElem = frameColorList.at( 0 ).toElement();
1585 bool redOk, greenOk, blueOk, alphaOk, widthOk;
1586 int penRed, penGreen, penBlue, penAlpha;
1589 penWidth = itemElem.attribute( QStringLiteral(
"outlineWidth" ) ).toDouble( &widthOk );
1590 penRed = frameColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
1591 penGreen = frameColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
1592 penBlue = frameColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
1593 penAlpha = frameColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
1596 if ( redOk && greenOk && blueOk && alphaOk && widthOk )
1603 layoutItem->setPen( framePen );
1610 QDomNodeList bgColorList = itemElem.elementsByTagName( QStringLiteral(
"BackgroundColor" ) );
1611 if ( !bgColorList.isEmpty() )
1613 QDomElement bgColorElem = bgColorList.at( 0 ).toElement();
1614 bool redOk, greenOk, blueOk, alphaOk;
1615 int bgRed, bgGreen, bgBlue, bgAlpha;
1616 bgRed = bgColorElem.attribute( QStringLiteral(
"red" ) ).toDouble( &redOk );
1617 bgGreen = bgColorElem.attribute( QStringLiteral(
"green" ) ).toDouble( &greenOk );
1618 bgBlue = bgColorElem.attribute( QStringLiteral(
"blue" ) ).toDouble( &blueOk );
1619 bgAlpha = bgColorElem.attribute( QStringLiteral(
"alpha" ) ).toDouble( &alphaOk );
1620 if ( redOk && greenOk && blueOk && alphaOk )
1622 layoutItem->mBackgroundColor = QColor( bgRed, bgGreen, bgBlue, bgAlpha );
1623 layoutItem->setBrush( QBrush( layoutItem->mBackgroundColor, Qt::SolidPattern ) );
1633 if ( itemElem.hasAttribute( QStringLiteral(
"opacity" ) ) )
1635 layoutItem->
setItemOpacity( itemElem.attribute( QStringLiteral(
"opacity" ), QStringLiteral(
"1" ) ).toDouble() );
1639 layoutItem->
setItemOpacity( 1.0 - itemElem.attribute( QStringLiteral(
"transparency" ), QStringLiteral(
"0" ) ).toInt() / 100.0 );
1642 layoutItem->mExcludeFromExports = itemElem.attribute( QStringLiteral(
"excludeFromExports" ), QStringLiteral(
"0" ) ).toInt();
1643 layoutItem->mEvaluatedExcludeFromExports = layoutItem->mExcludeFromExports;
1648 layoutItem->
setItemRotation( itemElem.attribute( QStringLiteral(
"itemRotation" ), QStringLiteral(
"0" ) ).toDouble(), false );
1650 layoutItem->mBlockUndoCommands =
false;
1657 bool QgsCompositionConverter::readOldComposerObjectXml(
QgsLayoutObject *layoutItem,
1658 const QDomElement &itemElem )
1660 if ( itemElem.isNull() )
1668 QDomNode propsNode = itemElem.namedItem( QStringLiteral(
"dataDefinedProperties" ) );
1669 if ( !propsNode.isNull() )
1677 exp = QStringLiteral(
"100.0 - (%1)" ).arg( exp );
1689 void QgsCompositionConverter::readOldDataDefinedPropertyMap(
const QDomElement &itemElem,
QgsPropertyCollection &dataDefinedProperties )
1692 QgsPropertiesDefinition::const_iterator i = defs.constBegin();
1693 for ( ; i != defs.constEnd(); ++i )
1695 QString elemName = i.value().name();
1696 QDomNodeList ddNodeList = itemElem.elementsByTagName( elemName );
1697 if ( !ddNodeList.isEmpty() )
1699 QDomElement ddElem = ddNodeList.at( 0 ).toElement();
1700 QgsProperty prop = readOldDataDefinedProperty( static_cast< QgsCompositionConverter::DataDefinedProperty >( i.key() ), ddElem );
1702 dataDefinedProperties.
setProperty( i.key(), prop );
1715 QString active = ddElem.attribute( QStringLiteral(
"active" ) );
1716 bool isActive =
false;
1717 if ( active.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
1721 QString field = ddElem.attribute( QStringLiteral(
"field" ) );
1722 QString expr = ddElem.attribute( QStringLiteral(
"expr" ) );
1724 QString useExpr = ddElem.attribute( QStringLiteral(
"useExpr" ) );
1725 bool isExpression =
false;
1726 if ( useExpr.compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0 )
1728 isExpression =
true;
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
void setCoverageLayer(QgsVectorLayer *layer)
Sets the coverage layer to use for the atlas features.
void setColumnSpace(double spacing)
Sets the legend column spacing.
void setShapeType(QgsLayoutItemShape::Shape type)
Sets the type of shape (e.g.
void setFramePenSize(const double width)
Sets the width of the stroke drawn in the grid frame.
The class is used as a container of context for various read/write operations on other objects...
void setEqualColumnWidth(bool equalize)
Sets whether column widths should be equalized.
void setFontColor(const QColor &color)
Sets the legend font color.
void setIntervalY(double interval)
Sets the interval between grid lines in the y-direction.
void setFollowVisibilityPresetName(const QString &name)
Sets preset name for map rendering.
A rectangle specified with double values.
void setLineWidth(double width)
Sets the line width in millimeters for lines in the scalebar.
void setWrapBehavior(WrapBehavior behavior)
Sets the wrap behavior for the table, which controls how text within cells is automatically wrapped...
void setTitle(const QString &title)
Sets the legend title.
void setOffsetX(double offset)
Sets the offset for grid lines in the x-direction.
void setPathResolver(const QgsPathResolver &resolver)
Sets up path resolver for conversion between relative and absolute paths.
Positive integer values (including 0)
QMap< CellStyleGroup, QgsLayoutTableStyle * > mCellStyles
void setSplitLayer(bool enabled)
Sets whether the legend items from a single layer can be split over multiple columns.
void setLineJoinStyle(Qt::PenJoinStyle style)
Sets the join style used when drawing the lines in the scalebar.
void setAnnotationFontColor(const QColor &color)
Sets the font color used for drawing grid annotations.
bool filterFeatures() const
Returns true if features should be filtered in the coverage layer.
void setFrameFillColor1(const QColor &color)
Sets the first fill color used for the grid frame.
Base class for graphical items within a QgsLayout.
void setSymbolWidth(double width)
Sets the legend symbol width.
An individual overview which is drawn above the map content in a QgsLayoutItemMap, and shows the extent of another QgsLayoutItemMap.
void setVAlign(Qt::AlignmentFlag alignment)
Sets for the vertical alignment of the label.
void setUserStylesheet(const QString &stylesheet)
Sets the user stylesheet CSS rules to use while rendering the HTML content.
void refreshBackgroundColor(bool updateItem=true)
Refresh item's background color, considering data defined colors.
void readXml(const QDomNode &parentNode, const QString &keyStartsWith=QString())
Read store contents from XML.
void setUserStylesheetEnabled(bool enabled)
Sets whether user stylesheets are enabled for the HTML content.
void setProjectTranslator(QgsProjectTranslator *projectTranslator)
Sets the project translator.
void setCellMargin(double margin)
Sets the margin distance in mm between cell borders and their contents.
A layout item subclass for text labels.
Preset paper size for composition.
virtual bool readXml(const QDomElement &collectionElem, const QgsPropertiesDefinition &definitions)
Reads property collection state from an XML element.
void readXml(const QDomElement &styleElement)
Read style configuration (for project file reading)
Q_DECL_DEPRECATED void setFontColor(const QColor &color)
Sets the color used for drawing text in the scalebar.
static QgsLineSymbol * createSimple(const QgsStringMap &properties)
Create a line symbol with one symbol layer: SimpleLine with specified properties. ...
void setExtent(const QgsRectangle &extent)
Sets a new extent for the map.
QgsObjectCustomProperties mCustomProperties
Custom properties for object.
static QgsFillSymbol * createSimple(const QgsStringMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties. ...
void setLinkedMap(QgsLayoutItemMap *map)
Sets the map item linked to the scalebar.
void setSortAscending(bool ascending)
Sets whether features should be sorted in an ascending order.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
void setBoxContentSpace(double space)
Sets the space (margin) between the scalebar box and content in millimeters.
void setHeaderFontColor(const QColor &color)
Sets the color used to draw header text in the table.
void setLineCapStyle(Qt::PenCapStyle style)
Sets the cap style used when drawing the lines in the scalebar.
double length() const
Returns the length of the measurement.
A container for grouping several QgsLayoutItems.
Styling option for a composer table cell.
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
TYPE * resolveWeakly(const QgsProject *project)
Resolves the map layer by attempting to find a matching layer in a project using a weak match...
Non-zero positive integer values.
#define Q_NOWARN_DEPRECATED_PUSH
void setEmptyTableMessage(const QString &message)
Sets the message for empty tables with no content rows.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
void setHtml(const QString &html)
Sets the html to display in the item when the item is using the QgsLayoutItemHtml::ManualHtml mode...
A layout item subclass that displays SVG files or raster format images (jpg, png, ...
static QgsProperty fromExpression(const QString &expression, bool isActive=true)
Returns a new ExpressionBasedProperty created from the specified expression.
static std::unique_ptr< QgsPrintLayout > createLayoutFromCompositionXml(const QDomElement &composerElement, QgsProject *project)
createLayoutFromCompositionXml is a factory that creates layout instances from a QGIS 2...
static QDomDocument convertCompositionTemplate(const QDomDocument &document, QgsProject *project)
Convert a composition template document to a layout template.
void setHeight(double height)
Sets the scalebar height (in millimeters).
void setAnnotationPosition(AnnotationPosition position, BorderSide side)
Sets the position for the grid annotations on a specified side of the map frame.
Composer legend components style.
void loadHtml(bool useCache=false, const QgsExpressionContext *context=nullptr)
Reloads the html source from the url and redraws the item.
void setFilterFeatures(bool filtered)
Sets whether features should be filtered in the coverage layer.
virtual void setFrameStrokeWidth(QgsLayoutMeasurement width)
Sets the frame stroke width.
void setVerticalGrid(bool verticalGrid)
Sets whether the grid's vertical lines should be drawn in the table.
static QPainter::CompositionMode getCompositionMode(QgsPainting::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a BlendMode.
void setBlendMode(const QPainter::CompositionMode mode)
Sets the blending mode used for drawing the grid.
Color with alpha channel.
void setStyle(QgsLegendStyle::Style component, const QgsLegendStyle &style)
Sets the style of component to style for the legend.
void setAlignment(QgsScaleBarSettings::Alignment alignment)
Sets the scalebar alignment.
void attemptMoveBy(double deltaX, double deltaY)
Attempts to shift the item's position by a specified deltaX and deltaY, in layout units...
QList< QgsLayoutItemPage * > pages()
Returns a list of pages in the collection.
void setKeepLayerSet(bool enabled)
Sets whether the stored layer set should be used or the current layer set of the associated project...
void setFrameStrokeColor(const QColor &color)
Sets the frame stroke color.
Layout item for node based polygon shapes.
void setMarginX(double margin)
Sets the horizontal margin between the edge of the frame and the label contents, in layout units...
static Q_INVOKABLE QgsUnitTypes::DistanceUnit decodeDistanceUnit(const QString &string, bool *ok=nullptr)
Decodes a distance unit from a string.
void setPictureAnchor(QgsLayoutItem::ReferencePoint anchor)
Sets the picture's anchor point, which controls how it is placed within the picture item's frame...
Positive double value (including 0)
void resolveReferences(const QgsProject *project, bool looseMatching=false) override
Calls resolveReferences() on child tree nodes.
void setLineColor(const QColor &color)
Sets the color used for lines in the scalebar.
void setSegmentSizeMode(QgsScaleBarSettings::SegmentSizeMode mode)
Sets the size mode for scale bar segments.
double height() const
Returns the height of the size.
QMap< QString, QString > QgsStringMap
void setStyle(const QString &name)
Sets the scale bar style by name.
Rotation (value between 0-360 degrees)
static Qt::PenJoinStyle decodePenJoinStyle(const QString &str)
void setSortExpression(const QString &expression)
Sets the expression (or field name) to use for sorting features.
A line symbol type, for rendering LineString and MultiLineString geometries.
Stores properties of a column for a QgsLayoutTable.
bool isActive(int key) const override
Returns true if the collection contains an active property with the specified key.
void setFrameWidth(const double width)
Sets the grid frame width (in layout units).
QgsLayoutSize sizeWithUnits() const
Returns the item's current size, including units.
void setContentSection(const QRectF §ion)
Sets the visible part of the multiframe's content which is visible within this frame (relative to the...
void setDrawRasterStroke(bool enabled)
Sets whether a stroke will be drawn around raster symbol items.
static QString encodeColor(const QColor &color)
QgsLayoutItem * itemByUuid(const QString &uuid, bool includeTemplateUuids=false) const
Returns the layout item with matching uuid unique identifier, or a nullptr if a matching item could n...
This class provides a method of storing points, consisting of an x and y coordinate, for use in QGIS layouts.
void setAnnotationFont(const QFont &font)
Sets the font used for drawing grid annotations.
ReferencePoint
Fixed position reference point.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
Exclude item from exports.
void setFillColor(const QColor &color)
Sets the color used for fills in the scalebar.
bool setFilenameExpression(const QString &expression, QString &errorString)
Sets the filename expression used for generating output filenames for each atlas page.
void setHeaderMode(HeaderMode mode)
Sets the display mode for headers in the table.
Stores style information (renderer, opacity, labeling, diagrams etc.) applicable to a map layer...
void setMaximumBarWidth(double maxWidth)
Sets the maximum width (in millimeters) for scale bar segments.
void setEvaluateExpressions(bool evaluateExpressions)
Sets whether the html item will evaluate QGIS expressions prior to rendering the HTML content...
QgsLayoutMeasurement frameStrokeWidth() const
Returns the frame's stroke width.
Layout graphical items for displaying a map.
Layout item for node based polyline shapes.
virtual void setId(const QString &id)
Set the item's id name.
QString layerId
Original layer ID.
QgsPropertyCollection mDataDefinedProperties
void setNumberOfSegments(int segments)
Sets the number of segments included in the scalebar.
void setHAlign(Qt::AlignmentFlag alignment)
Sets the horizontal alignment of the label.
void setLocked(bool locked)
Sets whether the item is locked, preventing mouse interactions with the item.
Namespace with helper functions for layer tree operations.
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
static bool isCompositionTemplate(const QDomDocument &document)
Check if the given document is a composition template.
void setHorizontalGrid(bool horizontalGrid)
Sets whether the grid's horizontal lines should be drawn in the table.
void setFrameJoinStyle(Qt::PenJoinStyle style)
Sets the join style used when drawing the item's frame.
void setMapUnitsPerScaleBarUnit(double units)
Sets the number of map units per scale bar unit used by the scalebar.
bool sortFeatures() const
Returns true if features should be sorted in the atlas.
QgsPathResolver pathResolver() const
Returns path resolver object with considering whether the project uses absolute or relative paths and...
void setUseSmartBreaks(bool useSmartBreaks)
Sets whether the html item should use smart breaks.
void setFrameFillColor2(const QColor &color)
Sets the second fill color used for the grid frame.
void setWidth(double width)
Sets the width for the whole line symbol.
QgsLayoutPageCollection * pageCollection()
Returns a pointer to the layout's page collection, which stores and manages page items in the layout...
void setBlendMode(QPainter::CompositionMode mode)
Sets the item's composition blending mode.
void setHeaderHAlignment(HeaderHAlignment alignment)
Sets the horizontal alignment for table headers.
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect in layout coordinates...
void setResizeMode(ResizeMode mode)
Sets the resize mode for the multiframe, and recalculates frame sizes to match.
Layout item for basic filled shapes (e.g.
void setFramePenColor(const QColor &color)
Sets the color of the stroke drawn in the grid frame.
Class used to render QgsLayout as an atlas, by iterating over the features from an associated vector ...
void setMinimumBarWidth(double minWidth)
Sets the minimum width (in millimeters) for scale bar segments.
void setMode(Mode mode)
Sets the label's current mode, allowing the label to switch between font based and HTML based renderi...
void setRasterStrokeColor(const QColor &color)
Sets the stroke color for the stroke drawn around raster symbol items.
virtual void setItemRotation(double rotation, bool adjustPosition=true)
Sets the layout item's rotation, in degrees clockwise.
Qt::PenJoinStyle frameJoinStyle() const
Returns the join style used for drawing the item's frame.
void setAnnotationEnabled(const bool enabled)
Sets whether annotations should be shown for the grid.
void setLinkedMap(QgsLayoutItemMap *map)
Sets the map object for rotation.
Scalebar secondary fill color.
bool hasBackground() const
Returns true if the item has a background.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
void setMarginY(double margin)
Sets the vertical margin between the edge of the frame and the label contents, in layout units...
Reads and writes project states.
void setFrameStyle(const FrameStyle style)
Sets the grid frame style.
A layout table subclass that displays attributes from a vector layer.
virtual QString uuid() const
Returns the item identification string.
Item transparency (deprecated)
void setHideBackgroundIfEmpty(bool hideBackgroundIfEmpty)
Sets whether the background and frame stroke should be hidden if this frame is empty.
static bool setFromXmlChildNode(QFont &font, const QDomElement &element, const QString &childNode)
Sets the properties of a font to match the properties stored in an XML child node.
void setContentFontColor(const QColor &color)
Sets the color used to draw text in table body cells.
void setCrs(const QgsCoordinateReferenceSystem &crs)
Sets the map's preset crs (coordinate reference system).
void setHideCoverage(bool hide)
Sets whether the coverage layer should be hidden in map items in the layouts.
static Qt::PenCapStyle decodePenCapStyle(const QString &str)
void setLineSpacing(double spacing)
Sets the spacing in-between multiple lines.
QFont mHeaderFont
Header font.
void setPicturePath(const QString &path)
Sets the source path of the image (may be svg or a raster format).
void setUnitLabel(const QString &label)
Sets the label for units.
AnnotationFormat
Format for displaying grid annotations.
A store for object properties.
void setFillColor2(const QColor &color)
Sets the secondary color used for fills in the scalebar.
void setAtlasScalingMode(AtlasScalingMode mode)
Sets the current atlas scaling mode.
void setStyle(GridStyle style)
Sets the grid style, which controls how the grid is drawn over the map's contents.
Double value (including negative values)
void setGridStrokeWidth(double width)
Sets the width in mm for grid lines in the table.
void setAnnotationDirection(AnnotationDirection direction, BorderSide side)
Sets the direction for drawing frame annotations for the specified map side.
void setWrapString(const QString &string)
Sets the legend text wrapping string.
virtual void setVisibility(bool visible)
Sets whether the item is visible.
void setContentMode(ContentMode mode)
Sets the source mode for item's HTML content.
void setVectorLayer(QgsVectorLayer *layer)
Sets the vector layer from which to display feature attributes.
An individual grid which is drawn above the map content in a QgsLayoutItemMap.
AnnotationDirection
Direction of grid annotations.
Definition for a property.
QFont mContentFont
Table contents font.
void setLineSymbol(QgsLineSymbol *symbol)
Sets the line symbol used for drawing grid lines.
QString xmlData() const
Returns XML content of the style.
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
void setColumnCount(int count)
Sets the legend column count.
AnnotationPosition
Position for grid annotations.
void setUrl(const QUrl &url)
Sets the url for content to display in the item when the item is using the QgsLayoutItemHtml::Url mod...
void setBackgroundEnabled(bool drawBackground)
Sets whether this item has a background drawn under it or not.
Q_DECL_DEPRECATED void setFont(const QFont &font)
Sets the font used for drawing text in the scalebar.
DistanceUnit
Units of distance.
Number of pages in composition.
void setAtlasMargin(double margin)
Sets the margin size (percentage) used when the map is in atlas mode.
void setFontColor(const QColor &color)
Sets the label font color.
bool setFilterExpression(const QString &expression, QString &errorString)
Sets the expression used for filtering features in the coverage layer.
void readXml(const QDomElement &elem, const QDomDocument &doc)
void setFollowVisibilityPreset(bool follow)
Sets whether the map should follow a map theme.
#define Q_NOWARN_DEPRECATED_POP
void setAnnotationPrecision(const int precision)
Sets the coordinate precision for grid annotations.
MarkerMode
The MarkerMode enum is the old QGIS 2.x arrow marker mode.
QgsLayoutTableColumns mColumns
Columns to show in table.
static QList< QgsLayoutObject * > addItemsFromCompositionXml(QgsPrintLayout *layout, const QDomElement &parentElement, QPointF *position=nullptr, bool pasteInPlace=false)
addItemsFromCompositionXml parse a QGIS 2.x composition XML in the parentElement, converts the 2...
void setMapRotation(double rotation)
Sets the rotation for the map - this does not affect the layout item shape, only the way the map is d...
void setLinkedMap(QgsLayoutItemMap *map)
Sets the map to associate with the legend.
bool readXml(const QDomElement &styleElem)
Reads the style's properties from XML.
void setSymbol(QgsFillSymbol *symbol)
Sets the fill symbol used to draw the shape.
NorthMode
Method for syncing rotation to a map's North direction.
Dummy property with no effect on item.
void setDrawAnnotations(bool draw)
Sets whether annotations are drawn within the map.
void setCrossLength(const double length)
Sets the length (in layout units) of the cross segments drawn for the grid.
Property requires a string value.
void setAnnotationFormat(const AnnotationFormat format)
Sets the format for drawing grid annotations.
void setUnits(QgsUnitTypes::DistanceUnit units)
Sets the distance units used by the scalebar.
DataDefinedProperty
Composition data defined properties for different item types.
void setFont(const QFont &font)
Sets the label's current font.
static QgsLayerTree * readXml(QDomElement &element, const QgsReadWriteContext &context)
Load the layer tree from an XML element.
void updateBoundingRect()
Updates the bounding rect of this item. Call this function before doing any changes related to annota...
void setEnabled(bool enabled)
Sets whether the atlas is enabled.
virtual void attemptMove(const QgsLayoutPoint &point, bool useReferencePoint=true, bool includesFrame=false, int page=-1)
Attempts to move the item to a specified point.
QPen pen() const
Returns the pen used for drawing outlines in the scalebar.
ResizeMode
Controls how pictures are scaled within the item's frame.
void setReferencePoint(ReferencePoint point)
Sets the reference point for positioning of the layout item.
QString asExpression() const
Returns an expression string representing the state of the property, or an empty string if the proper...
This class represents a coordinate reference system (CRS).
void addLayoutItem(QgsLayoutItem *item)
Adds an item to the layout.
void refreshFrame(bool updateItem=true)
Refresh item's frame, considering data defined colors and frame size.
static QgsLayoutItemPage * create(QgsLayout *layout)
Returns a new page item for the specified layout.
virtual void setFrameEnabled(bool drawFrame)
Sets whether this item has a frame drawn around it or not.
void setMaxBreakDistance(double distance)
Sets the maximum distance allowed when calculating where to place page breaks in the html...
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
void setRasterStrokeWidth(double width)
Sets the stroke width for the stroke drawn around raster symbol items.
A layout item subclass for scale bars.
A base class for objects which belong to a layout.
void setNumberOfSegmentsLeft(int segments)
Sets the number of segments included in the left part of the scalebar.
void setBackgroundColor(const QColor &color)
Sets the color used for background of table.
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
void setWmsLegendHeight(double height)
Sets the WMS legend height.
QgsLayoutItemGroup * parentGroup() const
Returns the item's parent group, if the item is part of a QgsLayoutItemGroup group.
void setWmsLegendWidth(double width)
Sets the WMS legend width.
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
void setAnnotationFrameDistance(const double distance)
Sets the distance between the map frame and annotations.
void setOffsetY(double offset)
Sets the offset for grid lines in the y-direction.
void setIntervalX(double interval)
Sets the interval between grid lines in the x-direction.
void setPageSize(const QgsLayoutSize &size)
Sets the size of the page.
GridStyle
Grid drawing style.
const QgsLayout * layout() const
Returns the layout the object is attached to.
static QString svgSymbolNameToPath(const QString &name, const QgsPathResolver &pathResolver)
Determines an SVG symbol's path from its name.
Print layout, a QgsLayout subclass for static or atlas-based layouts.
double spaceBetweenPages() const
Returns the space between pages, in layout units.
A layout item subclass for map legends.
virtual void addFrame(QgsLayoutFrame *frame, bool recalcFrameSizes=true)
Adds a frame to the multiframe.
void setSortFeatures(bool enabled)
Sets whether features should be sorted in the atlas.
Page number for item placement.
void setSymbolHeight(double height)
Sets the legend symbol height.
Resolves relative paths into absolute paths and vice versa.
QColor lineColor() const
Returns the color used for lines in the scalebar.
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
void setEmptyTableBehavior(EmptyTableMode mode)
Sets the behavior mode for empty tables with no content rows.
void setBoxSpace(double space)
Sets the legend box space.
void setShowGrid(bool showGrid)
Sets whether grid lines should be drawn in the table.
void setEnabled(bool enabled)
Controls whether the item will be drawn.
void setPageNameExpression(const QString &expression)
Sets the expression (or field name) used for calculating the page name.
Base class for frame items, which form a layout multiframe item.
void setUnitsPerSegment(double units)
Sets the number of scalebar units per segment.
A layout multiframe subclass for HTML content.
void setHidePageIfEmpty(bool hidePageIfEmpty)
Sets whether the page should be hidden (ie, not included in layout exports) if this frame is empty...
void setTitleAlignment(Qt::AlignmentFlag alignment)
Sets the alignment of the legend title.
Layer and style map theme.
bool frameEnabled() const
Returns true if the item includes a frame.
void setGridColor(const QColor &color)
Sets the color used for grid lines in the table.
QgsProject * project() const
The project associated with the layout.
void setText(const QString &text)
Sets the label's preset text.
void setItemOpacity(double opacity)
Sets the item's opacity.
void setShowEmptyRows(bool showEmpty)
Sets whether empty rows should be drawn.
QgsProperty property(int key) const override
Returns a matching property from the collection, if one exists.
void setCornerRadius(QgsLayoutMeasurement radius)
Sets the corner radius for rounded rectangle corners.
static QColor decodeColor(const QString &str)
Item representing the paper in a layout.
void setColor(const QColor &color)
Sets the color for the symbol.
void setLabelBarSpace(double space)
Sets the spacing (in millimeters) between labels and the scalebar.
QColor frameStrokeColor() const
Returns the frame's stroke color.